可以简述为以下几步
1实例化bean对象(通过构造方法或者工厂方法)
2设置对象属性(setter等)(依赖注入)
3如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)
4如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
5将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
6调用Bean的初始化方法
7将Bean实例传递给Bean的后置处理器的8postProcessAfterInitialization(Object bean, String beanname)方法使用Bean
9容器关闭之前,调用Bean的销毁方法
代码演示
实体类
package com.zdw.Bean;
public class Car {
private String brand;
private int price;
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
'}';
}
public Car() {
System.out.println("1--car这个bean初始化");
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
System.out.println("2--设置对象属性setName");
this.brand = brand;
}
public int getPrice() {
return price;
}
public void init(){
System.out.println("3--car bean的初始化");
}
public void destory(){
System.out.println("5--car bean的 销毁");
}
public void setPrice(int price) {
this.price = price;
}
public void play(){
System.out.println("4bean的使用");
}
}
bean的后置处理器,分别在Bean的初始化前后对Bean对象提供自己的实例化逻辑
- 实现BeanPostProcessor接口
- postProcessBeforeInitialization方法
- postProcessAfterInitialization方法
package com.zdw.entity;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
//对初始化之后的Bean进行处理
//参数:bean:即将初始化的bean
//参数:beanname:bean的名称
//返回值:返回给用户的那个bean,可以修改bean也可以返回一个新的bean
public Object postProcessBeforeInitialization(Object bean, String beanname) throws BeansException {
System.out.println("postProcessBeforeInitialization"+"----此时我的名字:"+bean);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanname) throws BeansException {
com.zdw.Bean.Car car =null;
System.out.println("对初始化之后的Bean进行处理,将Bean的成员变量的值修改了");
System.out.println(" postProcessAfterInitialization");
if("car".equals(beanname) || bean instanceof Car){
car= (com.zdw.Bean.Car) bean;
car.setBrand("Porsche");
}
return car;
}
}
xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc ">
<context:component-scan base-package="com.zdw.Bean"/>
<bean id="car" class="com.zdw.Bean.Car" init-method="init" destroy-method="destory">
<property name="brand" value="宝马"/>
<property name="price" value="999999"/>
</bean>
<bean class="com.zdw.entity.MyBeanPostProcessor"></bean>
</beans>
测试
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext ac= new ClassPathXmlApplicationContext("life.xml");
Car car =ac.getBean("car",Car.class);
car.play();
System.out.println(car.toString());
ac.close();
}
}
image.png
参考文章:https://blog.csdn.net/w_linux/article/details/80086950
完整代码:https://gitee.com/zdwbmw/itcatguigu_spring
https://www.bilibili.com/video/av50225455/?p=85
网友评论