1. 程式人生 > >Spring註解標籤詳解@Autowired @Qualifier等

Spring註解標籤詳解@Autowired @Qualifier等

@Autowired

spring2.1中允許使用者通過@Autowired註解對Bean的屬性變數.屬性Setter方法以及建構函式進行標註,配合AutowiredAnnotationBeanProcessor完成Bean的自動配置。使用@Autowired註釋進行byType注入。

在applicationContext.xml中加入:

<!-- 該 BeanPostProcessor 將自動對標註 @Autowired 的 Bean 進行注入 -->
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"
/>

通過 @Autowired的使用來消除 set ,get方法。

@Autowired
private UserDao userdao;

這樣就可以刪除set ,get方法和spring中的相關配製了。

<bean id="userDao" class="..."/>
<bean id="userService" class="...">
    <property name="userDao">
      <ref bean="userDao"/>
    </property>
</bean>

通過@Autowired屬的Setter方法給父類中的屬性注入值。

    @Autowired
    public void setDataSource(DataSource dataSource)
    {
        super.setDataSource(dataSource);
    }

@Autowired(required = false)

當不能確定 Spring 容器中一定擁有某個類的 Bean 時,可以在需要自動注入該類 Bean 的地方可以使用 @Autowired(required = false) ,這等於告訴 Spring:在找不到匹配 Bean 時也不報錯。

當然,一般情況下,使用 @Autowired 的地方都是需要注入 Bean 的,使用了自動注入而又允許不注入的情況一般僅會在開發期或測試期碰到(如為了快速啟動 Spring 容器,僅引入一些模組的 Spring 配置檔案),所以 @Autowired(required = false) 會很少用到。

@Qualifier

使用@Autowired註釋進行byType注入,如果需要byName(byName就是通過id去標識)注入,增加@Qualifier註釋。一般在候選Bean數目不為1時應該加@Qualifier註釋。

在預設情況下使用 @Autowired 註釋進行自動注入時,Spring 容器中匹配的候選 Bean 數目必須有且僅有一個。當找不到一個匹配的 Bean 時,Spring 容器將丟擲

BeanCreationException 異常,並指出必須至少擁有一個匹配的 Bean。

和找不到一個型別匹配 Bean 相反的一個錯誤是:如果 Spring 容器中擁有多個候選 Bean,Spring 容器在啟動時也會丟擲 BeanCreationException 異常。

Spring 允許我們通過 @Qualifier 註釋指定注入 Bean 的名稱,這樣歧義就消除了,可以通過下面的方法解決異常:

@Autowired
public void setOffice(@Qualifier("office")Office office)
{
    this.office =office;
}

也可以直接注入到屬性:

@Autowired 
@Qualifier("office") 
private Office office;

@Qualifier(“office”)中的office是Bean的名稱,所以@Autowired和@Qualifier結合使用時,自動注入的策略就從byType轉變成byName了。

@Autowired可以對成員變數、方法以及建構函式進行註釋,而@Qualifier的標註物件是成員變數、方法入參、建構函式入參。正是由於註釋物件的不同,所以Spring不將 @Autowired和@Qualifier統一成一個註釋類。

@Qualifier 只能和@Autowired 結合使用,是對@Autowired有益的補充。

一般來講,@Qualifier對方法簽名中入參進行註釋會降低程式碼的可讀性,而對成員變數註釋則相對好一些。

@Resource

Spring不但支援自己定義的@Autowired註解,還支援幾個由JSR-250規範定義的註解,它們分別是@Resource、@PostConstruct以及@PreDestroy。

@Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource預設按 byName自動注入罷了。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析為bean的名字,而type屬性則解析為bean的型別。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。

@Resource裝配順序

1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則丟擲異常

2. 如果指定了name,則從上下文中查詢名稱(id)匹配的bean進行裝配,找不到則丟擲異常

3. 如果指定了type,則從上下文中找到型別匹配的唯一bean進行裝配,找不到或者找到多個,都會丟擲異常

4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始型別進行匹配,如果匹配則自動裝配;

@Component、@Repository、@Service、@Controller

Spring 2.5 中除了提供 @Component 註釋外,還定義了幾個擁有特殊語義的註釋,它們分別是:@Repository、@Service 和 @Controller。

在目前的 Spring 版本中,這 3 個註釋和 @Component 是等效的,但是從註釋類的命名上,很容易看出這 3 個註釋分別和持久層、業務層和控制層(Web 層)相對應。

雖然目前這3 個註釋和 @Component 相比沒有什麼新意,但 Spring 將在以後的版本中為它們新增特殊的功能。

所以,如果 Web 應用程式採用了經典的三層分層結構的話,最好在持久層、業務層和控制層分別採用上述註解對分層中的類進行註釋。

@Service用於標註業務層元件

@Controller用於標註控制層元件(如struts中的action)

@Repository用於標註資料訪問元件,即DAO元件

@Component泛指元件,當元件不好歸類的時候,我們可以使用這個註解進行標註。

@Service
public class VentorServiceImpl implements iVentorService {   
}
@Repository
public class VentorDaoImpl implements iVentorDao { 
}

在一個稍大的專案中,如果元件採用xml的bean定義來配置,顯然會增加配置檔案的體積,查詢以及維護起來也不太方便。

Spring2.5為我們引入了元件自動掃描機制,他在類路徑下尋找標註了上述註解的類,並把這些類納入進spring容器中管理。

它的作用和在xml檔案中使用bean節點配置元件時一樣的。要使用自動掃描機制,我們需要開啟以下配置資訊:

<?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-2.5.xsd


http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 

    <context:annotation-config />
    <context:component-scan base-package=”com.iteedu.spring”>   
</beans>

annotation-config是對標記了@Required、@Autowired、@PostConstruct、@PreDestroy、@Resource、@WebServiceRef、@EJB、@PersistenceContext、@PersistenceUnit等註解的類進行對應的操作使註解生效。

base-package為需要掃描的包(含所有子包),負責掃描那些類有註解。

可以使用以下方式指定初始化方法和銷燬方法:

@PostConstruct
public void init() { 
} 
@PreDestroy
public void destory() { 
}
from: http://www.voidcn.com/blog/u013144121/article/p-2933655.html

http://iteedu.com/blog/2012/12/18/222.html

相關推薦

Spring註解標籤@Autowired @Qualifier @Slf4j

 @Slf4j @Slf4j註解實現日誌輸出       自己寫日誌的時候,肯定需要: private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);1每次寫新的類

Spring註解標籤@Autowired @Qualifier

@Autowired spring2.1中允許使用者通過@Autowired註解對Bean的屬性變數.屬性Setter方法以及建構函式進行標註,配合AutowiredAnnotationBeanProcessor完成Bean的自動配置。使用@Autowired註釋進行b

Spring註解標籤@Autowired @Qualifier

@Autowired spring2.1中允許使用者通過@Autowired註解對Bean的屬性變數.屬性Setter方法以及建構函式進行標註,配合AutowiredAnnotationBeanProcessor完成Bean的自動配置。使用@Autowired註釋進行byType注入。 在a

Spring配置檔案中 註解標籤

<context:annotation-config/> 在基於主機方式配置Spring時,Spring配置檔案applicationContext.xml,你可能會見<context:annotation-config/>這樣一條配置

Spring 註解@Value

一 配置方式 @value需要引數,這裡引數可以是兩種形式: @Value("#{configProperties['t1.msgname']}")或者@Value("${t1.msgname}"); 這兩形式,在配置上有什麼區別: 1、@Value("#{configPrope

springmvc常用註解標籤

1、@Controller 在SpringMVC 中,控制器Controller 負責處理由DispatcherServlet 分發的請求,它把使用者請求的資料經過業務處理層處理之後封裝成一個Model ,然後再把該Model 返回給對應的View 進行展示。在Spring

Spring 註解@Transactional

在service類前加上@Transactional,宣告這個service所有方法需要事務管理。每一個業務方法開始時都會開啟一個事務。 Spring預設情況下會對執行期例外(RunTimeException)進行事務回滾。這個例外是unchecked如果遇到checked意外

springmvc 常用註解標籤

1、@Controller 在SpringMVC 中,控制器Controller 負責處理由DispatcherServlet 分發的請求,它把使用者請求的資料經過 業務處理層 處理之後封裝成一個Model ,然後再把該Model 返回給對應的View 進行展示。 在

Spring註解 @Scope

0.思維導圖 1. scope概論 spring中scope是一個非常關鍵的概念,簡單說就是物件在spring容器(IOC容器)中的生命週期,也可以理解為物件在spring容器中的建立方式。 2. scope歷史及分類 目前,scope的取值有5種取值:

面試:----springmvc常用註解標籤

1、@Controller 在SpringMVC 中,控制器Controller 負責處理由DispatcherServlet 分發的請求,它把使用者請求的資料經過業務處理層處理之後封裝成一個Model ,然後再把該Model 返回給對應的View 進行展示。在Spri

spring AOP解析之註解方式

parser 分享 pro asp mes aop log space spec 命名空間處理器是AopNamespaceHandler,我們可以看到這裏註冊了幾個解析器,第一個我們知道是xml形式的解析,接下來我們看AspectJAutoProxyBeanDefiniti

Spring Boot中使用MyBatis註解配置(1)

sql type .org 實體 sch 整合 PE 匯總 同傳 之前在Spring Boot中整合MyBatis時,采用了註解的配置方式,相信很多人還是比較喜歡這種優雅的方式的,也收到不少讀者朋友的反饋和問題,主要集中於針對各種場景下註解如何使用,下面就對幾種常見的情況舉

6. Spring:Java註解技術

6. Spring:Java註解技術詳解 自定義註解示例:https://blog.csdn.net/wangpengzhi19891223/article/details/78131137/ Java註解技術基本概念 Annotation是Java5開始引入的新特徵。中文

Java程式設計師從笨鳥到菜鳥之(七十二)細談Spring(四)利用註解實現spring基本配置

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

spring bean註解使用

@Bean 的用法 @Bean是一個方法級別上的註解,主要用在@Configuration註解的類裡,也可以用在@Component註解的類裡。新增的bean的id為方法名 定義bean 下面是@Configuration裡的一個例子 @Configuration publi

spring定時任務(@Scheduled註解

在springMVC裡使用spring的定時任務非常的簡單,如下: (一)在xml里加入task的名稱空間 xmlns:task="http://www.springframework.org/schema/task" http://www.spr

Spring Boot中使用MyBatis註解配置

   轉自翟永超 之前在Spring Boot中整合MyBatis時,採用了註解的配置方式,相信很多人還是比較喜歡這種優雅的方式的,也收到不少讀者朋友的反饋和問題,主要集中於針對各種場景下註解如何使用,下面就對幾種常見的情況舉例說明用法。 在做下面的示例之前,先準備一

Spring學習筆記 —— AOP標籤()

引言 但是,除了面向切面程式設計之外,AOP的名字空間中還包含了一些重要的標籤,比如”scoped-proxy”。這篇文章就會詳細介紹這個標籤的作用,以及它的實現方式分析。 scoped-proxy 標籤介紹 在 Spring學習筆記 —

spring中freemarker自定義標籤

最近因工作需要,從網上搜了一個jeecms網站,準備進行借鑑使用,發現裡面對模板用的不錯,前面雖說也對freemarker有用,但是還沒有這麼深入,所以就查了一些資料,下面進行總結下。 一、jar包準備 首先是Spring、SpringMVC的依賴jar包…… 然後是Fr

spring-boot-starter-logging logback常用配置之標籤

logback 常用配置詳解(二) <appender> <appender>: <appender>是<configuration>的子節點,是負責寫日誌的元件。 <appender>有兩個必要