关闭

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

40人阅读 评论(0) 收藏 举报
分类:

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>

测试的代码如下:

@Test
	public 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>

测试的代码如下:

@Test
	public 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>
测试的代码如下:

@Test
	public 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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:42次
    • 积分:10
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档