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();
    }
}

相关文章
|
17天前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
332 128
|
1月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
297 0
|
1月前
|
Java 测试技术 API
将 Spring 的 @Embedded 和 @Embeddable 注解与 JPA 结合使用的指南
Spring的@Embedded和@Embeddable注解简化了JPA中复杂对象的管理,允许将对象直接嵌入实体,减少冗余表与连接操作,提升数据库设计效率。本文详解其用法、优势及适用场景。
221 126
|
18天前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
141 12
|
1月前
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
131 1
使用Spring的@Retryable注解进行自动重试
|
1月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
探索Spring Boot的@Conditional注解的上下文配置
|
1月前
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
Spring中最大化@Lazy注解,实现资源高效利用
|
1月前
|
安全 IDE Java
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
本文介绍了如何在 Spring 应用程序中使用 Project Lombok 的 `@Data` 和 `@FieldDefaults` 注解来减少样板代码,提升代码可读性和可维护性,并探讨了其适用场景与限制。
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
|
1月前
|
缓存 监控 安全
Spring Boot 的执行器注解:@Endpoint、@ReadOperation 等
Spring Boot Actuator 提供多种生产就绪功能,帮助开发者监控和管理应用。通过注解如 `@Endpoint`、`@ReadOperation` 等,可轻松创建自定义端点,实现健康检查、指标收集、环境信息查看等功能,提升应用的可观测性与可管理性。
Spring Boot 的执行器注解:@Endpoint、@ReadOperation 等