Spring重要组件
-
接口BeanPostProcessor:
- 拦截了容器中的所有Bean,并且可以进行bean的初始化 、销毁
- Bean的生命周期:创建 -> 初始化 -> … -> 销毁
-
BeanFactoryPostProcessor:拦截了容器
-
BeanDefinitionRegistryPostProcessor:即将被加载之前(解析之前,称为BeanDefination对象之前)
BeanDefinitionRegistryPostProcessor(a) -》加载bean->BeanFactoryPostProcessor(b)->实例化bean->BeanPostProcessor -
同一个方法 在不同地方(类、接口)的出现时机问题:a继承b,因此a中必然包含b中的方法(记c ):虽然a和b中都有c,但是 因此c出现的时机不同, 则c的执行顺序也不同: 如果是在a中出现,则先执行;如果是在b中执行 则后执行
-
在同一个地方(类、接口),的不同方法的出现时机问题
- BeanDefinitionRegistryPostProcessor 方法先执行
- BeanFactoryPostProcessor 后执行
@Component // 不同 方法 不同类 执行时机不同
public class MyZzz implements BeanDefinitionRegistryPostProcessor { //容器 bean 初始化前
@Override // 接口自己的方法 (维护着容器中所有bean的注册信息)
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
//注册
System.out.println("[a]容器中已注册bean 的数量"+ registry.getBeanDefinitionCount());
// 可以手工注册一个bean
// BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(Address.class);
registry.registerBeanDefinition("address",beanDefinitionBuilder.getBeanDefinition());
}
@Override // 继承自 BeanFactoryPostProcessor bean的工厂
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("[a]post容器中已注册bean 的数量:"+beanFactory.getBeanDefinitionCount());
}
}
@Component
public class MyYyy implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// beanFactory.getBeanDefinition("disallowing") ; 根据bean的名字获取bean
int count = beanFactory.getBeanDefinitionCount();
System.out.println("[b]容器中bean的个数"+count);
String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
System.out.println("[b]容器中所有bean的名字(id):");
for (String name:beanDefinitionNames){
System.out.println(name);
}
}
}
监听器:
可以监听事件 ,监听的对象必须是 ApplicationEvent自身或其子类/子接口
方式一:实现接口
1必须实现ApplicationListener接口,
@Component
public class MyListlener implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationEvent event) {
System.out.println("监听器:"+event);
//AnnotationConfigApplicationContext 监听此对象
}
}
方式二:注解
- (语法上 可以监听任意事件,但建议 ApplicationEvent自身或其子类/子接口)
- Spring:要让SPring识别自己,必须加入IOc容器(Bean+返回值| 注解+扫描器)
@Component
public class MyListlener2 {
@EventListener(classes = {ApplicationEvent.class})
public void mylistlener(ApplicationEvent event) {
System.out.println("监听器:" + event.getSource());
}
}
自定被监听事件
- a.自定义类 实现ApplicationEvent接口(自定义事件)
- b.发布事件
context.publishEvent(自定义事件);
public class MyEvent extends ApplicationEvent {
public MyEvent(Object source) {//监听的对象
super(source);
}
}
main 方法直接在容器中添加,需要配合监听器使用
//发布事件
context.publishEvent(new MyEvent("my Event...")) ;