`
在水伊方
  • 浏览: 107521 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Spring应用注解完成属性装配

 
阅读更多

续Spring依赖注入的方式:http://huangminwen.iteye.com/blog/1041743

 

在一个项目中,我们的Spring文件中会有许多bean,每个bean中都有一些属性,如果把所有bean的属性都配置在配置文件中,那么这时候我们的Spring配置文件是臃肿不堪的,而且维护起来也不方便,Spring为我们提供了用@Resource注解完成属性装配的功能解决这个问题

 

此时我们的配置文件变成了

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans   
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	
	<context:annotation-config />

	<bean id="personDAOBean" class="org.spring.dao.impl.PersonDAOBean" />

	<bean id="personServiceBean" class="org.spring.service.impl.PersonServiceBean"
		scope="prototype" />

</beans>  

 

此时的配置中就只有bean的信息了,显得很简洁,可以看到配置文件中增加了命名空间

xmlns:context=http://www.springframework.org/schema/context

与schemaLocation

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd

还有标签

<context:annotation-config />

 

这个配置隐式注册了多个对注释进行解析处理的处理器:

AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor

要想应用@Resource注解,则需要引入common-annotations.jar,该jar文件在spring安装目录的lib\j2ee下面

 

此时PersonServiceBean修改如下

package org.spring.service.impl;

import javax.annotation.Resource;

import org.spring.dao.PersonDAO;
import org.spring.service.PersonService;

public class PersonServiceBean implements PersonService {
	@Resource
	private PersonDAO personDAO;

	public void showMessage() {
		personDAO.add();
	}
}

 

测试类

package org.spring;

import org.junit.Test;
import org.spring.service.PersonService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {
	@Test
	public void test() {
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				"spring.xml");

		PersonService personService = (PersonService) ctx
				.getBean("personServiceBean");
		
		personService.showMessage();
	}
}

 

控制台结果

执行PersonDAOBean中的增加方法!

 

我们也可以把@Resource注解作用在setter方法上面,此时PersonServiceBean修改如下

package org.spring.service.impl;

import javax.annotation.Resource;

import org.spring.dao.PersonDAO;
import org.spring.service.PersonService;

public class PersonServiceBean implements PersonService {
	private PersonDAO personDAO;

	public void showMessage() {
		personDAO.add();
	}

	@Resource
	public void setPersonDAO(PersonDAO personDAO) {
		this.personDAO = personDAO;
	}
	
}

 

@Resource默认按名称装配,名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象,当找不到与名称匹配的bean才会按类型装配。

 

注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。如:

package org.spring.service.impl;

import javax.annotation.Resource;

import org.spring.dao.PersonDAO;
import org.spring.service.PersonService;

public class PersonServiceBean implements PersonService {
	private PersonDAO personDAO;

	public void showMessage() {
		personDAO.add();
	}

	@Resource(name="xxx")
	public void setPersonDAO(PersonDAO personDAO) {
		this.personDAO = personDAO;
	}
	
}

 

此时Spring配置中并没有名称为xxx的bean,所以会报错

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics