from : http://blog.csdn.net/chensugang/article/details/3423650
今天学习了一下Spring的BeanPostProcessor接口,该接口作用是:如果我们需要在Spring容器完成Bean的实例化,配置和其他的初始化后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcessor接口的实现。
下面我们来看一个简单的例子:
package com.spring.test.di;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class BeanPostPrcessorImpl implements BeanPostProcessor {
// Bean 实例化之前进行的处理
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("对象" + beanName + "开始实例化");
return bean;
}
// Bean 实例化之后进行的处理
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("对象" + beanName + "实例化完成");
return bean;
}
}
只要将这个BeanPostProcessor接口的实现定义到容器中就可以了,如下所示:
<bean class="com.spring.test.di.BeanPostPrcessorImpl"/>
测试代码如下:
package com.spring.test.di;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// 得到ApplicationContext对象
ApplicationContext ctx = new FileSystemXmlApplicationContext(
"applicationContext.xml");
// 得到Bean
ctx.getBean("logic");
}
}
运行以上测试程序,可以看到控制台打印结果:
对象logic开始实例化
对象logic实例化完成
BeanPostProcessor的作用域是容器级的,它只和所在容器有关。如果你在容器中定义了BeanPostProcessor,它仅仅对此容器中的bean进行后置。它不会对定义在另一个容器中的bean进行任何处理。
注意的一点:
BeanFactory
和ApplicationContext
对待bean后置处理器稍有不同。ApplicationContext
会自动检测在配置文件中实现了BeanPostProcessor
接口的所有bean,并把它们注册为后置处理器,然后在容器创建bean的适当时候调用它。部署一个后置处理器同部署其他的bean并没有什么区别。而使用BeanFactory
实现的时候,bean 后置处理器必须通过下面类似的代码显式地去注册:
BeanPostPrcessorImpl beanPostProcessor = new BeanPostPrcessorImpl();
Resource resource = new FileSystemResource("applicationContext.xml");
ConfigurableBeanFactory factory = new XmlBeanFactory(resource);
factory.addBeanPostProcessor(beanPostProcessor);
factory.getBean("logic");
分享到:
相关推荐
Spring BeanPostProcessor接口使用详解 Spring BeanPostProcessor接口是Spring框架中的一种后处理器接口,允许开发者在Bean初始化前后进行自定义处理。该接口提供了两个供开发者自定义的方法:...
在Spring框架中,`<ref>`标签用于表示一个对象引用,通常用来注入另一个Bean。该标签包含三个重要的属性:`bean`, `local`, 和 `parent`。 - **`bean`**: 指定要引用的Bean的名称。这是最常用的属性,当使用`<ref ...
当Spring容器实例化一个bean时,如果该bean实现了BeanPostProcessor接口,那么Spring会在bean的初始化前后调用其`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`方法。这使得开发者可以在...
通常,类图会包含BeanPostProcessor接口、其方法签名、可能的实现类以及它们如何参与到Spring的bean生命周期中。通过分析这个类图,我们可以看到Spring如何调用这些自定义处理器,并理解它们在bean实例化过程中的...
总结起来,Spring的BeanPostProcessor接口为我们在bean生命周期中的关键点提供干预点,使得我们可以根据业务需求实现工厂模式,尤其是当需要根据条件动态创建bean时。结合自定义注解,我们可以创建一个更加灵活、...
在本案例中,我们将探讨如何实现一个动态代理接口并将其注册到Spring容器,以便于通过@Autowired注解或其他方式在Spring应用中使用。 首先,我们需要定义一个接口,例如`MyService`,这个接口包含了我们需要代理的...
此外,还可以通过实现`BeanFactoryPostProcessor`和`BeanPostProcessor`接口,自定义Spring容器的行为。 #### 结语 Spring的依赖注入机制是其强大功能的基石,通过对Bean的灵活管理和生命周期的控制,大大提高了...
3. **接口注入**:Spring提供了一个`ApplicationContextAware`接口,实现了这个接口的类可以获取到Spring容器自身,从而获取到其他bean。 三、Spring依赖注入的实现原理 Spring依赖注入的实现主要基于反射和代理...
BeanPostProcessor 接口是 Spring 框架中一个非常重要的接口,它提供了一种方式来在bean实例化、配置和初始化方法前后添加自定义逻辑处理。通过实现 BeanPostProcessor 接口,我们可以在bean实例化、配置和初始化...
当Spring容器启动时,它会检测到实现了BeanPostProcessor接口的Bean,并将其特殊处理。这些BeanPostProcessor实例会被用来处理容器中其他所有的Bean。因此,BeanPostProcessor是实现AOP中自动代理(auto-proxying)...
在Spring框架中,实现BeanFactory接口的主要类是DefaultListableBeanFactory,它是最基础的IoC容器。 XML配置文件是Spring中定义bean及其依赖关系的传统方式。一个典型的Spring XML配置文件会包含若干个<bean>元素...
- 可以通过在接口实现的构造器、接口方法中设置断点,使用调试器观察线程调用栈来分析Bean对象创建和管理的触发时机。 4. **源码学习技巧** - 定焦原则:抓主线,即以源码的主要脉络为学习目标,理解框架的架构和...
Spring容器的实现涉及到`DefaultListableBeanFactory`、`BeanDefinition`、`BeanPostProcessor`等多个类。在`MySpring`文件中,我们可能能看到类似的自定义实现: - `MyBeanFactory`:模拟`BeanFactory`,负责解析...
在Spring框架中,Bean是核心概念,它代表了...综上所述,Spring中的Bean接口和注解为开发者提供了强大的工具,以实现灵活的依赖注入和对象管理。理解并熟练运用这些接口,能够使我们的代码更加简洁、高效,并易于维护。
- **XML配置**:早期Spring主要通过XML文件定义Bean及其依赖,如`<bean>`标签用于定义一个Bean,`<property>`标签用于设置属性值。 - **注解配置**:随着Java注解的发展,Spring引入了@Component、@Service、@...
- **Bean后处理器**:实现`BeanPostProcessor`接口,可以注册回调方法,在Bean实例化和初始化前后进行操作。 - **AOP代理**:通过AOP,可以在Bean的方法调用前后插入自定义的行为,例如日志记录、事务管理等。 ...
BeanPostProcessor接口的实现类如何被注册到Spring容器2.更改bean的定义(BeanFactoryPostProcessor接口)3.注册Bean到Spring容器(BeanDefinitionRegistryPostProcessor接口)4.通过FactoryBean结合...
然而,如果不存在实现类,我们可以自定义BeanPostProcessor或InstantiationAwareBeanPostProcessor来在运行时创建接口的实例。这些处理器可以检查接口,动态生成实现类的字节码,然后使用CGLIB或Java代理(如果是...