简述问题:
写个bean:
public class BeanTest{}
写个定制扩展:
public class TestBeanPostProcessor implements BeanPostProcessor,Ordered{
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("testbean 结束构造");
return bean;
}
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("testbean 开始构造");
return bean;
}
public int getOrder() {
return 0;
}
}
然后测试运行:
BeanFactory context = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
Object o =context.getBean("beantest");
结果很容易猜到:
testbean 开始构造
testbean 结束构造
现在对testbean进行实例化定制:
public class BeanTest<T> implements FactoryBean,Ordered{
public Object getObject() throws Exception {
return new ArrayList<T>();
}
public Class<T> getObjectType() {
return null;
}
public boolean isSingleton() {
return false;
}
public int getOrder() {
return 0;
}
}
这时运行结果:
testbean 开始构造
testbean 结束构造
testbean 结束构造
接着再对调用程序改造:
BeanFactory context = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
Object o =context.getBean("&beantest");
这时运行结果:
testbean 开始构造
testbean 结束构造
根据结果可知context.getBean("beantest")容器根据factorybean的getObject()获得对象arraylist后又去BeanPostProcessor后置链里走了一遭,而对于context.getBean("&beantest")来说则是未调用getObject()进行实例化而是直接返回的TestBean的实例化对象不再走BeanPostProcessor拦截链,现在不解的是为什么要这样设计呢,为什么两种方式一个走一个不走,求解。
后记:今天复习源码时发现自己有篇帖子未解决,仔细看了一下解决了心中的疑惑,是自己未理解FactoryBean,不是走两次,而是context.getBean("&beantest");只会产生一个bean,这个bean就是testBean,而context.getBean("beantest");会产生两个bean,还有一个bean是在getObject的时候产生的ArrayList,所以会输出两次testBean结束构造,而开始构造肯定只会出现一次,因为ArrayList不是通过spring配置文件反射产生的,是new出来的,所以不会被拦截到。
分享到:
相关推荐
com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean,...
- **Bean的高级功能**:如bean的继承、FactoryBean、BeanPostProcessor和BeanFactoryPostProcessor等,增强了Bean的灵活性和扩展性。 4. **整合其他技术** - **MVC框架**:Spring MVC提供了模型-视图-控制器的...
而 `BeanFactory` 容器实例化后并不会自动实例化 Bean,只有当 Bean 被使用时,`BeanFactory` 容器才会对该 Bean 进行实例化与依赖关系的装配。 #### 1.4.2 FileSystemXmlApplicationContext 从指定的文件系统路径...
在Spring框架中,`FactoryBean`是一个非常重要的概念,它允许我们自定义bean的创建过程。...为了进一步理解,可以通过调试源码,观察容器启动过程和`BeanPostProcessor`的工作原理,以加深对Spring内部机制的认识。
其中有大量一线大厂高频面试问题深度剖析,如MyBatis的Mapper接口底层原理,什么是FactoryBean,什么是BeanFactory?什么是BeanPostProcessor,什么是BeanFactoryPostProcessor?Service中注入的Mapper接口是什么...
- 介绍了使用JSR 330标准注解时需要注意的问题。 **4.12 基于Java的容器配置** - **4.12.1 基本概念:@Configuration和@Bean** - 介绍了@Configuation注解和@Bean注解的基本概念。 - **4.12.2 使用...
3.7.3. 使用FactoryBean定制实例化逻辑 3.8. The ApplicationContext 3.8.1. BeanFactory 还是 ApplicationContext? 3.8.2. 利用MessageSource实现国际化 3.8.3. 事件 3.8.4. 底层资源的访问 3.8.5. ...
3.7.3. 使用FactoryBean定制实例化逻辑 3.8. The ApplicationContext 3.8.1. BeanFactory 还是 ApplicationContext? 3.8.2. 利用MessageSource实现国际化 3.8.3. 事件 3.8.4. 底层资源的访问 3.8.5. ...
这些接口允许开发者自定义对象的生命周期行为,实现特定的功能或对Spring容器的行为进行干预。以下是对这些接口的详细解释: 1. **InitializingBean接口**: `InitializingBean`接口包含一个`afterPropertiesSet()...
3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕...
3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕...
3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的...
- **依赖检查**:Spring可以检查应用程序中是否存在未使用的Bean引用,帮助开发者发现潜在的问题。 #### 3.4 定制Bean的行为 - **生命周期接口**:Spring定义了一系列的生命周期回调接口,如`InitializingBean`和`...
本资源提供了在Spring 4.2环境下关于Bean生命周期的测试代码,帮助我们深入理解这一关键概念。 首先,让我们了解Spring Bean的生命周期主要包含以下几个阶段: 1. **实例化**:Spring容器通过`Class`对象或`...
- **FactoryBean**:介绍Spring Boot中FactoryBean的应用场景。 #### 5. 其他高级特性 - **@Indexed原理**:探讨Spring Data JPA中@Indexed注解的实现原理。 - **代理深入**:进一步研究Spring中的代理技术。 - **@...
`FactoryBean`则是一种特殊的bean,它可以自定义对象的生成方式,提供了如`getSingleton()`, `getObject()`, `getObjectType()`等方法。 当我们想要详细了解bean的创建过程,可以利用观察者模式,即监听器和监听...
- BeanPostProcessor接口允许开发者实现对Bean实例进行预处理或后处理的功能,如自动装配、属性填充等。 - **Customizing Bean Factories with BeanFactoryPostProcessors** - BeanFactoryPostProcessor允许...
- 解决方案是通过创建该类的子类或者使用`FactoryBean`的方式来自定义`SecurityMetadataSource`。 4. **使用`FactoryBean`初始化`SecurityMetadataSource`**: - 实现一个`FactoryBean`,使其`getObject`方法返回...
- **使用BeanPostProcessors自定义Bean**:BeanPostProcessor接口允许开发者自定义Bean的初始化过程。 #### 3.7 使用BeanFactoryPostProcessors自定义Bean工厂 - **PropertyPlaceholderConfigurer**:用于替换配置...