1. 程式人生 > 其它 >@Autowired/@Qualifier/@Resource/@Value區別詳解

@Autowired/@Qualifier/@Resource/@Value區別詳解

技術標籤:Java 學習javaspring

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)測試
在這裡插入圖片描述