续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,所以会报错