栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

目录
      • (一)构造(对象创建)
        • (1)单实例
        • (2)多实例
      • (二)初始化销毁的相关用法
        • (1)指定初始化和销毁方法
        • (2)通过让bean实现InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑)
        • (3)JSR250
        • (4)BeanPostProcessor: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指定初始化和销毁方法

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

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

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

通过initMethod和destroyMethod两个方法指定初始化和销毁方法

【结果】

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

(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——>容器创建——>销毁方法——>容器销毁

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/601738.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号