SpringBoot扩展接口- Bean实例化前后扩展点

本文详细介绍了Spring框架中Bean的初始化过程,包括ApplicationContextAware等常用扩展接口的作用时机,以及BeanPostProcessor接口如何在Bean实例化前后进行处理。

常用的扩展接口:

1、ApplicationContextAware:获取应用上下文

2、BeanPostProcessor 接口在对象实例化后, 初始化方法调用前后做前置处理和后置处理操作。

触发时间:

刷新上下文refreshContext()方法中,调用 finishBeanFactoryInitialization(beanFactory) 方法,进行bean的实例化

上下文applicationContext的事件监听器和时间广播器已经初始化完成
内置tomcat已经启动

工厂FactoryBean一般不需要扩展接口

普通bean才需要扩展接口

初始化bean的入口 beanFactory.getBean()方法

1、创建bean实例

2、bena实例缓存起来

3、调用populateBean()会在这里进行@Autowire注解的依赖注入

4、initializeBean()进行bean的初始化

4.1 BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口方法调用 (实现了这些接口的bean)

4.2 BeanPostProcessor接口的postProcessBeforeInitialization()方法调用
ApplicationContextAwareProcessor 后置处理器初始化前方法中处理下面接口调用
    EnvironmentAware、
    EmbeddedValueResolverAware、
    ResourceLoaderAware、
    ApplicationEventPublisherAware、
    MessageSourceAware、
    ApplicationContextAware接口的方法调用

ServletContextAwareProcessor 处理器处理
ServletContextAware接口调用

4.3 调用bean的初始化方法InitializingBean接口afterPropertiesSet()方法

或者注解指定的 init方法

4.4 BeanPostProcessor接口的 postProcessAfterInitialization()方法调用

<think>好的,用户想了解在Spring Boot中如何创建和实现自定义扩展点。我需要根据提供的引用内容来整理相关信息。首先,引用[1]提到Spring Boot扩展点和启动顺序图,还有bean加载的过程。这可能涉及到BeanPostProcessor、InitializingBean接口。引用[2]展示了AOP的使用,比如通过@Aspect和@Component创建切面,但用户的问题是关于扩展点,可能需要更基础的方式。引用[3]提到了InitializingBean的afterPropertiesSet方法和@PostConstruct注解,这些都是bean生命周期中的扩展点。 用户需要具体的实现方式和示例教程。我需要分步骤说明不同的扩展点实现方法。首先想到的是BeanPostProcessor,因为它允许在bean初始化前后插入自定义逻辑。然后,InitializingBean接口和@PostConstruct注解,这两个都是在bean初始化时调用的。还有FactoryBean,可以用来创建复杂的bean。另外,可能还可以提到ApplicationContextInitializer或者Spring Boot的启动监听器,但引用中没有提到这些,可能暂时不涉及。 需要确保每个步骤都有示例代码,比如实现BeanPostProcessor的类,并展示postProcessBeforeInitialization和postProcessAfterInitialization方法。然后,InitializingBean的例子,实现afterPropertiesSet方法。@PostConstruct注解的使用方式。FactoryBean的例子,比如如何创建一个FactoryBean来生成特定类型的bean。同时,要提到配置方式,比如使用@Component或者@Configuration来注册这些类。 还要注意引用中的内容,比如引用[3]提到InitializingBean和@PostConstruct,所以需要正确引用这些部分。可能生成的引用标识应该是[^3]和[^1]。此外,示例代码需要符合用户提供的格式,可能用Java而不是Python,但用户给出的示例是Python,但问题本身是关于Spring Boot的,所以应该用Java代码块。 最后,生成相关问题,比如不同扩展点的执行顺序,如何选择扩展点,或者如何结合AOP使用扩展点。确保问题相关且基于内容。</think>### Spring Boot自定义扩展点实现方式 在Spring Boot中实现自定义扩展点主要依赖于Spring框架的生命周期接口和注解机制。以下是三种核心实现方式及示例: --- #### 一、实现**BeanPostProcessor**接口 用于在Bean初始化前后插入自定义逻辑,例如修改属性或代理对象。 ```java @Component public class CustomBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) { System.out.println("Before初始化: " + beanName); return bean; // 可返回修改后的对象 } @Override public Object postProcessAfterInitialization(Object bean, String beanName) { System.out.println("After初始化: " + beanName); return bean; } } ``` *执行顺序*:此接口方法会在每个Bean的初始化阶段被调用[^1]。 --- #### 二、使用**InitializingBean**接口或**@PostConstruct** 1. **实现InitializingBean接口** ```java @Component public class CustomInitBean implements InitializingBean { @Override public void afterPropertiesSet() { System.out.println("Bean属性注入完成后执行"); } } ``` 2. **使用@PostConstruct注解** ```java @Component public class AnnotationInitBean { @PostConstruct public void init() { System.out.println("@PostConstruct方法执行"); } } ``` *特点*:两者均在Bean属性注入完成后触发,但注解方式更灵活。 --- #### 三、通过**FactoryBean**定制复杂对象 用于创建无法直接通过构造函数实例化的对象(如第三方库组件)。 ```java @Component public class MyFactoryBean implements FactoryBean<SpecialService> { @Override public SpecialService getObject() { return new SpecialService("自定义配置参数"); } @Override public Class<?> getObjectType() { return SpecialService.class; } } ``` *调用方式*:通过`applicationContext.getBean("myFactoryBean")`获取实例。 --- #### 四、扩展点执行顺序参考 $$ \begin{aligned} &1.\ BeanPostProcessor.postProcessBeforeInitialization \\ &2.\ @PostConstruct/\ InitializingBean.afterPropertiesSet \\ &3.\ BeanPostProcessor.postProcessAfterInitialization \end{aligned} $$ 该顺序体现了Spring容器对Bean生命周期的精细控制[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值