Spring常用的接口和类(二)
七、BeanPostProcessor接口
???? 当需要对受管bean进行预处理时,可以新建一个实现BeanPostProcessor接口的类,并将该类配置到Spring容器中。
???? 实现BeanPostProcessor接口时,需要实现以下两个方法:
????????? postProcessBeforeInitialization 在受管bean的初始化动作之前调用
??? ????? postProcessAfterInitialization 在受管bean的初始化动作之后调用
????,容器中的每个Bean在创建时都会恰当地调用它们。代码展示如下:
public class CustomBeanPostProcessor implements BeanPostProcessor {/** * 初始化之前的回调方法 */public Object postProcessBeforeInitialization(Object bean, String beanName)throws BeansException {System.out.println("postProcessBeforeInitialization: " + beanName);return bean;}/** * 初始化之后的回调方法 */public Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException {System.out.println("postProcessAfterInitialization: " + beanName);return bean;}}?
<!-- 自定义受管Bean的预处理器:Spring容器自动注册它 --><bean id="customBeanPostProcessor" name="code">public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println(beanFactory.getClass().getSimpleName());}}?
<!-- 自定义Bean工厂的预处理器:Spring容器自动注册它 --><bean id="customBeanFactoryPostProcessor" name="code"><bean id="propertyPlaceholderConfigurer" destroy-method="close"><property name="driverClassName"><value>${jdbc.driverClassName}</value></property><property name="url"><value>${jdbc.url}</value></property><property name="username"><value>${jdbc.username}</value></property><property name="password"><value>${jdbc.password}</value></property></bean>?
???????????? PropertyPlaceholderConfigurer的另一种精简配置方式(context命名空间):
<context:property-placeholder location="classpath:jdbc.properties, classpath:mails.properties"/>
?
??????????? Java属性文件内容:
?????????????????? jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
?????????????????? jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
?????????????????? jdbc.username=qycd
?????????????????? jdbc.password=qycd
?
?????????? 除了可以读取Java属性文件中的属性外,还可以读取系统属性和系统环境变量的值。
???????????????? 读取系统环境变量的值:${JAVA_HOME}
???????????????? 读取系统属性的值:${user.dir}
?
???????? 2、PropertyOverrideConfigurer类
?????????????? 用于读取Java属性文件中的属性,并覆盖XML配置文件中的定义,即PropertyOverrideConfigurer允许XML配置文件中有默认的配置信息。
?
?????????????? Java属性文件的格式:
????????????????????? beanName.property=value
?
????????????????????? beanName是属性占位符企图覆盖的bean名,property是企图覆盖的数姓名。
<bean id="propertyOverrideConfigurer" destroy-method="close"><property name="driverClassName" value="11"/><property name="url" value="22"/><property name="username" value="33"/><property name="password" value="44"/></bean>
?
????????? Java属性文件内容:
??????????????? dataSource.driverClassName=oracle.jdbc.driver.OracleDriver
??????????????? dataSource.url=jdbc:oracle:thin:@localhost:1521:orcl
??????????????? dataSource.username=qycd
??????????????? dataSource.password=qycd
?
九、ResourceBundleMessageSource类
????? 提供国际化支持,bean的名字必须为messageSource。此处,必须存在一个名为jdbc的属性文件。
<bean id="messageSource" name="code">welcome={0}, welcome to guangzhou!?
AbstractApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");ctx.getMessage("welcome", new String[]{"张三"}, "", Locale.CHINA);?
十、FactoryBean接口
???? 用于创建特定的对象,对象的类型由getObject方法的返回值决定。
public class MappingFactoryBean implements FactoryBean {/** * 获取mapping配置对象 * @return mapping配置 */ public Object getObject() throws Exception { List<String> configs = ApplicationContext.getContext().getApplication().getMappingConfigs(); return configs.toArray(new String[configs.size()]); } /** * 返回Bean的类型 * @return Bean的类型 */ public Class<?> getObjectType() { return String[].class; } /** * 返回Bean是否是单例的 * @return true表示是单例的 */ public boolean isSingleton() { return true; }}?
public class MappingAutowiring implements BeanPostProcessor { /** * 映射配置 */ private String[] mappingResources; /** * 获取映射配置信息 * @return 映射配置 */ public String[] getMappingResources() { return mappingResources; } /** * 设置映射配置信息 * @param mappingResources 映射配置 */ public void setMappingResources(String[] mappingResources) { this.mappingResources = mappingResources; } /** * 自动装配 * @param bean Spring容器托管的bean * @param beanName Bean名称 * @return 装配了映射文件后的对象 */ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof LocalSessionFactoryBean) { ((LocalSessionFactoryBean) bean).setMappingResources(mappingResources); } return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; }}?
<bean id="mappingAutowiring" ref="mappingResources" /></bean><bean id="mappingResources" />
?