读书人

Spring惯用的接口和类(二)

发布时间: 2012-10-26 10:30:59 作者: rapoo

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" />

?

读书人网 >软件架构设计

热点推荐