1. 程式人生 > >Spring 常用的註解及“依賴註入”的實現

Spring 常用的註解及“依賴註入”的實現

Spring 常用的註解及“依賴註入”

1、spring註解

@Controller 聲明Action組件
@Service 聲明Service組件 @Service("myMovieLister")
@Repository 聲明Dao組件
@Component 泛指組件, 當不好歸類時.
@RequestMapping("/menu") 請求映射
@Resource 用於註入,( j2ee提供的 ) 默認按名稱裝配,@Resource(name="beanName")

@Resource有兩個中重要的屬性:name和type ,而Spring將@Resource註解的name屬性解析為bean的

名字.(即bean的id名),而type屬性則解析為bean的類型。所以如果使用name屬性,則使用byName的自動註入策略,而使用
type屬性時則使用 byType自動註入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動註入策略。
例如:
@Resource(name="baseDao")
private BaseDao baseDao;


@Autowired 用於註入,(srping提供的) 默認按類型裝配 ,可以不用使用set,get方法

@Autowired默認按類型裝配,默認情況下必須要求依賴對象必須存在,如果要允許null值,可以設置它的required屬性為false,例如:@Autowired(required=false) ,

如果我們想使用名稱裝配可以結合@Qualifier註解進行使用
如下:
@Autowired()
@Qualifier("baseDao")
private BaseDao baseDao;


@Transactional( rollbackFor={Exception.class}) 事務管理
@ResponseBody
@Scope("prototype") 設定bean的作用域


2、用註解來向Spring容器註冊Bean

需要在applicationContext.xml中註冊<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>。

如:在base-package指明一個包

@1 、<context:component-scan base-package="com.cmos.ngcard"/>
表明cn.gacl.java包及其子包中,如果某個類的頭上帶有特定的註解【@Component/@Repository/@Service/@Controller】,就會將這個對象作為Bean註冊進Spring容器。也可以在<context:component-scan base-package=” ”/>中指定多個包,如:

@2 、<context:component-scan base-package="com.cmos.ngcard.dao.impl,com.cmos.ngcard.service.impl,com.cmos.ngcard.action"/>
多個包逗號隔開。

1)、@Component
@Component是所有受Spring 管理組件的通用形式,@Component註解可以放在類的頭上,@Component不推薦使用。

2)、@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對象

3)、@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")
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就主動註入給他。

4)、@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;

5).當接口中有多個實現類時,實例綁定辦法
綁定辦法有兩種
@1、@Qualifier註解
通過這個標示,表明了哪個實現類才是我們所需要的
http://www.cnblogs.com/smileLuckBoy/p/5801678.html

@2、@Primary
用@Primary 告訴spring 在猶豫的時候優先選擇哪一個具體的實現。
http://www.cnblogs.com/myhappylife/p/5647098.html

@3、引入配置文件
1、@PropertySource
引入 .properties配置文件
如@PropertySource(value="rop.appSecret.properties")

2、@ImportResource
引入xml等配置文件
如@ImportResource(locations={"spring-rop-conf.xml","dubbo-consumer.xml","dubbo-provider.xml"})





Spring 常用的註解及“依賴註入”的實現