大家好,又见面了,我是你们的朋友全栈君。
1.spring bean生命周期
2.Aware接口
2.1.作用
一个标记,标记在spring容器初始化时需要获取上下文中当前的一些运行环境;
2.2.常用接口
- ApplicationContextAware:获取ApplicationContext spring上下文;
- ApplicationEventPublisherAware:获取ApplicationEventPublisher事件发布器;
- BeanClassLoaderAware:获取当前的ClassLoader类加载器;
- BeanFactoryAware:获取BeanFactory bean工厂;
- BeanNameAware:获取bean的名称;
- EnvironmentAware:获取Environment当前环境变量;
- ImportAware:获取AnnotationMetadata注解元数据,需要与@Import注解配合使用,感觉功能与ImportSelector接口类似;
- NotificationPublisherAware:获取NotificationPublisherJMX通知发布器;
- ServletContextAware:获取ServletContext servlet上下文;
3.IOC扩展点
- 作用:允许在spring对bean进行声明、注册 、实例化(Instantiation)、初始化(Initialization)和销毁的各个阶段,添加自定义的处理逻辑;
3.1.BeanFactoryPostProcessor接口
- BeanFactory处理器。这时Bean已经注册,但还未创建,一般在这里修改Bean的属性;
/**
*********************************************************
** @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);
}
}
3.2.BeanDefinitionRegistryPostProcessor接口
- BeanFactory处理器的子接口,会在BeanFactoryPostProcessor之前调用。这时所有BeanDefinition已经被加载;一般在这里注册Spirng无法自动注册的bean,比如第三方的bean;
/**
*********************************************************
** @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相同
}
}
3.3.BeanPostProcessor接口
- Bean初始化处理器,包括前置处理器和后置处理器,在bean初始化前后定义处理逻辑,这时Bean已经创建;
/**
*********************************************************
** @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;
}
}
3.4.InstantiationAwareBeanPostProcessor接口
- 实例化处理器,BeanPostProcessor初始化处理器的子接口,会在BeanPostProcessor之前调用。包括前置处理器和后置处理器,在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;
}
}
3.5.SmartInstantiationAwareBeanPostProcessor接口
- 智能实例化处理器,InstantiationAwareBeanPostProcessor实例化处理器的子接口;
//**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;
}
}
3.6.MergedBeanDefinitionPostProcessor接口
- 合并Bean定义后置处理器,BeanPostProcessor初始化处理器的子接口;
//**合并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) {
}
}
3.7.DestructionAwareBeanPostProcessor接口
- 对象销毁处理器,BeanPostProcessor初始化处理器的子接口;
public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {
//**对象销毁处理
void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;
//**是否处理对象销毁
default boolean requiresDestruction(Object bean) {
return true;
}
}
4.bean初始化/销毁
4.1.作用
- 在某个bean初始化/销毁时添加自定义的处理逻辑;
4.2.方法
- 接口:InitializingBean/DisposableBean接口定义初始化/销毁的方法;
- 配置:init-method/destroy-method属性定义初始化/销毁的方法;
- 注解:@PostConstruct/@PreDestroy定义初始化/销毁的方法;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/193526.html原文链接:https://javaforall.cn