spring (学习记录)bean的生命周期

借鉴:https://www.cnblogs.com/ooooevan/p/5804269.html
在这里插入图片描述
下面看实验:
调用下面时,就创建了容器和对象

ApplicationContext ctx = new ClassPathXmlApplicationContext("cycle.xml");

那它又是怎样一步步创建的呢?要销毁怎么销毁?

用一个例子来看

package com.beans.cycle.Car;

public class Car {
    private String brand;
    
    public Car(){
        System.out.println("构造函数。。");
    }
    public String getBrand() {
        System.out.println("返回属性。。");
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
        System.out.println("设置属性。。");
    }
    public void init(){
        System.out.println("init()。。");
    }
    public void destroy(){
        System.out.println("destroy()。。");
    }
}

xml中用init-mehod、 destroy-method表示调用初始化函数和销毁函数

<bean id="car" class="com.beans.cycle.Car" init-method="init" destroy-method="destroy">
<property name="brand" value="Aodi"></property>
</bean>

运行主类

ClassPathXmlApplicationContext  ctx = new ClassPathXmlApplicationContext("cycle.xml");
Car car=(Car)ctx.getBean("car");
System.out.println(car);
//关闭IOC容器
ctx.close();

输出:

       构造函数。。//构造器
  设置属性。。//setter方法
  init()。。
  car[brand=Aodi] //返回这个bean
  destroy()。。//容器关闭时调用这个方法

先调用构造函数和设置属性,然后再init()。

创建Bean后置处理器

Bean后置处理器允许在调用初始化方法前后对Bean进
行额外的处理.

Bean后置处理器对I0C容器里的所有Bean实例逐一处
理,而非单一实例.其典型应用是:检查Bean属性的正确性咸根据特定的标准更改Bean的属性.
对Bean 后置处理器而言,需要实现BeanPostProcessor接口.在初始化方法被调用前后,Spring将把每个Bean实例分别传递给上述接口的以下两个方法:postProcessBeforeInitialization和postProcessAfterInitialization

bean后置处理器:检查bean属性的正确性或根据需要修改属性,要实现BeanPostProcessor接口

写一个实现类MyBeanPostProcessor

package com.beans.cycle.Car;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor {

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

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

xml

<bean id="car" class="com.beans.cycle.Car" init-method="init" destroy-method="destroy">
<property name="brand" value="Aodi"></property>
</bean>
<!--配置bean后置处理器,不需要配置id-->
<bean class="com.beans.cycle.Car"></bean>

跑一下,注意:一个再init之前调用,一个再init之后调用

构造函数。。
设置属性。。
postProcessBoforeInitialization: car[brand=Aodi], car 
init()。。
postProcessAfterInitialization: car[brand=Aodi], car
car[brand=Aodi]
destroy()。。

如何修改属性? 在接口函数中修改

package com.beans.cycle.Car;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;



public class MyBeanPostProcessor implements BeanPostProcessor {

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

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("postProcessAfterInitialization: "+bean +beanName);
        Car car = (Car) bean;   // 获取要修改的bean对象
        car.setBrand("Ford");   //修改属性
        return bean;
    }
}

注意:上面的bean是bean实例本身;beanName指IOC容器配置的bean的名字

这样,就成功修改了属性,输出:

构造函数。。
   设置属性。。
   postProcessBoforeInitialization:car[brand=Aodi], car 
   init()。。
   postProcessAfterInitialization: car[brand=Aodi], car
   
   car[brand=Ford]
   destroy()。。

还可以过滤,因为处理所有bean时,可能对某些进行操作

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

         if("car".equals(beanName)){
            //过滤的操作
    }
       return bean;
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值