通常,应用程序开发人员不需要创建ApplicationContext实现类的子类。相反,可以通过插入特殊集成接口的实现来扩展Spring IoC容器。
如果你想在spring容器完成实例化,配置和初始化一个bean的时候,你可以增加一个自定义是实现BeanPostProcesser接口的类。
你可以写多个实现类,同时你也可以通过order控制执行顺序。
package scripting;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class InstantiationTracingBeanPostProcessor implements BeanPostProcessor {
// simply return the instantiated bean as-is
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return bean; // we could potentially return any object reference here...
}
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("Bean '" + beanName + "' created : " + bean.toString());
return bean;
}
}
BeanFactoryPostProcessor 对配置元数据进行操作
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations" value="classpath:com/something/jdbc.properties"/>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
PropertyOverrideConfigurer与PropertySourcesPlaceholderConfigurer类似,但与后者不同的是,原始定义可以为bean属性提供默认值,也可以根本没有值。如果重写的Properties文件没有某个bean属性的条目,则使用默认上下文定义。
当您需要向容器请求实际的FactoryBean实例本身而不是它生成的bean时,请在调用ApplicationContext的getBean()方法时,在bean的id前面加上&符号。因此,对于id为myBean的给定FactoryBean,在容器上调用getBean(“myBean”)将返回FactoryBean的产品,而调用getBean(“&myBean”)将返回FactoryBean实例本身。