关于Bean的那些事:FactoryBean、作用域及生命周期

1. FactoryBean

1. 基本介绍

  • Spring有两种类型的bean
    • 普通bean:在配置文件中定义bean类型就是返回类型
    • 工厂bean(FactoryBean):在配置文件中定义bean类型可以和返回类型不一样

2. 实现方法

  1. 创建类,让这个类作为工厂bean,实现接口FactoryBean

  2. 实现接口里的方法,在实现的方法中定义返回的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的生命周期

    1. 通过构造器创建bean实例(无参数构造)

    2. 为bean的属性设置值和其他bean引用(调用set方法)

    3. 调用bean的初始化的方法(需要进行配置初始化的方法)

    4. bean可以使用了(获取到了对象)

    5. 当容器关闭的时候,调用bean的销毁的方法(需要配置销毁的方法)

  • 具有后置处理器的bean的生命周期

    • 其生命周期有七步
    1. 通过构造器创建bean实例(无参数构造)

    2. 为bean的属性设置值和其他bean引用(调用set方法)

    3. 把bean实例传递bean后置处理器的方法:postProcessBeforeInitialization()

    4. 调用bean的初始化的方法(需要进行配置初始化的方法)

    5. 把bean实例传递给bean后置处理器的方法:postProcessAfterInitialization

    6. bean可以使用了(获取到了对象)

    7. 当容器关闭的时候,调用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>


posted @ 2021-10-31 19:51  HandsomeToDeath  阅读(130)  评论(0)    收藏  举报