a. 在 spring 的 ioc 容器,可以配置 bean 的后置处理器
b. 该处理器/对象会在 bean 初始化方法调用前和初始化方法调用后被调用
c. 可以在后置处理器中编写自己的代码
1.首先还是创建一个类
package com.jhdo.spring.bean;
public class Man {
private String name;
public Man() {
}
public Man(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Man{" +
"name='" + name + '\'' +
'}';
}
public void init(){
}
public void desty(){
}
}
2.在创建一个类
package com.jhdo.spring.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class ManG implements BeanPostProcessor {
/**
* 在 bean 初始化之后完成某些任务
* @param bean : 就是 ioc 容器返回的 bean 对象, 如果这里被替换会修改,则返
回的 bean 对象也会被修改
* @param beanName: 就是 ioc 容器配置的 bean 的名称
* @return Object: 就是返回的 bean 对象
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("bean="+bean+"beanName="+beanName);
/**因为这个在配置文件中全部都会应用所以要
*加一个判断是否是这个类型的判断的运行类型用instanceof
*/
if (bean instanceof Man){
((Man)bean).setName("帅哥");
}
return null;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return null;
}
}
3.创建一个配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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.xsd">
<bean class="com.jhdo.spring.bean.Man" id="man01"
init-method="init" destroy-method="desty"
>
<property name="name" value="大帅哥"/>
</bean>
<bean class="com.jhdo.spring.bean.Man" id="man02"
init-method="init" destroy-method="desty"
>
<property name="name" value="小帅哥"/>
</bean>
<!-- bean的后置处理器-->
<bean class="com.jhdo.spring.bean.ManG" id="g"/>
</beans>
4.测试
@Test
public void susu(){
ApplicationContext
ioc = new ClassPathXmlApplicationContext("mans.xml");
Man man01 = ioc.getBean("man01", Man.class);
System.out.println(man01);
}
下面是测试输出先输出的前两个是后置那个类还没改第一个name的结果 第三个是测试类里输出后置类改过的
其它说明
1、怎么执行到这个方法?=> 使用 AOP(反射+动态代理+IO+容器+注解)
2、有什么用?=> 可以对 IOC 容器中所有的对象进行统一处理 ,比如 日志处理/权限的校 验/安全的验证/事务管理. -初步体验案例: 如果类型是 Man 的统一改成 帅哥
3、针对容器的所有对象吗? 是的=>切面编程特点
4、后面我们会自己实现这个底层机制,这个是一个比较难理解的知识点, 不做过多的纠结,后面我会实现这个机制
标签:name,后置,Object,bean,String,Bean,处理器,public,Man From: https://blog.csdn.net/m0_67442133/article/details/145161969