前言
上一篇的依賴注入是在配置文件中進行手工注入,今天再來學習一下基於註解的裝配。
註解方式
在java代碼中通過@Autowired或@Resource註解方式進行配置,但我們需要在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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
</beans>
@Autowired
- 使用註解方式對bean進行裝配,通過匹配數據類型進行裝配,該註解可以在類的成員變量,方法或者構造函數上進行註解,常用於對類的成員變量進行註解。
- 按照類型來裝配bean
- 消除了java中的getter/setter方法
- 消除xml配置文件中對於bean的屬性的配置
- 如果容器找不到註解的bean實例,會拋出異常,可以使用@Qualifier("name")來指定裝配bean的name,如果容器中沒有name相符的bean,則按照id匹配。
@Resource註解
用法:@Resource(name="xxx",type=xxx.class)
- 按照名稱裝配
- 如果同時指定了name和type屬性,則會從容器中尋找name和type相匹配的唯一的bean進行裝配,如果找不到,則拋出異常。
- 如果只指定name,則尋找name相匹配的,如果沒有,則按照id值尋找,找到匹配的bean進行裝配。
- 如果只指定了type,則按類型進行裝配,如果找到一個則進行裝配,如果沒找到或找到多個,則拋出異常。
- 如果即沒有指定name也沒有指定type,則默認按照nam匹配,如果name都不匹配,則按照類型來裝配。
實例
UserDao
package cn.sdut.dao;
public class UserDao {
public void saveUser() {
System.out.println("User is saved");
}
}
UserService
package cn.sdut.service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import cn.sdut.dao.UserDao;
public class UserService {
@Autowired //從容器中裝配userDao
private UserDao userDao;
public void print() {
userDao.saveUser();
}
}
Test
package cn.sdut.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.sdut.service.UserService;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) context.getBean("userService");
userService.print();
}
}
運行結果
沒有報空指針,裝配成功,@Resource註解效果一樣。
雖然不需要我們配置屬性了,但還是需要我們在xml中配置bean,依然很繁瑣,因此引出了包的自動掃描
包的自動掃描
beans.xml中將配置的bean刪除,加入包的自動掃描
<!-- 支持註解配置 -->
<context:annotation-config></context:annotation-config>
<!--包的自動掃描-->
<context:component-scan base-package="cn.sdut"></context:component-scan>
base-package就是你要掃描的包下,也就是cn.sdut開頭的所有包。
需要配合下面幾個註解使用
- @Repository //dao層註解
- @Service //邏輯層註解
- @Controller //控制層註解
- @Component //其他註解,不屬於以上各層或不好區分時,使用此註解
還是上次的實例
UserDao
package cn.sdut.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
public void saveUser() {
System.out.println("User is saved");
}
}
UserService
package cn.sdut.service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.sdut.dao.UserDao;
@Service
public class UserService {
@Autowired //從容器中裝配userDao
private UserDao userDao;
public void print() {
userDao.saveUser();
}
}
運行結果不變。
總結:從手工配置bean,配置bean的屬性->到使用註解、自動掃包,果然懶惰纔是第一生產力啊,古人誠不欺我。