【String注解驱动开发】针对bean的生命周期,我们究竟能做哪些工作?

简介: 在前面的文章中,我们讲述了BeanPostProcessor的postProcessBeforeInitialization()方法在bean的初始化之前调用,而postProcessAfterInitialization()方法在bean初始化之后调用,我们可以自定义类来实现BeanPostProcessor接口,并在postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法中指定我们自定义的逻辑。至此,我们对bean的整个生命周期进行了简单的阐述,那么问题来了,针对bean的

bean的初始化和销毁

我们知道BeanPostProcessor的postProcessBeforeInitialization()方法在bean的初始化之前调用;而postProcessAfterInitialization()方法在bean初始化的之后调用。而bean的初始化和销毁方法我们可以通过如下方式进行指定。

1.通过@Bean指定init-method和destroy-method

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

2.通过让Bean实现InitializingBean(定义初始化逻辑)

@Component
public class Cat implements InitializingBean,DisposableBean {
    public Cat(){
        System.out.println("cat constructor...");
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("cat...destroy...");
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("cat...afterPropertiesSet...");
    }
}

3.可以使用JSR250

  • @PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法。
  • @PreDestroy:在容器销毁bean之前通知我们进行清理工作。
@Component
public class Dog implements ApplicationContextAware {
    //@Autowired
    private ApplicationContext applicationContext;
    public Dog(){
        System.out.println("dog constructor...");
    }
    //对象创建并赋值之后调用
    @PostConstruct
    public void init(){
        System.out.println("Dog....@PostConstruct...");
    }
    //容器移除对象之前
    @PreDestroy
    public void detory(){
        System.out.println("Dog....@PreDestroy...");
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

4.可以使用BeanPostProcessor

/**
 * 后置处理器:初始化前后进行处理工作
 * 将后置处理器加入到容器中
 * 在bean初始化前后进行一些处理工作;
 * postProcessBeforeInitialization:在初始化之前工作
 * postProcessAfterInitialization:在初始化之后工作
 */
@Component
public class MyBeanPostProcessor implements BeanPostProcessor,Ordered {
    @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 {
        // TODO Auto-generated method stub
        System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean);
        return bean;
    }
    @Override
    public int getOrder() {
        return 3;
    }
}

通过这几种方式,我们就可以对bean的整个生命周期进行控制:

  • 从bean的实例化:调用bean的构造方法,我们可以在bean的无参构造方法中执行相应的逻辑。
  • bean的初始化:在初始化时,可以通过BeanPostProcessor的postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法进行拦截,执行自定义的逻辑;通过@PostConstruct注解、InitializingBean和init-method来指定bean初始化前后执行的方法,执行自定义的逻辑。
  • bean的销毁:可以通过@PreDestroy注解、DisposableBean和destroy-method来指定bean在销毁前执行的方法,指执行自定义的逻辑。

所以,通过上述方式,我们可以控制Spring中bean的整个生命周期。

相关文章
|
30天前
|
Java 索引
Java String应用与开发
Java String应用与开发
24 0
|
30天前
|
SQL JavaScript
js开发:请解释什么是ES6的模板字符串(template string),并给出一个示例。
ES6的模板字符串以反引号包围,支持变量和表达式插入以及多行书写。例如,插入变量值`Hello, ${name}!`,计算表达式`${num1 + num2}`,以及创建多行字符串。模板字符串保留原始空格和缩进,简化了字符串拼接,提高了代码可读性。
21 6
|
9月前
|
Python
10 个 Python String 字符串的常用技巧,大大地提升我们的开发效率,终于有时间陪女朋友了
10 个 Python String 字符串的常用技巧,大大地提升我们的开发效率,终于有时间陪女朋友了
|
10月前
|
安全 Java 编译器
Java中的String实例化、Annotation注解类、继承的多态和Object类(附带相关面试题)
1.java中String两种实例化对象2.Annotation注解类 3.继承的多态 4.Object类
90 0
Java中的String实例化、Annotation注解类、继承的多态和Object类(附带相关面试题)
|
存储 安全 Java
Java开发——16.常用类(Scanner、Object、String、StringBuffer、StringBuilder)
Scanner:一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。
Java开发——16.常用类(Scanner、Object、String、StringBuffer、StringBuilder)
|
存储 算法 安全
【Java原理探索】带你实战使用String的功能特性 | Java开发实战
【Java原理探索】带你实战使用String的功能特性 | Java开发实战
115 0
【Java原理探索】带你实战使用String的功能特性 | Java开发实战
|
缓存 NoSQL Java
【Java原理探索】带你攻克String类创建的难点分析 | Java开发实战
【Java原理探索】带你攻克String类创建的难点分析 | Java开发实战
108 0
【Java原理探索】带你攻克String类创建的难点分析 | Java开发实战
|
存储 缓存 安全
【Java原理探索】带你探究String类不可变的特性 | Java开发实战
【Java原理探索】带你探究String类不可变的特性 | Java开发实战
153 0
【Java原理探索】带你探究String类不可变的特性 | Java开发实战
|
缓存 Java Android开发
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
272 0
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
|
Android开发
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片(三)
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片(三)
115 0
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片(三)