Beand的高级特征

Spring程序中,Java Bean一般与Spring是非耦合的,不会依赖于Spring类库。这也是Spring的优点。

 

实现BeanNameAware接口获取本bean的id属性

BeanNameAware中一个方法setBeanName(String arg0);它会在bean所有参数设置后 init-method之前调用,在bean中声明一个属性接受。

实现BeanFactoryAware可以获取该bean对应的BeanFactory。

demo:

package com.dao.impl;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;

public class FindBeanName implements BeanNameAware,BeanFactoryAware{
    private String beanName;
    private BeanFactory beanFactory;
    public void setBeanName(String beanName) {
        
        this.beanName=beanName;
    }
    public String getBeanName(){
        return beanName;
    }
    public void setBeanFactory(BeanFactory arg0) throws BeansException {
        this.beanFactory=arg0;    
    }
    public BeanFactory getBeanFactory(){
        return beanFactory;
    }

}


package com.test;

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

import com.Model.Cat;
import com.dao.impl.FindBeanName;

public class TestAware {
    @Test
    public void GetName(){
        XmlBeanFactory factory=new XmlBeanFactory(
                new ClassPathResource("com/test/applicationContext.xml"));
        FindBeanName dbn=(FindBeanName) factory.getBean("hehe");
        System.out.println(dbn.getBeanName());
        BeanFactory fa=dbn.getBeanFactory();
        Cat cat=(Cat) fa.getBean("cat");
        System.out.println(cat.getName());
    }

}
View Code

实现DisposableBean接口执行销毁方法。

被bean中的destory-method属性替代,一般不使用

实现InitializingBean接口执行初始化方法。

被bean的init-method属性替代,一般不使用

 

BeanFactory对象的几个常用的方法:

boolean containsBean(String):判断指定名称的Bean是否存在

Object getBean(String):返回指定名称的Bean。如果没有,会抛出异常

Object getBean(String,Class):返回指定名称的Bean,并进行类型转换成类对象。两个过程中出错都会异常

boolean isSingleton(String):判断指定名称的Bean是否配置为singleton。没有bean,抛出异常

String[] getAliases(String):获取指定名称bean的所有别名的数组

 

属性覆盖器

对于一些参数,更实用更简单的方法是使用properties配置,而不是配置在Spring的配置文件中。Spring提供属性替代属性,允许把某些属性配置在properties文件中。

 

配置PropertyOverrideConfigurer属性覆盖器。

PropertyOverrideConfigure允许把XML配置里的魔偶写参数配置到properties文件中。这些在数据库配置中很常用。配置时需要配置一个PropertyOverrideConfigure对象,指定properties文件的位置,然后把替换的属性用形如${jdbc.url}的字符串替代。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
    <bean id="configproperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <!--<property name="location" value="config.properties"/>  一个properties文件
        -->
        <property name="locations"> <!-- 多个properties文件 -->
            <list>
                <value>com/Test/config.properties</value>
                <value>config1.properties</value>
            </list>    
        </property>
    </bean>
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="properties" ref="configproperties"/>
    </bean>
    <bean id="cat" class="com.Model.Cat">
        <property name="name" value="${C.name}"></property>
        <property name="age" value="${C2.age}"></property>
    </bean>
    
</beans>
View Code

 

posted @ 2016-05-06 13:54  guodaxia  阅读(518)  评论(0编辑  收藏  举报