Bean注入的三种方式
1:使用默认的构造函数
在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时采用的就是默认的构造函数常见bean对象,此时如果没有默认构造函数则对象无法创建。
<bean name="car" class="impl.Car"/>
2.使用普通工厂的方法创建对象(使用某个类中的方法创建对象,交给spring管理)
比如jar包中的class中某个方法创建了一个对象现在希望通过它来获得对象交给spring管理
public class BeanFactory2 {
public Car getCar(){
return new Car();
}
}
首先将该类交给Spring管理,之后通过beanName指定该类通过factory-method指定通过该类中getCar方法获得对象。
<bean name="factory" class="com.factory.BeanFactory2"></bean>
<bean name="factoryCar" factory-bean="factory" factory-method="getCar"></bean>
3.使用工厂中的静态方法创建对象
基于上面的工厂方法获得对象,在工厂类的方法是static修饰的静态方法的时候可以直接通过如下配置加载。
<bean name="factoryCar" class="com.factory.BeanFactory2" factory-method="getCar"></bean>
Bean的作用域
在Spring容器中一共提供了五种作用域类型,在配置文件中通过属性scope来设置bean的作用域范围。
1.默认 singleton:单例
<bean name="car" class="impl.Car" scope="singleton"/>
在对scope没有设置的时候bean默认就是单例的,多次获取同一个id都是一个bean的实例。
//此时容器初始化完毕后可以取里面的bean了.
Car car1 = (Car)bf.getBean("car");
Car car2 = (Car)bf.getBean("car");
System.out.println(car1 == car2);
执行结果:
小汽车被加载了
true
2. prototype:多例
xml <bean name="car" class="impl.Car" scope="prototype"/>
每次通过id获取bean的时候IOC都会创建一个新的作用域。
同样执行执行上面的代码
执行结果:
小汽车被加载了
小汽车被加载了
false
###以下三种针对web项目
在使用Spring的WebApplicationContext时,可以使用的作用域。
###3.request:HTTP请求
<bean name="car" class="impl.Car" scope="request"/>
request针对每次Http请求,Spring都会针对相关的bean来创建一个新的实例。而bean只在当前request请求中有效
4.session
<bean name="car" class="impl.Car" scope="session "/>
针对http session起作用,Spring容器会根据该Bean的定义来创建一个全新的Bean的实例。而且该Bean只在当前http session内是有效的。
Session中所有http请求共享同一个请求的bean实例。Session结束后就销毁bean。
5.global session:
<bean name="car" class="impl.Car" scope="globalSession"/>
类似标准的http session作用域,不过仅仅在基于portlet的web应用当中才有意义。Portlet规范定义了全局的Session的概念。他被所有构成某个portlet外部应用中的各种不同的portlet所共享。在global session作用域中所定义的bean被限定于全局的portlet session的生命周期范围之内。
Bean的生命周期
bean对象的生命周期分为创建、生存、死亡
单例:
<bean name="car" class="com.pojo.Car" init-method="init" destroy-method="destroy"></bean>
为bean配置加入init-method 属性和destroy-method属性,分别在对象加载和容器销毁时执行该类中的init方法和destroy方法。
ClassPathXmlApplicationContext ap = new ClassPathXmlApplicationContext("applicationContext.xml");
ap.getBean("car");
//手动关闭容器
ap.close();
执行结果:
加载小汽车
执行对象初始化方法
六月 08, 2019 10:41:25 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
执行对象销毁方法
多例:
<bean name="car" class="com.pojo.Car" init-method="init" destroy-method="destroy" scope="prototype"></bean>
执行结果:
加载小汽车
执行对象初始化方法
可见调用close并没有调用destroy方法,这就是与单例模式的区别,多例模式bean的生命周期交给了JVM管理。
总结:
单例对象
出生:容器创建时对象加载
存活:容器还在对象就一直存在
死亡:对象的声明周期和容器相同
多例对象
出生:当使用对象时由bean工厂创建
存活:对象在使用过程中就一直存活
死亡:交给JVM管理对象生命周期