Spring注解开发——重要组件(Bean的整个加载流程)+监听器+自定义事件

Spring重要组件

  • 接口BeanPostProcessor:

    • 拦截了容器中的所有Bean,并且可以进行bean的初始化 、销毁
    • Bean的生命周期:创建 -> 初始化 -> … -> 销毁
  • BeanFactoryPostProcessor:拦截了容器

  • BeanDefinitionRegistryPostProcessor:即将被加载之前(解析之前,称为BeanDefination对象之前)
    Bean的加载流程
    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...")) ;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值