@Autowired/@Qualifier/@Resource/@Value區別詳解
1 @Autowired
@Autowired
根據屬性型別進行自動裝配。
(1)建立 service 和 dao 類,並在類上新增在bean中建立例項的註解。
UserDao 介面:
public interface UserDao {
void addUser();
}
UserDaoImpl 實現類:
@Repository
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
System. out.println("dao add....");
}
}
UserService:
// 相當於 <bean id="userService" class="com.hjc.auto.service.UserService"/>
// value = "userService" 可以不寫,預設是類名的首字母小寫
@Service(value = "userService")
public class UserService {
public void addUser() {
System.out.println("service add......");
}
}
別忘了需要在xml配置檔案中開啟元件掃描。
<?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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--寫法一:如果掃描多個包,使用逗號隔開-->
<context:component-scan base-package="com.hjc.auto.dao, com.hjc.auto.service"/>
</beans>
(2)在 service 注入 dao 物件,在 service 類新增 dao 型別屬性,在屬性上面使用註解。
@Autowired
是根據屬性型別來注入的,此處的屬性型別是 UserDao
它就會去找到此介面的實現類 UserDaoImpl
進行注入,然後我們就可以成功調到 userDao.addUser()
方法。
@Service(value = "userService")
public class UserService {
@Autowired
private UserDao userDao;
public void addUser() {
System.out.println("service add......");
userDao.addUser();
}
}
(3)測試
@Test
public void test4() {
ApplicationContext context = new ClassPathXmlApplicationContext("beanAuto.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.addUser();
}
2 @Qualifier
@Qualifier
是根據屬性名稱進行注入。
@Qualifier
註解的使用,需要和上面 @Autowired
一起使用。
Tips:有時候一個介面會有多個實現類,因此就必須要用 @Qualifier
註解根據名稱來說明到底要注入哪一個類。
(1)我給 UserDaoImpl
在 bean 中建立的例項物件取一個名稱 hjc
.
@Repository(value = "hjc")
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
System.out.println("dao add....");
}
}
(2)此時 UserService
類中,給 UserDao
注入屬性的時候就需要用 @Qualifier(value = "hjc")
來說明我要注入的類是哪一個。
@Service(value = "userService")
public class UserService {
@Autowired
@Qualifier(value = "hjc")
private UserDao userDao;
public void addUser() {
System.out.println("service add......");
userDao.addUser();
}
}
(3)如果我改成 hjc1
則會報錯。
@Autowired
@Qualifier(value = "hjc1")
private UserDao userDao;
3 @Resource
@Resource
可以根據屬性型別注入,也可以根據屬性名稱注入。
// @Resource // 根據型別進行注入
@Resource(name = "hjc") // 根據名稱進行注入
private UserDao userDao;
Tips:
@Resource
屬於 javax.annotation.Resource;
@Autowired
屬於 org.springframework.beans.factory.annotation.Autowired;
@Qualifier
屬於 org.springframework.beans.factory.annotation.Qualifier;
由於,@Autowired
和 @Qualifier
都是 Spring 原生的,而 @Resource
不是,因此更建議使用前者。
4 @Value
@Value
注入普通型別屬性。
(1)我們在 UserService
類中,新增一個 username
屬性,並用 @Value
註解注入 張三
。
@Service(value = "userService")
public class UserService {
@Value(value = "張三")
private String username;
@Autowired
@Qualifier(value = "hjc")
private UserDao userDao;
public void addUser() {
System.out.println("service add......");
System.out.println(username);
userDao.addUser();
}
}
(2)測試