Spring 的 bean作用域 和生命周期

发布时间 2024-01-11 22:46:01作者: 弯弓射雕的男人

bean的作用域

在Spring中可以通过配置bean标签的scope属性来指定bean的作用域范围

单实例 scope="singleton" 初始化的时候创建
多实例 scope="prototype" 获取bean的时候创建
<bean id="orders" class="com.atguigu.spring6.iocxml.scope.Orders"
          scope="singleton"></bean>

主意 scope 默认值是单实例  scope="singleton"

  public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean-scope.xml");
        Orders orders = context.getBean("orders", Orders.class);
        System.out.println(orders);
        Orders orders1 = context.getBean("orders", Orders.class);
        System.out.println(orders1);
    }

如果是单实例 输出2 次结果是一样的  

如果是多实例 输出结果不一样

 

bean生命周期

  • bean对象创建(调用无参构造器)

  • 给bean对象设置属性

  • bean的后置处理器(初始化之前)

  • bean对象初始化(需在配置bean时指定初始化方法)

  • bean的后置处理器(初始化之后)

  • bean对象就绪可以使用

  • bean对象销毁(需在配置bean时指定销毁方法)

  • IOC容器关闭

 在User中

 bean对象创建,调用无参数构造.

用set方法给bean对象设置属性值
 在测试中 完成初始化

对象可以使用了

对象销毁


public class User {

    //无参数构造
    public User() {
        System.out.println("1 bean对象创建,调用无参数构造");
    }


    //初始化的方法
    public void initMethod() {
        System.out.println("4 bean对象初始化,调用指定的初始化的方法");
    }

    //销毁的方法
    public void destroyMethod() {
        System.out.println("7 bean对象销毁,调用指定的销毁的方法");
    }


    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("2 给bean对象设置属性值");
        this.name = name;
    }

public class TestUser {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("bean-life.xml");
        User user = context.getBean("user", User.class);
        System.out.println("6 bean对象创建完成了,可以使用了");
        System.out.println(user);
        context.close(); //销毁
    }
}

可以发现 

3 bean后置处理器,初始化之前执行
5 bean后置处理器,初始化之后执行
不见了
    @Override
    public Object postProcessBeforeInitialization(Object bean,
                                                  String beanName) throws BeansException {
        System.out.println("3 bean后置处理器,初始化之前执行");
        System.out.println(beanName+"::"+bean);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean,
                                                 String beanName) throws BeansException {
        System.out.println("5 bean后置处理器,初始化之后执行");
        System.out.println(beanName+"::"+bean);
        return bean;
    }
1  <!-- bean的后置处理器要放入IOC容器才能生效 -->
2     <bean id="myBeanPost" class="com.atguigu.spring6.iocxml.life.MyBeanPost"/>