Spring-IoC-DI-基于注解方式的依赖注入-(案例五:使用@Resource注解实现根据名称或属性类型实现自动装配)
案例五:使用@Resource注解实现根据名称或属性类型实现自动装配
@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
一、默认按照名称进行装配
(1)创建两个dao类、一个service类
@Repository public class UserDao { public void addBook() { System.out.println("userDao正在保存user"); } }
@Repository public class UserDaoExt extends UserDao { @Override public void addBook() { System.out.println("UserDaoExt正在为你添加user"); } }
@Service public class UserService { @Resource private UserDao userDao; public void add() { System.out.println("Service正在调用Dao"); userDao.addBook(); } }
(2)配置文件,开启组件扫描
<context:component-scan base-package="com.orz.spring"/>
(3)测试
@Test public void test1() { ConfigurableApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml"); UserService userService = applicationContext.getBean("userService", UserService.class); userService.add(); }
(4)结果
Service正在调用Dao
userDao正在保存user
二、按照指定名称匹配
@Service
public class UserService {
@Resource(name = "userDaoExt")
private UserDao userDao;
public void add()
{
System.out.println("Service正在调用Dao");
userDao.addBook();
}
}
Service正在调用Dao UserDaoExt正在为你添加user
三、按照指定类型匹配
@Service public class UserService { @Resource(type = UserDaoExt.class) private UserDaoExt userD; public void add() { System.out.println("Service正在调用Dao"); userD.addBook(); } }
Service正在调用Dao
UserDaoExt正在为你添加user