130.【Spring注解_AOP】(三)

简介: 130.【Spring注解_AOP】

(四)、扩展原理

1.BeanFactoryPostProcessor ->来定制和修改beanFactory的内容

在BeanFactory标准初始化之后调用,所有的bean定义已经保存加载到beanFactory,但是bean的实列还未创建

1.判断无参构造函数创建实列是否在BeanFactory之前还是之后?

1.BeanFactory的后置处理器MyBeanFactoryPostProcessor

package com.jsxs.etx;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
import java.util.Arrays;
/**
 * @Author Jsxs
 * @Date 2023/8/24 10:44
 * @PackageName:com.jsxs.etx
 * @ClassName: MyBeanFactoryPostProcessor
 * @Description: TODO
 * @Version 1.0
 */
@Component  ⭐注册组件
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { ⭐⭐ 继承接口
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("MyBeanFactoryPostProcessor->执行力postProcessBeanFactory方法");
        // 组件的数量
        int count = beanFactory.getBeanDefinitionCount();
        // 组件的名字
        String[] names = beanFactory.getBeanDefinitionNames();
        System.out.println("当前beanFactory中有"+count+"个Bean");
        System.out.println(Arrays.asList(names));
    }
}

2.实体类

package com.jsxs.bean;
/**
 * @Author Jsxs
 * @Date 2023/8/13 21:11
 * @PackageName:com.jsxs.bean
 * @ClassName: Yellow
 * @Description: TODO
 * @Version 1.0
 */
public class Yellow {
    public Yellow() {  // ⭐构造函数
        System.out.println("Yellow无参构造创建实列");
    }
}

3.配置类

package com.jsxs.etx;
import com.jsxs.bean.Yellow;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
 * @Author Jsxs
 * @Date 2023/8/24 10:38
 * @PackageName:com.jsxs.etx
 * @ClassName: EtxConfig
 * @Description: TODO   BeanFactoryPostProcessor : beanFactory的后置处理器 ⭐
 *                          在BeanFactory标准初始化之后调用,所有的bean定义已经保存加载到beanFactory,但是bean的实列还未创建
 *              在初始化创建其他组件前面执行
 * @Version 1.0
 */
@ComponentScan("com.jsxs.etx")  ⭐扫面组件
@Configuration
public class EtxConfig {
    @Bean  ⭐⭐ 将组件注册进来
    public Yellow yellow(){
        return new Yellow();
    }
}

4.测试

package com.jsxs.Test;
import com.jsxs.etx.EtxConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
 * @Author Jsxs
 * @Date 2023/8/24 10:48
 * @PackageName:com.jsxs.Test
 * @ClassName: IOC_ext
 * @Description: TODO
 * @Version 1.0
 */
public class IOC_ext {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(EtxConfig.class);
        applicationContext.close();
    }
}

所有的bean已经保存到beanFactory工厂中,但是实列依然还没有创建。在初始化创建其他组件前面执行

2.BeanDefinitionRegistryPostProcessor -> 额外添加组件

1.注册后置处理器

package com.jsxs.etx;
import com.jsxs.bean.Yellow;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.stereotype.Component;
/**
 * @Author Jsxs
 * @Date 2023/8/24 11:09
 * @PackageName:com.jsxs.etx
 * @ClassName: MyBeanDefinitionRegistryPostProcessor
 * @Description: TODO
 * @Version 1.0
 */
@Component  ⭐
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    // BeanDefinitionRegistry Bean定义信息的保存中心,以后BeanFactory就是按照BeanDefinitionRegistry里面保存的每一个bean定义信息创建bean实列 ⭐⭐
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        System.out.println("MyBeanDefinitionRegistryPostProcessor的数量是 "+registry.getBeanDefinitionCount()+"Registry ");
        // 创建一个组件 ⭐⭐⭐
        RootBeanDefinition beanDefinition = new RootBeanDefinition(Yellow.class);
        // 将刚才创建的组件注册进IOC中,且名字叫做hello ⭐⭐⭐⭐
        registry.registerBeanDefinition("hello",beanDefinition);
    }
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("MyBeanDefinitionRegistryPostProcessor的数量是:"+beanFactory.getBeanDefinitionCount()+"   BeanFactory");
    }
}

2. 配置类 EtxConfig.java MyBeanFactoryPostProcessor.java Yellow.java IOC_ext.java 和上面的类是一样的

package com.jsxs.etx;
import com.jsxs.bean.Yellow;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
 * @Author Jsxs
 * @Date 2023/8/24 10:38
 * @PackageName:com.jsxs.etx
 * @ClassName: EtxConfig
 * @Description: TODO  1. BeanFactoryPostProcessor : beanFactory的后置处理器
 *                          在BeanFactory标准初始化之后调用,所有的bean定义已经保存加载到beanFactory,但是bean的实列还未创建
 *                          在初始化创建其他组件之前运行
 *                          (1).原理
 *                              (1.1).创建IOC容器
 *
 *                     2.BeanDefinitionRegistryPostProcessor
 *                          在所有的bean定义信息将要被加载,bean实列还未创建的时候执行。
 *                          优先于BeanFactoryPostProcessor执行,利用BeanDefinitionRegistryPostProcessor给容器中再额外的添加一些组件
 *                          (2).原理
 *                              (2.1).创建IOC容器
 *                              (2.2).refresh() 刷新容器 ->invokeBeanFactoryPostProcessors(beanFactory);.
 *                              
 *
 *
 * @Version 1.0
 */
@ComponentScan("com.jsxs.etx")
@Configuration
public class EtxConfig {
    @Bean
    public Yellow yellow(){
        return new Yellow();
    }
}

3.ApplicationListener -> 应用监听器

(1).ApplicationListener 的应用

1.事件-接口

package com.jsxs.etx;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/**
 * @Author Jsxs
 * @Date 2023/8/24 11:59
 * @PackageName:com.jsxs.etx
 * @ClassName: MyApplicationListener
 * @Description: TODO
 * @Version 1.0
 */
@Component  ⭐
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
    // 当容器中发布此事以后,方法触发  ⭐⭐
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println("收到事件"+event);
    }
}

2.自定义事件

package com.jsxs.Test;
import com.jsxs.etx.EtxConfig;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
 * @Author Jsxs
 * @Date 2023/8/24 10:48
 * @PackageName:com.jsxs.Test
 * @ClassName: IOC_ext
 * @Description: TODO
 * @Version 1.0
 */
public class IOC_ext {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(EtxConfig.class);
        // 1.自定义发布一个事件 ⭐⭐⭐
        applicationContext.publishEvent(new ApplicationEvent(new String("我发布了一个事件")) {
        });
        applicationContext.close();
    }
}

3.配置类等其他的都没有变化

package com.jsxs.etx;
import com.jsxs.bean.Yellow;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
 * @Author Jsxs
 * @Date 2023/8/24 10:38
 * @PackageName:com.jsxs.etx
 * @ClassName: EtxConfig
 * @Description: TODO  1. BeanFactoryPostProcessor : beanFactory的后置处理器
 *                          在BeanFactory标准初始化之后调用,所有的bean定义已经保存加载到beanFactory,但是bean的实列还未创建
 *                          在初始化创建其他组件之前运行
 *                          (1).原理
 *                              (1.1).创建IOC容器
 *
 *                     2.BeanDefinitionRegistryPostProcessor
 *                          在所有的bean定义信息将要被加载,bean实列还未创建的时候执行。
 *                          优先于BeanFactoryPostProcessor执行,利用BeanDefinitionRegistryPostProcessor给容器中再额外的添加一些组件
 *                          (2).原理
 *                              (2.1).创建IOC容器
 *                              (2.2).refresh() 刷新容器 ->invokeBeanFactoryPostProcessors(beanFactory);.
 *                     3.ApplicationListener 监听容器中发布的事件。事件驱动模型开发
 *                          (1).监听ApplicationEvent及其下面的子事件
 *
 *                          步骤:
 *                              (1).写一个监听器来监听某个事件(ApplicationEvent及其子类)
 *                              (2).把监听器加入到容器中
 *                              (3).只要容器中有相关事件的发布,我们就能监听到这个事件
 *                                      ContextRefreshedEvent ->刷新事件 (所有的bean都已经创建)
 *                                      ContextClosedEvent -> 关闭事件
 *                              (4).自定义事件 ⭐⭐⭐⭐
 *                                  applicationContext.publishEvent(new ApplicationEvent(new String("我发布了一个事件")) {});
 *
 *
 *
 *
 * @Version 1.0
 */
@ComponentScan("com.jsxs.etx")
@Configuration
public class EtxConfig {
    @Bean
    public Yellow yellow(){
        return new Yellow();
    }
}

相关文章
|
1月前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
50 0
|
1月前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
22天前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
46 5
|
27天前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
53 8
|
23天前
|
前端开发 Java Spring
Spring MVC核心:深入理解@RequestMapping注解
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的核心,它将HTTP请求映射到控制器的处理方法上。本文将深入探讨`@RequestMapping`注解的各个方面,包括其注解的使用方法、如何与Spring MVC的其他组件协同工作,以及在实际开发中的应用案例。
37 4
|
26天前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
23天前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
69 2
|
23天前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
40 2
|
26天前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
39 5
|
26天前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
39 4