Spring IOC的描述和Spring的註解(轉)

Spring經常使用的註解

本文系轉載:轉載網址:html

http://www.cnblogs.com/xdp-gacl/p/3495887.htmljava

http://ljhzzyx.blog.163.com/blog/static/38380312201371385956237/spring

若是有侵犯您權益的地方,請您及時通知我,本人將即刻中止侵權行爲!數據庫

使用註解來構造IoC容器安全

先增長:app

用註解來向Spring容器註冊Bean。須要在applicationContext.xml中註冊<context:component-scan base-package=」pagkage1[,pagkage2,…,pagkageN]」/>ide

如:在base-package指明一個包函數

1 <context:component-scan base-package="cn.gacl.java"/>工具

代表cn.gacl.java包及其子包中,若是某個類的頭上帶有特定的註解【@Component/@Repository/@Service/@Controller】,就會將這個對象做爲Bean註冊進Spring容器。this

也能夠在<context:component-scan base-package=」 」/>中指定多個包,如:

<context:component-scan base-package="cn.gacl.dao.impl,cn.gacl.service.impl,cn.gacl.action"/>

多個包逗號隔開

一、@Component

@Component
是全部受Spring 管理組件的通用形式,@Component註解能夠放在類的頭上,@Component不推薦使用。

二、@Controller

@Controller對應表現層的Bean,也就是Action,例如:

@Controller

@Scope("prototype")

public class UserAction extends BaseAction<User>{

……

 }

使用@Controller註解標識UserAction以後,就表示要把UserAction交給Spring容器管理,在Spring容器中會存在一個名字爲"userAction"的action,這個名字是根據UserAction類名來取的。注意:若是@Controller不指定其value【@Controller】,則默認的bean名字爲這個類的類名首字母小寫,若是指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,則使用value做爲bean的名字。

這裏的UserAction還使用了@Scope註解,@Scope("prototype")表示將Action的範圍聲明爲原型,能夠利用容器的scope="prototype"來保證每個請求有一個單獨的Action來處理,避免struts中Action的線程安全問題。spring 默認scope 是單例模式(scope="singleton"),這樣只會建立一個Action對象,每次訪問都是同一Action對象,數據不安全,struts2 是要求每次次訪問都對應不一樣的Action,scope="prototype" 能夠保證當有請求的時候都建立一個Action對象

三、@ Service

@Service對應的是業務層Bean,例如:

 @Service("userService")

 public class UserServiceImpl implements UserService {

………

}

@Service("userService")註解是告訴Spring,當Spring要建立UserServiceImpl的的實例時,bean的名字必須叫作"userService",這樣當Action須要使用UserServiceImpl的的實例時,就能夠由Spring建立好的"userService",而後注入給Action:在Action只須要聲明一個名字叫「userService」的變量來接收由Spring注入的"userService"便可,具體代碼以下:

 // 注入userService

 @Resource(name = "userService")【使用Resource註解,標明須要使用哪一個bean】

 private UserService userService;

注意:在Action聲明的「userService」變量的類型必須是「UserServiceImpl」或者是其父類「UserService」,不然因爲類型不一致而沒法注入,因爲Action中的聲明的「userService」變量使用了@Resource註解去標註,而且指明瞭其name = "userService",這就等於告訴Spring,說我Action要實例化一個「userService」,你Spring快點幫我實例化好,而後給我,當Spring看到userService變量上的@Resource的註解時,根據其指明的name屬性能夠知道,Action中須要用到一個UserServiceImpl的實例,此時Spring就會把本身建立好的名字叫作"userService"的UserServiceImpl的實例注入給Action中的「userService」變量,幫助Action完成userService的實例化,這樣在Action中就不用經過「UserService userService = new UserServiceImpl();」這種最原始的方式去實例化userService了。若是沒有Spring,那麼當Action須要使用UserServiceImpl時,必須經過「UserService userService = new UserServiceImpl();」主動去建立實例對象,但使用了Spring以後,Action要使用UserServiceImpl時,就不用主動去建立UserServiceImpl的實例了,建立UserServiceImpl實例已經交給Spring來作了,Spring把建立好的UserServiceImpl實例給Action,Action拿到就能夠直接用了。Action由原來的主動建立UserServiceImpl實例後就能夠立刻使用,變成了被動等待由Spring建立好UserServiceImpl實例以後再注入給Action,Action纔可以使用。這說明Action對「UserServiceImpl」類的「控制權」已經被「反轉」了,原來主動權在本身手上,本身要使用「UserServiceImpl」類的實例,本身主動去new一個出來立刻就可使用了,但如今本身不能主動去new「UserServiceImpl」類的實例,new「UserServiceImpl」類的實例的權力已經被Spring拿走了,只有Spring纔可以new「UserServiceImpl」類的實例,而Action只能等Spring建立好「UserServiceImpl」類的實例後,再「懇求」Spring把建立好的「UserServiceImpl」類的實例給他,這樣他纔可以使用「UserServiceImpl」,這就是Spring核心思想「控制反轉」,也叫「依賴注入」,「依賴注入」也很好理解,Action須要使用UserServiceImpl幹活,那麼就是對UserServiceImpl產生了依賴,Spring把Acion須要依賴的UserServiceImpl注入(也就是「給」)給Action,這就是所謂的「依賴注入」。對Action而言,Action依賴什麼東西,就請求Spring注入給他,對Spring而言,Action須要什麼,Spring就主動注入給他。

四、@ Repository

@Repository對應數據訪問層Bean ,例如:

@Repository(value="userDao")

public class UserDaoImpl extends BaseDaoImpl<User> {

………

}

@Repository(value="userDao")註解是告訴Spring,讓Spring建立一個名字叫「userDao」的UserDaoImpl實例。

當Service須要使用Spring建立的名字叫「userDao」的UserDaoImpl實例時,就可使用@Resource(name = "userDao")註解告訴Spring,Spring把建立好的userDao注入給Service便可。

// 注入userDao,從數據庫中根據用戶Id取出指定用戶時須要用到

@Resource(name = "userDao")

private BaseDao<User> userDao;

五、@Autowired

Spring 2.5 引入了 @Autowired 註釋,它能夠對類成員變量、方法及構造函數進行標註,完成自動裝配的工做。 經過 @Autowired的使用來消除 set ,get方法:

例如:

<bean id="boss" class="com.baobaotao.Boss">    

       <property name="car" ref="car"/>    

       <property name="office" ref="office" />    

 </bean>    

在該類中:

package com.baobaotao;    

public class Boss {    

    private Car car;    

    private Office office;    

    // 省略 get/setter    

    @Override   

    public String toString() {    

        return "car:" + car + "/n" + "office:" + office;    

    }    

}  

如今,能夠在該類的屬性上,增長@Autowired註解,

那麼@Autowired註解會自動的完成set方法的功能,自動的完成對象的注入,

package com.baobaotao;    

import org.springframework.beans.factory.annotation.Autowired;    

public class Boss {    

    @Autowired   

    private Car car;    

    @Autowired   

    private Office office;    

}

在配置文件中,須要將property標籤移除

配置文件變爲:

<bean id="boss" class="com.baobaotao.Boss"/> 

六、@Qualifier

註釋指定注入 Bean 的名稱,這樣歧義就消除了,能夠經過下面的方法解決異常。

@Qualifier("XXX") 

中的XX是 Bean 的名稱,因此 @Autowired 和 @Qualifier 結合使用時,自動注入

的策略就從 byType 轉變成 byName 了。 @Autowired 能夠對成員變量、方法以及

構造函數進行註釋,而 @Qualifier 的標註對象是成員變量、方法入參、構造函數入參。

例如:

@Qualifier(「car」)

private Vertical vertical;

接口交通工具Vertical類有多個子類,在這裏須要使用car做爲注入的類,則使用關鍵字@Qualifier標註便可指定便可

public void setVertical(@Qualifier("car")Vertical vertical) {

       this.verttical = vertical;

}

在這裏Qualifier做用在方法上

七、@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方式進行裝配;若是沒有匹配,則回退爲一個原始類型進行匹配,

若是匹配則自動裝配。

下載附件:Spring經常使用註解.rar

相關文章
相關標籤/搜索