Spring的幾種常用註解
Spring幾種常用的註解
註解 | 說明 |
@Component | 可以使用此註解描述Spring中的Bean,但它是一個泛化的概念,僅僅表示一個元件(Bean),並且可以作用的任何層次。使用時只需將該註解標註在相應類上即可。 |
@Repository | 用於將資料訪問層(DAO層)的類標識為Spring中的Bean,其功能與@Component相同。 |
@Service | 通常作用在業務層(Service層),用於將業務層的類標識為Spring中的Bean,其功能與@Component相同。 |
@Controller | 通常作用在控制層(如Spring MVC的Controller),用於將控制層的類標識為Spring中的Bean其功能與@Component相同。 |
@Autowired | 用於對Bean的屬性變數、屬性的setter方法及構造方法進行標註,配合對應的註解處理器完成Bean的自動配置工作。預設按照Bean的型別進行裝配。 |
@Resource | 其作用與@Autowired一樣。其區別在於@Autowired預設按Bean型別裝配,而@Resource預設按照Bean例項名稱進行裝配。@Resource中有兩個重要屬性:name和type。Spring將name屬性解析為Bean例項名稱,type屬性解析為Bean例項型別。如果指定name屬性,則按例項名稱進行裝配;如果指定type屬性,則按Bean型別進行裝配;如果都不指定,則先按Bean例項名稱裝配,如果不能匹配,再按照Bean型別進行裝配;如果都無法匹配,則丟擲NoSuchBeanDefinitionException異常 |
@Qualifier | 與@Autowired註解配合使用,會將預設的按Bean型別裝配修改為按Bean的例項名稱裝配,Bean的例項名稱由@Qualifier註解的引數指定。 |
測試demo1
1)建立一個dao介面,並在介面內定義一個方法
public interface UserDao { public void save(); } |
實現這個dao介面
//使用@Repository註解將UserDaoPmpl標識為Spring中的Bean, //其相當於 <bean id="userDao" class="org.lyl.annotation.UserDaoImpl"/> @Repository("userDao") public class UserDaoImpl implements UserDao{ @Override public void save() { // TODO Auto-generated method stub System.out.println("userDao.save"); } } |
其中@Repository註解相當於在spring容器中建立一個bean例項,即如下
<bean id="userDao" class="org.lyl.annotation.UserDaoImpl"/> |
@Repository("userDao")註解中的userDao相當於<bean/>中的id的值。@Repository註解一般用於dao層,即資料訪問層。在實現類UserDaoImpl中的save方法中新增一個列印輸出。
2)建立一個service介面,並在介面內定義一個方法
public interface UserService { public void save(); } |
實現這個service介面
**使用@Service註解將UserServiceImpl類標識為Spring中的Bean * 其相當於 <bean id="userService" class="org.lyl.annotation.UserServiceImpl"/> */ @Service("userService") public class UserServiceImpl implements UserService{ //使用Resource註解注入,按userDao例項名稱進行注入 //相當於<property name="useDao" ref="userDao"></property> @Resource(name="userDao") private UserDao userDao; public void save() { // TODO Auto-generated method stub this.userDao.save(); System.out.println("執行UserServic.save"); } } |
其中@Service註解相當於在spring容器中建立一個bean例項,即如下
<bean id="userService" class="org.lyl.annotation.UserServiceImpl"/> |
@Service("userService")中的userService與bean對應關係同上,@Service註解一般用於service層,即業務邏輯層,一般業務邏輯就是在service層處理的;在實現類UserServiceImpl中的save方法中新增一個列印輸出。
@Resourc註解<bean/>中的子元素<property/>,name相當於property中的name, @Service("userService")註解加@Resource(name="userDao")一起使用,等同於如下
<bean id="userService" class="org.lyl.annotation.UserServiceImpl"> <property name="useDao" ref="userDao"></property> </bean> |
@Resource(name="userDao")註解按名稱型別注入dao的實現類UserDaoImpl,即註解@Repository("userDao")中的例項化的bean
3)建立一個controller類
@Controller("userController") public class UserController { @Resource(name="userService") private UserService userService; public void save() { this.userService.save(); System.out.println("執行UserController.save"); } } |
@Controller註解將UserController標識為Spring中的bean
@Resource(name="userService")按名稱將userService注入到controller中等同於
<bean id=" userController " class="org.lyl.annotation. UserController "> <property name=" userService " ref=" userService "></property> </bean> |
4)建立一個配置檔案beans.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-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd "> <!-- 將指定類配置給spring,讓spring建立其物件的例項 --> <!-- 使用context名稱空間在配置檔案中開啟相應的註解處理器 --> <context:annotation-config></context:annotation-config> <!-- 分別定義3個例項 --> <bean id="userDao" class="org.lyl.annotation.UserDaoImpl"></bean> <bean id="userService" class="org.lyl.annotation.UserServiceImpl"></bean> <bean id="userController" class="org.lyl.annotation.UserController"></bean>
<!-- 使用context名稱空間通知spring掃描指定包下所有Bean類,進行註解解析 --> <!-- <context:component-scan base-package="org.lyl.annotation"></context:component-scan> -->
</beans> |
通過配置 <context:annotation-config/>開啟註解處理器
5)建立一個測試類
public class AnnotationTest { public static void main(String[] args) { String xmlPath="org/lyl/annotation/beans.xml"; ApplicationContext context=new ClassPathXmlApplicationContext(xmlPath); UserController controller=(UserController) context.getBean("userController"); controller.save(); } } |
執行結果如圖
結果顯示spring註解呼叫成功
6)當檔案中的註解很多時xml定義的例項會有很多
<context:annotation-config></context:annotation-config> <bean id="userDao" class="org.lyl.annotation.UserDaoImpl"></bean> <bean id="userService" class="org.lyl.annotation.UserServiceImpl"></bean> <bean id="userController" class="org.lyl.annotation.UserController"></bean> … … |
會顯得xml配置檔案很臃腫,這時可以開啟註解註解掃描器,自動掃描包下的所有註解
<!-- 使用context名稱空間通知spring掃描指定包下所有Bean類,進行註解解析 --> <context:component-scan base-package="org.lyl.annotation"/> |
一行可以替上代面多行
7)註解在一定程度上減少程式碼量,一些公司在不使用註解時要減少程式碼量,可以使用自動裝配,Spring的<bean/>標籤中有一個autowire的屬性,可以設定autowire屬性值來自動裝配bean,所謂的自動裝配,就是將bean注入到其他bean子元素的<property/>中,autowire屬性有5個值,
defaul:根據上級標籤的<beans/>的屬性值而定,
byName:根據屬性名自動裝配,容器將根據名稱自動查詢與屬性完全一致的bean,並將其屬性自動裝配,
byType:根據屬性型別type自動裝配,如果一個Bean的資料型別相容另一個Bean的資料型別,則自動裝配,
constructor:根據構造器引數型別進行byType自動裝配,
no:預設情況下不使用自動裝配,bean依賴必須通過ref元素定義;
demo步驟
刪除dao實現類,service實現類,controler類的中的註解,使用setter()方自動裝配bean例項
a.在UserServiceImpl類中建立setUserService方法
public void setUserService(UserService userService) { this.userService = userService; } |
b.在controller類中建立setUserService方法
public void setUserService(UserService userService) { this.userService = userService; } |
c.修改配置檔案,設定<bean/>標籤的autowire屬性值
<?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-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd "> <!-- 將指定類配置給spring,讓spring建立其物件的例項 --> <!-- 使用context名稱空間在配置檔案中開啟相應的註解處理器 --> <!-- 分別定義3個例項 --> <!-- 使用bean元素的autowired屬性完成自動裝配 --> <bean id="userDao" class="org.lyl.annotation.UserDaoImpl"></bean> <bean id="userService" class="org.lyl.annotation.UserServiceImpl" autowire="byName"></bean> <bean id="userController" class="org.lyl.annotation.UserController" autowire="byName"></bean> </beans> |
執行測試結果和5)中的測試結果一樣