一、bean的命名采用标准Java命名约定:小写字母开头,首字母大写间隔的命名方式。如accountManager、accountService etc...;
二、每个bean都有一个或多个id(或称之为标识符或名称,在术语 上可以理解成一回事)。这些id在当前IoC容器中必须唯一。如果 一个bean有多个id,那么其他的id在本质上将被认为是别名;
三、在对bean进行定义时,除了使用id属性来指定名称 之外,为了提供多个名称,需要通过name属性来加以指定 。而所有的这些名称都指向同一个bean;
四、在定义bean时就指定所有的别名并不是总是恰当的。有时我们期望 能在当前位置为那些在别处定义的bean引入别名。在XML配置文件中,可用 <alias/> 元素来完成bean别名的定义。
src下二个配置文件:bean.xml,beanAlias.xml
com.spring305.test.annotationBean包下TestBean.java,com.spring305.test.annotationBean.po包下:BeanA.java,InnerClassA.java,BeanAAnnotaion.java
代码及详细注释如下:
BeanA.java
public class BeanA { private static String name = "BeanA中的static变量"; public void initM(){//static System.out.println(BeanA.class+" in initM() method"); } public static void testStatic(){//static System.out.println(BeanA.class+" in testStatic method"); } public void destoryM(){ System.out.println(BeanA.class+" in destoryM() method"); } //static类型内部类 static class InnerClassAImpl implements InnerClassA{ @Override public void testInnerClass(){ //内部类中可以调用外部类中的变量,方法...etc System.out.println(InnerClassA.class+"内部类调用 "+name); testStatic(); } } }
InnerClassA.java
public interface InnerClassA { void testInnerClass(); }
TestBean.java
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.spring305.test.annotationBean.po.BeanA; import com.spring305.test.annotationBean.po.BeanAAnnotaion; import com.spring305.test.annotationBean.po.InnerClassA; public class TestBean { //@Test//xml public void TestBeanXML(){ ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"bean.xml","beanAlias.xml"}); //通过ID,测试环境,ID //BeanA a = ctx.getBean("beanA",BeanA.class); //通过别名,测试别名 //BeanA a = ctx.getBean("beanAName",BeanA.class);//bean使用name 定义 //BeanA a = ctx.getBean("beanAName2",BeanA.class);//bean使用name定义多个时 //BeanA a = ctx.getBean("toName",BeanA.class);//alias定义别名 BeanA a = ctx.getBean("toName2",BeanA.class);//alias定义别名 a.destoryM(); //测试内部类的bean InnerClassA ica = (InnerClassA)ctx.getBean("innerClass"); ica.testInnerClass(); } @Test//annotation public void TestApplicationContextEnv(){ ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanAAnnotaion.class); BeanAAnnotaion aBeanA = (BeanAAnnotaion)ctx.getBean("beanAAnnotaion"); System.out.println(aBeanA.test());; String msg = ctx.getBean("test2",String.class); System.out.println("msg "+msg); } }
BeanAAnnotaion.java
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class BeanAAnnotaion { @Bean(name = { "test1", "test2", "test3" }) public String test(){ return BeanAAnnotaion.class+" in test() method"; } }
bean.xml
<!-- 在本文件中也可以定义别名,貌似放在前面与放在后面都不影响初始化 --> <alias alias="toName2" name="beanAName2"/> <!-- 当同时存在id与name时,则只会生成以id为名的bean <bean id="beanA" name="beanAName" class="com.spring305.test.annotationBean.po.BeanA"></bean> --> <!-- 定义别名,中间可以用, ; 或者空格作间隔(separated by a comma (,), semicolon (;), or white space.) --> <bean name="beanAName beanAName2 beanAName3" class="com.spring305.test.annotationBean.po.BeanA"></bean> <!-- 下面是BeanA的一个内部类的加载及写法 --> <bean name="innerClass" class="com.spring305.test.annotationBean.po.BeanA$InnerClassAImpl"></bean> <bean id="beanB" class="com.spring305.test.annotationBean.po.BeanB"></bean>
beanAlias.xml
<!-- 这个可以在另外一个文件中为其中的一个XML中定义的名为beanAName2的bean来命名别名toName --> <alias alias="toName" name="beanAName2"/>
<!--EndFragment-->