BeanFactoryPostProcessor:允许自定义对ApplicationContext的 bean definitions 进行修饰,扩展功能。
1、实现BeanFactoryPostProcessor 接口,会被Application contexts自动发现
2、BeanFactoryPostProcessor 仅仅对 bean definitions 发生关系,不能对bean instances 交互,对bean instances 的交互,由BeanPostProcessor的实现来处理
3、PropertyResourceConfigurer :典型实现 属性替换的功能
4、CustomEditorConfigurer :典型实现 添加自定义属性编辑器的功能
5、ConfigurationClassPostProcessor:启动@Configuration的扫描功能
举例:
有这样的也个业务场景:
<bean id="user" class="com.gym.UserServiceImpl" > <property name="username" value="${username_}"/> <property name="password" value="${password_}"/> </bean>
spring支持系统对username_进行占位符的配置为properties文件配置,试想如果我们有个配置中心,我们希望spring启动的时候,从远程配置中心取数据,而非本地文件,这里就需要我们自定义一个实现BeanFactoryPostProcessor的PropertyResourceConfigurer 实例。
看下面的例子:
xml配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" default-autowire="byName"> <bean id="user" class="com.gym.UserServiceImpl" > <property name="username" value="${username_}"/> <property name="password" value="${password_}"/> </bean> <bean id="myFactoryPostProcessor" class="com.gym.MyFilePlaceHolderBeanFactoryPostProcessor"/> </beans>
模拟从远程取文件:
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; import org.springframework.core.io.support.PropertiesLoaderUtils; /** * @author xinchun.wang */ public class MyFilePlaceHolderBeanFactoryPostProcessor extends PropertyPlaceholderConfigurer implements InitializingBean{ public void afterPropertiesSet() throws Exception { List<Properties> list = new ArrayList<Properties>(); Properties p = PropertiesLoaderUtils.loadAllProperties("config.properties"); list.add(p); //这里是关键,这就设置了我们远程取得的List<Properties>列表 setPropertiesArray(list.toArray(new Properties[list.size()])); } }
javaBean配置:
public class UserServiceImpl implements IUserService{ private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class); public UserServiceImpl(){ logger.info("UserServiceImpl 构造函数 "); } private String username; private String password; public String getUsername() { return username; } public String getPassword() { return password; } public void setUsername(String username) { logger.info("UserServiceImpl setUsername {}",username); this.username = username; } public void setPassword(String password) { logger.info("UserServiceImpl setPassword {}",password); this.password = password; } @Override public String toString() { return "UserServiceImpl [username=" + username + ", password=" + password + "]"; } }
测试:
public class TestApplicationContext { public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext( "classpath:spring/applicationContext.xml"); IUserService userService = applicationContext.getBean(IUserService.class); String password = userService.getPassword(); applicationContext.destroy(); System.out.println(password); } }
------------------------------系统调用入口:------------------------------
调用入口:
相关推荐
最后,Spring的容器提供了多种扩展点,如BeanPostProcessor、BeanFactoryPostProcessor等,这使得开发者可以在容器初始化阶段自定义逻辑。在3.2.13.RELEASE中,我们可以探索这些扩展点的实现,以及如何利用它们增强...
1. 容器扩展:Spring 提供了 BeanPostProcessor 和 BeanFactoryPostProcessor 接口,允许用户自定义扩展点,实现更精细的控制。 2. Annotation-based Configuration:除了 XML 配置外,4.3.6 版本更加强调注解驱动的...
3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.1.1. 使用BeanPostProcessor的Hello World示例 3.7.1.2. RequiredAnnotationBeanPostProcessor示例 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7....
综上所述,Spring框架通过其强大的依赖注入机制和丰富的扩展点,为Java开发者提供了一个灵活、高效、可扩展的开发平台。无论是构建简单的Web应用还是复杂的企业级系统,Spring都能提供强有力的支持。
Spring框架中的BeanFactoryPostProcessor是一个非常重要的扩展点,它允许开发者在BeanFactory标准初始化之后对其进行定制和修改。下面我们将详细介绍BeanFactoryPostProcessor的扩展原理和使用方法。 首先,...
1.8 容器扩展点 Spring框架允许开发者扩展容器行为,这包括自定义BeanPostProcessor、BeanFactoryPostProcessor等。 在Spring框架的学习和应用中,开发者需要深刻理解这些核心知识点,只有这样,才能充分利用Spring...
Springboot启动扩展点是Spring框架的核心思想,容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。Springboot更是封装了Spring,遵循约定大于配置,加上自动装配的机制。很多时候我们...
本文主要探讨Spring扩展原理,特别是`BeanFactoryPostProcessor`、`BeanDefinitionRegistryPostProcessor`以及`ApplicationListener`这三种核心扩展点。 首先,`BeanFactoryPostProcessor`是Spring IOC容器中的一种...
BeanFactoryPostProcessor接口是Spring提供的一种扩展点,它允许在容器实例化相应对象之前,对注册到容器的BeanDefinition所保存的信息做一些额外的操作,例如修改bean定义的某些属性或者增加其他信息等。...
- **Bean的高级功能**:如bean的继承、FactoryBean、BeanPostProcessor和BeanFactoryPostProcessor等,增强了Bean的灵活性和扩展性。 4. **整合其他技术** - **MVC框架**:Spring MVC提供了模型-视图-控制器的...
- **BeanFactory后处理器**:分析BeanFactoryPostProcessor接口如何扩展Spring容器的功能。 - **Aware接口**:介绍Aware接口及其在Spring中的应用场景。 - **初始化与销毁**:深入研究Bean的初始化与销毁过程。 - **...
11. Spring的扩展点:包括BeanFactoryPostProcessor、BeanPostProcessor、InstantiationAwareBeanPostProcessor等。 二、Spring Beans 12. Spring beans:是Spring框架中的核心组件,提供了一个通用的方式来创建和...
### Spring宝典知识点详解 #### 一、Spring框架概述及核心机制 - **Spring框架的起源与发展** - Spring框架自发布以来迅速成为最受欢迎的Java企业级应用开发框架之一,其核心价值在于提供了轻量级的IoC容器,极大...
文档最后还涉及到了Spring容器的扩展点,如BeanPostProcessor和BeanFactoryPostProcessor,这些扩展点让开发者有机会在Spring容器实例化Bean前后以及加载配置元数据前后执行自定义逻辑。 整体来看,Spring4中文文档...
- **3.8 容器扩展点** - **3.8.1 使用BeanPostProcessor定制bean** - BeanPostProcessor接口允许开发者在bean初始化前后执行自定义操作。 - **3.8.2 使用BeanFactoryPostProcessor定制配置元数据** - 可以修改...
### Spring开发指南知识点详解 #### 一、Spring框架概述 - **定义**:Spring框架是一个开源的轻量级Java EE应用程序框架,旨在简化企业级应用的开发过程。它由Rod Johnson创建并领导开发,最初发布于2004年。 - **...
- 支持各种扩展点,如`BeanPostProcessor`、`ApplicationContextAwareProcessor`等。 - 注册各种接口实现类,例如`EnvironmentAware`、`EmbeddedValueResolverAware`等。 - 配置资源加载器`...
综上所述,要在低版本的Spring中实现类似自动配置的功能,需要巧妙地利用Spring提供的扩展点,如BeanFactoryPostProcessor和BeanPostProcessor,以及Java Config和XML配置的组合。同时,还需要结合生命周期回调和...