关于Bean的那些事:FactoryBean、作用域及生命周期
1. FactoryBean
1. 基本介绍
- Spring有两种类型的bean
- 普通bean:在配置文件中定义bean类型就是返回类型
- 工厂bean(FactoryBean):在配置文件中定义bean类型可以和返回类型不一样
2. 实现方法
-
创建类,让这个类作为工厂bean,实现接口FactoryBean
-
实现接口里的方法,在实现的方法中定义返回的bean类型
public class MyBean implements FactoryBean<Course> { @Override public Course getObject() throws Exception { Course course = new Course(); course.setCname("qwe"); return course; } @Override public Class<?> getObjectType() { return null; } @Override public boolean isSingleton() { return false; } } // test @Test public void testMyBean(){ ApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); Course course = context.getBean("myBean", Course.class); System.out.println(course.cname); }
<bean id="myBean" class="com.zyy.spring_demo.factoryBean.MyBean"> </bean>
2. bean作用域
- 在spring里,默认情况下,bean是单实例对象
1. 设置bean作用域
- 在spring配置文件中bean标签里面有属性(scope)用于设置作用域
- scope属性值
- singleton:默认值,单实例对象。加毂spring配置文件时候就会创建单实例对象。
- prototype:多实例对象。在调用getBean方法时创建多实例对象
3. bean的生命周期
1. 基本介绍
-
生命周期:从对象创建到销毁的过程
-
bean的生命周期
-
通过构造器创建bean实例(无参数构造)
-
为bean的属性设置值和其他bean引用(调用set方法)
-
调用bean的初始化的方法(需要进行配置初始化的方法)
-
bean可以使用了(获取到了对象)
-
当容器关闭的时候,调用bean的销毁的方法(需要配置销毁的方法)
-
-
具有后置处理器的bean的生命周期
- 其生命周期有七步
-
通过构造器创建bean实例(无参数构造)
-
为bean的属性设置值和其他bean引用(调用set方法)
-
把bean实例传递bean后置处理器的方法:postProcessBeforeInitialization()
-
调用bean的初始化的方法(需要进行配置初始化的方法)
-
把bean实例传递给bean后置处理器的方法:postProcessAfterInitialization
-
bean可以使用了(获取到了对象)
-
当容器关闭的时候,调用bean的销毁的方法(需要配置销毁的方法)
2. bean的演示
// order
public class Order {
public Order() {
System.out.println("第一步,无参构造创建");
}
private String oname;
public void setOname(String oname) {
this.oname = oname;
System.out.println("第二步 调用set 设置属性值");
}
public void initMethod(){
System.out.println("第三步 初始化");
}
public void destroyMethod(){
System.out.println("第五步 销毁bean");
}
}
// test demo
@Test
public void testOrder(){
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("application.xml");
Order order = context.getBean("order", Order.class);
System.out.println("第四步 得到bean对象");
System.out.println(order);
context.close();
}
// 具有后置处理器的mybeanpost类
public class MyBeanPost implements BeanPostProcessor{
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化之前执行的方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化之后执行的方法");
return bean;
}
}
<!--spring配置文件相关配置-->
<bean id="order" class="com.zyy.spring_demo.Order" init-method="initMethod" destroy-method="destroyMethod">
<property name="oname" value="852"></property>
</bean>
<!--具有后置处理器的配置-->
<bean id="order" class="com.zyy.spring_demo.Order" init-method="initMethod" destroy-method="destroyMethod">
<property name="oname" value="852"></property>
</bean>
<bean id="myBeanPost" class="com.zyy.spring_demo.MyBeanPost"></bean>