Spring 讲解(二 )

一、Spring 容器加载的3种方式java

public class ServiceTest {
        public static void main(String[] args) {
            //Spring容器加载有3种方式

            //第一种:ClassPathXmlApplicationContext ClassPath类路径加载,指的就是classes路径
            //第一种:最经常使用,spring的配置文件路径之后就直接放在src
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

            //第二种方式:文件系统路径得到配置文件【绝对路径】
            //ApplicationContext context = new FileSystemXmlApplicationContext("C:\\Users\\Desktop\\IDEAWorkspace\\spring-01\\src\\com\\rookie\\beans.xml");

            //第三种方式:使用BeanFactory(了解)
            //String path = "C:\\Users\\Desktop\\IDEAWorkspace\\spring-01\\src\\com\\rookie\\beans.xml";
            //BeanFactory factory = new XmlBeanFactory(new FileSystemResource(path));
            //IUserService user = (IUserService) factory.getBean("userService");
            //user.add();

            IUserService user = (IUserService) context.getBean("userService");
            user.add();
        }
    }

Spring内部建立对象的原理spring

a.解析xml文件,获取类名,id,属性等。

b.经过反射,用类型建立对象。 session

c.给建立的对象赋值。ide

二、BeanFactory 和 ApplicationContext对比函数

BeanFactory 采起延迟加载,第一次 getBean 时才会初始化 Bean。

ApplicationContext 是即时加载,对 BeanFactory 扩展,提供了更多功能。测试

  • 案例演示(在第一次的代码基础上)this

    public class UserServiceImpl implements UserService {
    
        private String name;
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public void add() {
            System.out.println("建立用户...." + name);
        }
    
        public UserServiceImpl(){
            System.out.println("UserServiceImpl() 调用了");
        }
    }
    public class ServiceTest {
    
        public static void main(String[] args) {
            //1.加载beans.xml 这个spring的配置文件,内部就会建立对象
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        }
    }
    控制台打印日志:UserServiceImpl( ) 调用了
    public class ServiceTest {
    
        public static void main(String[] args) {
            String path = "C:\\Users\\Desktop\\IDEAWorkspace\\spring-01\\src\\com\\rookie\\beans.xml";
    BeanFactory factory = new XmlBeanFactory(new FileSystemResource(path));
            
            // 要使调用空参构造能够放开这段代码便可
            // IUserService user = (IUserService) factory.getBean("userService");
        }
    }
    控制台没有打印日志,说明空参构造没有被调用。

    放开上面注释的代码,便可调用空参构造,控制台打印日志:UserServiceImpl( ) 调用了。spa

二、Spring 容器装配 bean 的 3 种方式prototype

所谓的装配bean就是在xml写一个bean标签。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--装配bean的三种方式,所谓的装配bean就是在xml写一个bean标签-->
    
    <!-- 第一种方式: new 实现类-->
    <bean id="userService1" class="com.example.demo.service.impl.UserServiceImpl">
        <property name="name" value="zhangsan"></property>
    </bean>

    <!-- 第二种方式:经过静态工厂方法 -->
    <bean id="userService2" class="com.example.demo.service.UserServiceFactory" factory-method="createUserService"/>

    <!--第三种方式:经过实例工厂方法 -->
    <bean id="factory2" class="com.example.demo.service.UserServiceFactory2"/>
    <bean id="userService3" factory-bean="factory2" factory-method="createUserService"/>
</beans>
测试上面哪一种 bean 装配方式,须要注释掉其余 bean装配方式。

第一种上次已经讲过,如今只讲第2、三种案例。日志

public class UserServiceFactory {
    public static UserService createUserService() {
        return new UserServiceImpl();
    }
}

=========================================================================================
public class UserServiceFactory2 {
    public UserService createUserService() {
        return new UserServiceImpl();
    }
}
执行测试函数
public class ServiceTest {

    public static void main(String[] args) {

        //new 对象
        ApplicationContext context1 = new ClassPathXmlApplicationContext("beans.xml");
        UserService userService1 = (UserService) context1.getBean("userService1");
        userService1.add();


        //静态工厂
        ApplicationContext context2 = new ClassPathXmlApplicationContext("beans.xml");
        UserService userService2 = (UserService) context2.getBean("userService2");
        userService2.add();


        //实例工厂
        ApplicationContext context3 = new ClassPathXmlApplicationContext("beans.xml");
        UserService userService3 = (UserService) context3.getBean("userService3");
        userService3.add();

    }
}
感兴趣的能够本身看执行结果。三种结果都证实 bean 被 Spring 容器管理实例化了。

三、bean的做用域(掌握 singleton、prototype)

类别 说明
singleton 在Spring IoC容器中仅存在一个Bean实例,Bean以单例方式存在,默认值
prototype 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,至关于执行new XxxBean()
request 每次HTTP请求都会建立一个新的Bean,该做用域仅适用于WebApplicationContext环境
session 同一个HTTP Session 共享一个Bean,不一样Session使用不一样Bean,仅适用于WebApplicationContext 环境
globalSession 通常用于Portlet应用环境,该做用域仅适用于WebApplicationContext 环境
案例代码演示
bean.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userService1" class="com.example.demo.service.impl.UserServiceImpl" scope="prototype">
    </bean>
</beans>
public class ServiceTest {

    public static void main(String[] args) {
       
        ApplicationContext context1 = new ClassPathXmlApplicationContext("beans.xml");
        UserService userService1 = (UserService) context1.getBean("userService1");
        UserService userService2 = (UserService) context1.getBean("userService1");
        System.out.println(userService1);
        System.out.println(userService2);
    }
}

控制台信息以下:

com.example.demo.service.impl.UserServiceImpl@2a556333
com.example.demo.service.impl.UserServiceImpl@7d70d1b1

若是去掉 bean.xml 文件的 scope="prototype",打印信息以下:

com.example.demo.service.impl.UserServiceImpl@7a187f14
com.example.demo.service.impl.UserServiceImpl@7a187f14

因此Spring IoC容器Bean以单例方式默认存在!!配置的话根据本身须要配置单例或者多例

相关文章
相关标签/搜索