Spring学习(二)—— bean的生命周期

为了更深刻的了解对象创建、初始化,本文结合相关案例描述 ,不赘述种种流程图之类,直接上手实操

话糙理不糙~~跟着敲一遍,效果更好!


【大致流程 】

  • 对象创建
  • 初始化
  • 销毁

容器管理bean的生命周期,我们可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法

(一)构造(对象创建)

(1)单实例

在容器启动的时候创建对象

car.java

public class Car {

    public Car(){
        System.out.println("car constructor......");
    }

    public void init(){
        System.out.println("car...init...");
    }

    public void destory(){
        System.out.println("car...destory...");
    }

}

配置类 MainConfigOfLifeCycle.java 默认是单例模式

@ComponentScan("com.example.study.bean")
@Configuration
public class MainConfigOfLifeCycle {

    @Bean()
    public Car car(){
        return new Car();
    }
}

测试IOCTest_LifeCycle.java

public class IOCTest_LifeCycle {

    @Test
    public void test01(){
        //1.创建ioc容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
        System.out.println("容器创建完成");
        applicationContext.getBean("car");
//        applicationContext.close();
    }
}

结果,容器启动前就已经创建对象了

(2)多实例

每次获取的时候创建对象

更改配置类,通过添加@Scope("prototype")注解创建多实例对象

@ComponentScan("com.example.study.bean")
@Configuration
public class MainConfigOfLifeCycle {

    @Scope("prototype")
    @Bean()
    public Car car(){
        return new Car();
    }
}

结果

等到使用的时候才创建对象,与单实例不一样


(二)初始化\销毁的相关用法

  • 初始化:对象创建完成,并赋值好,调用初始化方法。。。

  • 销毁

      单实例:容器关闭的时候销毁
      多实例:容器不会管理这个bean,容器不会调用销毁方法;(手动调用销毁方法)
    
(1)指定初始化和销毁方法

通过@Bean指定初始化和销毁方法

配置类改成如下,其中initdestory分别对应Car.java中的方法

@ComponentScan("com.example.study.bean")
@Configuration
public class MainConfigOfLifeCycle {

    @Bean(initMethod = "init",destroyMethod = "destory")
    public Car car(){
        return new Car();
    }
}

通过initMethoddestroyMethod两个方法指定初始化销毁方法

【结果】

对象创建完成调用初始化方法

(2)通过让bean实现InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑)

Cat.java

@Component
public class Cat implements InitializingBean, DisposableBean {

    public Cat(){
        System.out.println("cat constructor......");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("cat....destory...");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("cat...afterPropertiesSet");
    }
}

【结果】

(3)JSR250

@PostConstruct:在bean创建完成并且属性赋值完成来执行初始化方法
@PreDestroy:在容器销毁bean之前通知我们进行清理操作

【举例】

Dog.java

@Component
public class Dog {

    public Dog(){
        System.out.println("对象创建......Dog Constructor...");
    }

    /**
     * 对象创建并赋值之后调用
     */
    @PostConstruct
    public void init(){
        System.out.println("对象创建并赋值之后调用初始化方法...dog......@PostConstruct...");
    }

    /**
     * 容器移除对象之前调用
     */
    @PreDestroy
    public void destory(){
        System.out.println("容器移除对象之前调用...dog......@PreDestroy...");
    }
}

配置类 MainConfigOfLifeCycle.java

@ComponentScan("com.example.study.bean")
public class MainConfigOfLifeCycle {
}

测试类IOCTest_LifeCycle .class

public class IOCTest_LifeCycle {

    @Test
    public void test01(){
        //1.根据配置类创建ioc容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
        System.out.println("容器创建完成");
        //2.关闭容器
        applicationContext.close();
    }
}

【结果】

执行步骤:对象创建——> 初始化方法——>容器创建——>销毁方法——>容器销毁

(4)BeanPostProcessor:Bean的后置处理器

在bean初始化前后进行一些处理工作
postProcessBeforeInitialization:在初始化之前工作
postProcessAfterInitialization:在初始化之后工作

【举例】

在上述举例基础上增加一个BeanPostProcessor的实现类MyBeanPostProcessor.java

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization..." + beanName + "=>" + bean);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization..." + beanName + "=>" + bean);
        return bean;
    }
}

【结果】

执行步骤

对象创建——>postProcessBeforeInitialization——> 初始化方法——>postProcessAfterInitialization——>容器创建——>销毁方法——>容器销毁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值