博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring核心:bean工厂的装配 6
阅读量:5278 次
发布时间:2019-06-14

本文共 3684 字,大约阅读时间需要 12 分钟。

本文中主要包含:

23.使用后台处理器post-processor

1.使用BeanPostProcessor

如果向一个bean factory注册post-processor的话,那么对于这个工厂产生的每个bean的实例的话,都会调用Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException和Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException方法。这里需要注意的是ApplicationContext会自动检测并注册post-processor,但是BeanFactory需要手动注册。使用方法如下:

MyBeanPostProcessor.java:

/** * */ package beanfactory.postprocessor; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import beanfactory.SimpleBean; /** * @author jefferyxu * */ public class MyBeanPostProcessor implements BeanPostProcessor { /* (non-Javadoc) * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization(java.lang.Object, java.lang.String) */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { ((SimpleBean)bean).setMsg("i am called by the postProcessAfterInitialization."); return bean; } /* (non-Javadoc) * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization(java.lang.Object, java.lang.String) */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { ((SimpleBean)bean).setMsg("i am called by the postProcessBeforeInitialization"); return bean; } }

客户端程序:

Resource resource = new ClassPathResource("applicationContext.xml"); ConfigurableBeanFactory context = new XmlBeanFactory(resource); BeanPostProcessor postProcessor = new MyBeanPostProcessor(); context.addBeanPostProcessor(postProcessor); SimpleBean simpleBean = (SimpleBean)context.getBean("simpleBean"); System.out.println(simpleBean.getMsg());

2.使用BeanFactoryPostProcessor定制bean工厂

如果一个类实现上面的接口,那么这个类就能在bean factory创建之后,完成对于这个bean factory的修改。spring中包含很多现成的实现上面接口的实现类:PropertyPlaceholderConfigurer,PropertyOverrideConfigurer。下面是这两个的实例。

1.PropertyPlaceholderConfigurer

如果在applicationContext.xml文件中定义:

<bean id="myDataSource" class="beanfactory.postprocessor.MyDataSource" abstract="false" lazy-init="default" autowire="default" p:username="${jdbc.username}" p:dirverClassName="${jdbc.driverClassName}" p:pasword="${jdbc.password}" p:url="${jdbc.url}"> </bean>

同时存在下面的文件jdbc.properties:

jdbc.driverClassName=myDriverName jdbc.username=jefferyxu jdbc.password=password jdbc.url=url

客户端:

package beanfactory.postprocessor; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; import org.springframework.beans.factory.config.PropertyResourceConfigurer; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; public class BeanFactoryPropPlaceHolderUsage { public static void main(String[] args) { Resource resource = new ClassPathResource("applicationContext.xml"); ConfigurableBeanFactory context = new XmlBeanFactory(resource); // 根据配置文件生成PropertyResourceConfigurer PropertyResourceConfigurer propertyResourceConfigurer = new PropertyPlaceholderConfigurer() ; resource = new ClassPathResource("jdbc.properties"); propertyResourceConfigurer.setLocation(resource); // 执行真正的替换 propertyResourceConfigurer.postProcessBeanFactory((ConfigurableListableBeanFactory) context); // 去得配置之后的datasource MyDataSource dataSource = (MyDataSource)context.getBean("myDataSource"); System.out.println(dataSource.getDirverClassName()); } }

转载于:https://www.cnblogs.com/xuqiang/archive/2010/10/21/1953444.html

你可能感兴趣的文章
ubuntu如何部署tftp服务
查看>>
【Alpha版本】冲刺阶段——Day 8
查看>>
解决CentOS6.x或RedHat Linux 6.x版本不能通过System eth0以固定IP访问外网的问题
查看>>
(转)Expression Tree不完全入门
查看>>
Struts2的工作原理
查看>>
配置EditPlus使其可以编译运行java程序
查看>>
我眼中的Android IDE
查看>>
C++默认参数值函数
查看>>
java中的占位符\t\n\r\f
查看>>
7.14
查看>>
SDN2017 第一次作业
查看>>
MySQL通过frm 和 ibd 恢复数据过程
查看>>
AngularJs 学习笔记(2)
查看>>
关于元素优先级
查看>>
oo第一单元作业总结
查看>>
SRS源码——Listener
查看>>
web.xml 4.0 头
查看>>
Java面向对象抽象类案例分析
查看>>
100.Same Tree
查看>>
JAVA 根据经纬度算出附近的正方形的四个角的经纬度
查看>>