spring学习笔记一(IOC配置使用)

来源:互联网 发布:linux系统性能优化 编辑:程序博客网 时间:2024/06/05 05:04

1.Bean的命名

每个Bean可以有一个或多个id(或称之为标识符或名字),在这里我们把第一个id称为“标识符”,其余id叫做“别名”;这些id在IoC容器中必须唯一。如何为Bean指定id呢,有以下几种方式;

(一)不指定id,只配置必须的全限定类名,由IoC容器为其生成一个标识,客户端必须通过接口“T getBean(Class<T> requiredType)”获取Bean;

<bean class="com.cdqcookes.spring.chapter01.HelloWorldImpl"></bean>

测试的代码如下:

@Testpublic void test1(){BeanFactory beanFactory =  new ClassPathXmlApplicationContext("applicationContext.xml");  //根据类型获取bean  IHelloWorld helloApi = beanFactory.getBean(IHelloWorld.class);  helloApi.sayHello();  }

[2015-07-09 11:56:17.738]-[DEBUG] org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader Loading bean definitions[2015-07-09 11:56:17.758]-[DEBUG] org.springframework.beans.factory.xml.BeanDefinitionParserDelegate <strong>Neither XML 'id' nor 'name' specified - using generated bean name [com.cdqcookes.spring.chapter01.HelloWorldImpl#0</strong>]

从以上的输出日志可以看出,spring为我们动态生成了一个id:  com.cdqcookes.spring.chapter01.HelloWorldImpl#0


(二)指定一个id,该id必须在Ioc容器中唯一

<bean id="bean" class="com.cdqcookes.spring.chapter01.HelloWorldImpl"></bean>

测试的代码如下:

@Testpublic void test2(){BeanFactory beanFactory =  new ClassPathXmlApplicationContext("applicationContext.xml");  //根据id获取bean  IHelloWorld helloApi = (IHelloWorld)beanFactory.getBean("bean"); helloApi.sayHello();  }

(三)指定一个name,该name必须在Ioc容器中唯一

<bean name="bean" class="com.cdqcookes.spring.chapter01.HelloWorldImpl"></bean>
测试的代码如下:

@Testpublic void test3(){BeanFactory beanFactory =  new ClassPathXmlApplicationContext("applicationContext.xml");  //根据name获取bean  IHelloWorld helloApi = (IHelloWorld)beanFactory.getBean("bean"); helloApi.sayHello();  }

(四)指定id和name,id就是标识符,而name就是别名,必须在Ioc容器中唯一;

<bean name="alias" id="bean" class="com.cdqcookes.spring.chapter01.HelloWorldImpl"></bean><!-- 如果id和name一样,IoC容器能检测到,并消除冲突 -->  <bean name="bean1" id="bean1" class="com.cdqcookes.spring.chapter01.HelloWorldImpl"></bean>

测试的代码如下:

public void test4(){BeanFactory beanFactory =  new ClassPathXmlApplicationContext("applicationContext.xml");  //根据id获取bean  IHelloWorld helloApi = (IHelloWorld)beanFactory.getBean("bean"); helloApi.sayHello();  //根据别名获取bean  helloApi = (IHelloWorld)beanFactory.getBean("alias"); helloApi.sayHello();  //根据id获取bean  helloApi = (IHelloWorld)beanFactory.getBean("bean1"); helloApi.sayHello();  //因此别名不能和id一样,如果一样则由IoC容器负责消除冲突,不算别名 String[] alias = beanFactory.getAliases("bean1");Assert.assertEquals(0, alias.length);}
(五)指定多个name,多个name用"","," ",";"分割,第一个被用作标识符,其他的(alias1、alias2、alias3)是别名,所有标识符也必须在Ioc容器中唯一;spring的别名和标识对于方法getAliases没有区别,也就是说alias21的别名是bean2,alias22

<bean name="bean1;alias11,alias12;alias13 alias14"class=" com.cdqcookes.spring.chapter01.HelloWorldImpl" /><!-- 当指定id时,name指定的标识符全部为别名 --><bean id="bean2" name="alias21;alias22"class="com.cdqcookes.spring.chapter01.HelloWorldImpl" />

测试的代码如下:

@Test  public void test5() {  BeanFactory beanFactory =  new ClassPathXmlApplicationContext("applicationContext.xml");  //1根据id获取bean  IHelloWorld bean1 = beanFactory.getBean("bean1", IHelloWorld.class);  bean1.sayHello();  //2根据别名获取bean  IHelloWorld alias11 = beanFactory.getBean("alias11", IHelloWorld.class);  alias11.sayHello();  //3验证确实是四个别名         String[] bean1Alias = beanFactory.getAliases("bean1");  System.out.println("======= bean1 别名========");  for(String alias : bean1Alias) {  System.out.println(alias);  }  Assert.assertEquals(4, bean1Alias.length);  //根据id获取bean  IHelloWorld bean2 = beanFactory.getBean("bean2", IHelloWorld.class);  bean2.sayHello();  //2根据别名获取bean  IHelloWorld alias21 = beanFactory.getBean("alias21", IHelloWorld.class);  alias21.sayHello();  //验证确实是两个别名  String[] bean2Alias = beanFactory.getAliases("bean2");  System.out.println("======= bean2 别名========");  for(String alias : bean2Alias) {  System.out.println(alias);  }     Assert.assertEquals(2, bean2Alias.length);     }  
(六)、使用<alias>标签指定别名,别名也必须在IoC容器中唯一
<bean name="bean" class="com.cdqcookes.spring.chapter01.HelloWorldImpl"/>  <alias alias="alias1" name="bean"/>  <alias alias="alias2" name="bean"/>

测试的代码如下:

@Test  public void test6() {  BeanFactory beanFactory =  new ClassPathXmlApplicationContext("applicationContext.xml");  //根据id获取bean  IHelloWorld bean = beanFactory.getBean("bean", IHelloWorld.class);  bean.sayHello();  //根据别名获取bean  IHelloWorld alias1 = beanFactory.getBean("alias1", IHelloWorld.class);  alias1.sayHello();  IHelloWorld alias2 = beanFactory.getBean("alias2", IHelloWorld.class);  alias2.sayHello();  String[] beanAlias = beanFactory.getAliases("<span style="font-family: verdana, arial, helvetica, sans-serif;">alias2</span>");    for(String alias : beanAlias) {  System.out.println(alias);  }    Assert.assertEquals(2, beanAlias.length);  }  

2.实例化Bean

0 0