一个标记,标记在spring容器初始化时需要获取上下文中当前的一些运行环境;
/**
*********************************************************
** @desc : BeanFactoryPostProcessor示例
** BeanFactory扩展点,BeanFactory的后处理器。Bean已经注册,还没有创建,一般在这里修改Bean的属性
** @author Pings
** @date 2020/7/25
** @version v1.0
* *******************************************************
*/
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
//**获取user的BeanDefinition
BeanDefinition beanDefinition = beanFactory.getBeanDefinition("user");
//**获取user的属性
MutablePropertyValues pv = beanDefinition.getPropertyValues();
//**修改user的age属性
pv.addPropertyValue("age", 88);
//**设置为单例
beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
}
}
/**
*********************************************************
** @desc : BeanDefinitionRegistryPostProcessor示例
** Bean注册处理器,BeanFactoryPostProcessor子接口。Bean已经注册,还没有创建,一般在这里注册的bean
** @author Pings
** @date 2020/7/25
** @version v1.0
* *******************************************************
*/
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
//**注册MyClass对象
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
//**创建一个Bean
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(MyClass.class);
//**设置班级名称
builder.addPropertyValue("name", "118班");
//**设置可通过@Autowire注解引用
builder.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME);
//**注册到BeanDefinitionRegistry
registry.registerBeanDefinition("myClass", builder.getBeanDefinition());
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
//**与BeanFactoryPostProcessor相同
}
}
/**
*********************************************************
** @desc : BeanPostProcessor示例
** Bean初始化处理器,包括前置处理器和后置处理器,在bean初始化前后定义处理逻辑,这时Bean已经创建
** @author Pings
** @date 2020/7/27
** @version v1.0
* *******************************************************
*/
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
//**初始化前置处理器,调用User的setName方法,修改User的name属性
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if(beanName.equals("user")) {
System.out.println("初始化User前...");
User entity = (User) bean;
entity.setName("pings");
}
return bean;
}
//**初始化后置处理器
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(beanName.equals("user")) System.out.println("初始化User后...");
return bean;
}
}
/**
*********************************************************
** @desc : InstantiationAwareBeanPostProcessor示例
** 实例化处理器,BeanPostProcessor初始化处理器的子接口,会在BeanPostProcessor之前调用
** 包括前置处理器和后置处理器,在bean实例化前后定义处理逻辑
** 前置处理时,已经注册,还未创建;后置处理时,已经创建
** @author Pings
** @date 2020/7/28
** @version v1.0
* *******************************************************
*/
@Component
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
/**
* 实例化前置处理器,返回指定类的实例化对象,可在此处修改指定类在spring容器中的实例化对象
* 返回值为null则创建指定类的默认实例
* 返回值不为null则把返回值当做指定类的实例:
* 1.跳过postProcessAfterInstantiation(实例化后置处理器)
* 2.跳过postProcessBeforeInitialization(初始化前置处理器)
* 3.执行postProcessAfterInitialization(初始化后置处理器)
*/
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
//**用Subject1的子类Subject2的实例替换Subject1的实例
if(beanClass.equals(Subject1.class)) {
System.out.println("实例化Subject1前...");
return new Subject2();
}
return null;
}
//**实例化后置处理器
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
return true;
}
/**
* 修改对象属性值,这时属性值还未设置到对象中
* 在postProcessAfterInstantiation()后调用,postProcessAfterInstantiation如果返回false,则会跳过此方法
*/
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
return pvs;
}
}
//**SmartInstantiationAwareBeanPostProcessor示例,InstantiationAwareBeanPostProcessor实例化处理器的子接口
public interface SmartInstantiationAwareBeanPostProcessor {
//**预测bean类型
default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
//**选择合适的构造器
default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
//**获取提前暴露的bean引用,用来支持单例对象的循环引用
default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
return bean;
}
}
//**合并BeanDefinition后置处理器,BeanPostProcessor初始化处理器的子接口
public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {
//**bean实例化后调用,可修改merged BeanDefinition的属性或者缓存元数据
void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);
//**重置bean定义后的通知,此处应清除Bean的元数据
default void resetBeanDefinition(String beanName) {
}
}
public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {
//**对象销毁处理
void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;
//**是否处理对象销毁
default boolean requiresDestruction(Object bean) {
return true;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/193526.html原文链接:https://javaforall.cn