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); } }
------------------------------系统调用入口:------------------------------
调用入口:
相关推荐
com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean...
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....
3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................
3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................
主要介绍了Spring注解驱动扩展原理BeanFactoryPostProcessor,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
ext扩展原理包含beanFactoryPostProcessor,BeanDefinitionRegistryPostProcessor和事件监听器等---> tx Spring声明式事务模块---> config AOP IOC已经一些bean的流程配置模块--->启动也包含SpringMVC注解...
该项目提供了,如果在Spring 类中遇到以下情况之一,该将发出编译器警告和错误: @Configuration类不能是最终的。 @Configuration类必须具有可见的无参数构造函数。 @Configuration类的构造函数不得为@Autowired...
3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用MessageSource实现国际化 ...
1 BeanFactoryPostProcessor作用 public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor { /** * 可以修改容器Bean内部的定义信息,全部的bean definitions会加载但是bean没有...
3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用MessageSource实现国际化 ...
4.8 容器扩展点. 78 4.8.1 使用BeanPostProcessor 来自定义bean 78 4.8.1.1 示例:BeanPostProcessor 风格的Hello World.. 79 4.8.1.2 示例:RequiredAnnotationBeanPostProcessor 81 4.8.2 ...
3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. The ApplicationContext 3.8.1. BeanFactory 还是 ...
3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. The ApplicationContext 3.8.1. BeanFactory 还是 ...
Spring注解驱动开发第36讲——或许,这是你以前没看过的从源码角度理解BeanFactoryPostProcessor的原理
不使用XML定义档进行 Bean设置 Aware 相关介面 BeanPostProcessor BeanFactoryPostProcessor PropertyPlaceholderConfigurer PropertyOverrideConfigurer CustomEditorConfigurer ...
spring注解驱动开及源码分析 目录 1,组件注册 2,生命周期 3,属性赋值 4,自动装配 5,IOC小结 6,AOP源码分析 7,声明式事务演示 8,扩展原理 8.1-BeanFactoryPostProcessor 8.2-...
* 所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建 * * * BeanFactoryPostProcessor原理:
《spring开发指南》,欢迎使用spring框架的各位下载。
了解spring的加载机制 beanPostProcessor,beanFactoryPostProcessor 的使用 springmvc 的父子容器 aop切面说明 公司内部培训课件
BeanFactoryPostProcessor BeanFactoryReference BeanFactoryRefreshableTargetSource BeanFactoryUtils BeanInitializationException BeanInstantiationException BeanIsAbstractException ...