1. 程式人生 > 實用技巧 >Spring的幾種常用註解

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)中的測試結果一樣