IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring拓展知识:后置处理器与事件监听器 -> 正文阅读

[Java知识库]Spring拓展知识:后置处理器与事件监听器

Spring 拓展

使ssm的的时候。首先就会找到spring ,为什么?

应为我们需要将对象交给srping来统一管理,

我们先来复习一下,spring的两大特性

ioc

我们同过spring来帮助我们创建类,帮助我们类之间的解耦

aop

可以在不改变类的源码情况下,添加一些增强的方法,可以是前置,后置 ,异常等等

我们想要用框架,实现越来越多的功能的时候,往往要填加很多很多的bean组件,在使用的时候就可以直接去使用ioc容器中的类,

后置处理器

创建类也有区分不同

  • 有工厂创建的单例
  • 有bean的创建

这些都需要有对应的后置处理器,接下来我们就来看看spring给我们提供了那些灵活的处理器,只要是注入到容器中的bean在即将初始化的时候,都会执行后置处理器,完成之后才放入spring的池子中。

bean的处理器

BeanPostProcessor : bean的后置处理器作用是在Bean对象在实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们自己的逻辑。注意是Bean实例化完毕后及依赖注入完成后触发的。接口的源码如下

源码中有两个方法:

postProcessBeforeInitialization:实例化,依赖注入完毕,再调用显示初始化之前完成游戏额定制初始化的任务

postProcessAfterInitialization:实例化,依赖注入,初始化后执行

这里我们写个小demo来体验一下

新建一个类,叫myBeanPostProcessor,我们实现这个后置处理器的接口

参数解释 :

参数1 bean :就是我们注入到ioc的对象

参数2 beanName : 就是我们注入到ioc的对象名字

public class MyBeanPostProcessor implements BeanPostProcessor {
  public Object postProcessBeforeInitialization(Object bean, String beanName)
      throws BeansException {
    System.out.println(beanName+"初始化执行前");
    return bean;
  }

  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    System.out.println(beanName+"初始化执行后");
    return bean;
  }
}

简单实例,实行之后,可以看我们注入对象的初始化前和初始化后的输出信息

Bean工厂后置处理器

这个bean工厂处理器,是在所有bean的创造之前对bean的一些修改,我们可以在没有构造对象之前,对bean做什么,

postProcessBeanFactory方法 : 参数有bean工厂的对象,可以查看到一些信息

image-20211010172012953

他就是返回一个在bena创建之前的创建工厂对象,我们可以查看工厂中要创建的bean信息

BeanDefinitionRegistryPostProcessor(后置bean组件信息处理器)

为了处理我们在放容器到spring的时候的一些配置,比如是否单例,初始化方法,销毁方法,等等信息的后置处理器

image-20211010172341715

方法

postProcessBeanDefinitionRegistrybean对象的配置信息注册

postProcessBeanFactory之后进到bean的工厂

public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry)
      throws BeansException {
    System.out.println("postProcessBeanDefinitionRegistry:" + beanDefinitionRegistry);
  }

  public void postProcessBeanFactory(
      ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
    System.out.println("ConfigurableListableBeanFactory:" + configurableListableBeanFactory);
  }

Bean组件的各个生命周期

  • bean组件信息处理器:组件信息注册
  • bean工厂创建,我们自己写的后置工厂处理器是一样的,
  • bean创建和注入完成
  • 初始化前
  • 初始化完成
  • 初始后
  • 销毁

小demo,使用Bean工厂操作bean的注入

全新配置文件 : beanFactoryProcessor.xml,就放两个没有任何配置的bean对象

    <bean id="mypostProcessBeanFactory" class="com.hyc.Processor.MypostProcessBeanFactory"/>
    <bean id="demobean" class="com.hyc.springBean.demoBean"></bean>

用beanFactory操作bean对象,实现配置,和属性注入

public class MypostProcessBeanFactory implements BeanFactoryPostProcessor {
  public void postProcessBeanFactory(
      ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
    System.out.println("configurableListableBeanFactory" + configurableListableBeanFactory);
    // 获取对象
    AbstractBeanDefinition demobean =
        (AbstractBeanDefinition) configurableListableBeanFactory.getBeanDefinition("demobean");
    // 设置初始化方法
    demobean.setInitMethodName("init1");
    // 注入name值
    MutablePropertyValues propertyValues = demobean.getPropertyValues();
    propertyValues.add("name", "PostProcessorFactory bane name");
    // 设置销毁方法
    demobean.setDestroyMethodName("destroy1");
  }
}

之后输出查看信息

image-20211010174808177

接下来我们复制一个自定义bean工厂

image-20211010175106616

配置文件新增一个bean

    <bean id="mypostProcessBeanFactory2" class="com.hyc.Processor.MypostProcessBeanFactory2"/>

给两个工厂实现优先级接口,设置优先级,

一号工厂优先级为5

二号工厂优先级为10

public class MypostProcessBeanFactory2 implements BeanFactoryPostProcessor, Ordered {
 //之前工厂的代码省略

  public int getOrder() {
    return 10;
  }

启动测试

image-20211010175631070

可以看到有级别为5的是线执行的

完美,以上就是用后置处理器来操作bean属性的是实战了

spring事件监听器

可以监听我们spring中发生的时间,我们也可以自定义一个spring的事件监听器

我们学习这个主要是要知道spring在容器中执行的时候都派发了什么事件

这里我们实现ApplicationListener<ApplicationEvent>

这里泛型里的对象是全局的消息,我们也可以写一个自己的自定义的

public class MyApplicationEvent extends ApplicationEvent {
  public MyApplicationEvent(Object source) {
    super(source);
  }

  String username;
  String emial;

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getEmial() {
    return emial;
  }

  public void setEmial(String emial) {
    this.emial = emial;
  }

  public MyApplicationEvent(Object source, String username, String emial) {
    super(source);
    this.username = username;
    this.emial = emial;
  }
}

之后创建新的配置文件 Listener.xml将事件监听器加入到spring容器中

  <bean id="listener" class="com.hyc.listener.myApplicationListener"></bean>

修改事件监听器,让我们来看看是在生成bean的时候都派发了什么事件吧

public class myApplicationListener implements ApplicationListener<ApplicationEvent> {
  public void onApplicationEvent(ApplicationEvent event) {
    System.out.println("接受到的事件" + event);
      //这里怕判断是如果有我们自己的定义内容将事件监听器强转成我们的自定监听器,保证自己的自定义事件也可以输出
    if (event instanceof MyApplicationEvent) {
      MyApplicationEvent myApplicationEvent = (MyApplicationEvent) event;
      System.out.println("用户名" + myApplicationEvent.getUsername());
      System.out.println("用户邮箱" + myApplicationEvent.getEmial());
    }
  }
}

之后测试

public class listenerMain {
  public static void main(String[] args) {
    ClassPathXmlApplicationContext ApplicationContext =
        new ClassPathXmlApplicationContext("Listener.xml");
    //创建事件对象
    MyApplicationEvent event = new MyApplicationEvent("事件内容", "james", "123@qq,com");
    //发送事件
    ApplicationContext.publishEvent(event);
    ApplicationContext.close();
    //
  }
}

image-20211010182140609

可以看到图中spring的加载过程越来越明显清晰了起来

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:12:55  更:2022-09-21 00:19:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 8:46:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码