spring註解使用及區別
使用註解來構造IoC容器
用註解來向spring容器註冊Bean。需要在applicationContext.xml中註冊<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>。
如:在base-package指明一個包
1 <context:component-scan base-package="cn.gacl.java"/>
表明cn.gacl.Java包及其子包中,如果某個類的頭上帶有特定的註解【@Component/@Repository/@Service/@Controller】,就會將這個物件作為Bean註冊進Spring容器。也可以在<context:component-scan base-package=” ”/>中指定多個包,如:
1 <context:component-scan base-package="cn.gacl.dao.impl,cn.gacl.service.impl,cn.gacl.action"/>
多個包逗號隔開。
1、@Component
@Component
是所有受Spring 管理元件的通用形式,@Component註解可以放在類的頭上,@Component不推薦使用。
2、@Controller
@Controller對應表現層的Bean,也就是Action,例如:
1 @Controller 2 @Scope("prototype") 3 public classUserAction extends BaseAction<User>{ 4 …… 5 }
使用@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,例如:
1 @Service("userService") 2 public class UserServiceImpl implements UserService { 3 ……… 4 }
@Service("userService")註解是告訴Spring,當Spring要建立UserServiceImpl的的例項時,bean的名字必須叫做"userService",這樣當Action需要使用UserServiceImpl的的例項時,就可以由Spring建立好的"userService",然後注入給Action:在Action只需要宣告一個名字叫“userService”的變數來接收由Spring注入的"userService"即可,具體程式碼如下:
1 // 注入userService 2 @Resource(name = "userService") 3 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 ,例如:
1 @Repository(value="userDao") 2 public class UserDaoImpl extends BaseDaoImpl<User> { 3 ……… 4 }
@Repository(value="userDao")註解是告訴Spring,讓Spring建立一個名字叫“userDao”的UserDaoImpl例項。
當Service需要使用Spring建立的名字叫“userDao”的UserDaoImpl例項時,就可以使用@Resource(name = "userDao")註解告訴Spring,Spring把建立好的userDao注入給Service即可。
1 // 注入userDao,從資料庫中根據使用者Id取出指定使用者時需要用到 2 @Resource(name = "userDao") 3 private BaseDao<User> userDao;
Spring 2.5 中除了提供 @Component 註釋外,還定義了幾個擁有特殊語義的註釋,它們分別是:@Repository、@Service 和 @Controller。 在目前的 Spring 版本中,這 3 個註釋和 @Component 是等效的,但是從註釋類的命名上,很容易看出這 3 個註釋分別和持久層、業務層和控制層(Web 層)相對應。 雖然目前這3 個註釋和 @Component 相比沒有什麼新意,但 Spring 將在以後的版本中為它們新增特殊的功能。 所以,如果 Web 應用程式採用了經典的三層分層結構的話,最好在持久層、業務層和控制層分別採用上述註解對分層中的類進行註釋。
@Service用於標註業務層元件
@Controller用於標註控制層元件(如struts中的action)
@Repository用於標註資料訪問元件,即DAO元件
@Component泛指元件,當元件不好歸類的時候,我們可以使用這個註解進行標註。
BY ETHANON 2011年 06 月 02 日INJAVA
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方式進行裝配;如果沒有匹配,則回退為一個原始型別進行匹配,如果匹配則自動裝配;
@Autowired 與@Resource的區別:
1、 @Autowired與@Resource都可以用來裝配bean.都可以寫在欄位上,或寫在setter方法上。
2、 @Autowired預設按型別裝配(這個註解是屬業spring的),預設情況下必須要求依賴物件必須存在,如果要允許null值,可以設定它的required屬性為false,如:@Autowired(required=false),如果我們想使用名稱裝配可以結合@Qualifier註解進行使用,如下:
|
|
|
|
3、@Resource(這個註解屬於J2EE的),預設安裝名稱進行裝配,名稱可以通過name屬性進行指定,如果沒有指定name屬性,當註解寫在欄位上時,預設取欄位名進行安裝名稱查詢,如果註解寫在setter方法上預設取屬性名進行裝配。當找不到與名稱匹配的bean時才按照型別進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。
|
| |
|
|
推薦使用:@Resource註解在欄位上,這樣就不用寫setter方法了,並且這個註解是屬於J2EE的,減少了與spring的耦合。這樣程式碼看起就比較優雅。
相關推薦
spring註解使用及區別
使用註解來構造IoC容器 用註解來向spring容器註冊Bean。需要在applicationContext.xml中註冊<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”
Spring @Resource、@Autowired、@Qualifier的註解注入及區別
spring2.5提供了基於註解(Annotation-based)的配置,我們可以通過註解的方式來完成注入依賴。在Java程式碼中可以使用 @Resource或者@Autowired註解方式來經行注入。雖然@Resource和@Autowired都可以來完成注入依賴,但它
Spring中@Autowired註解、@Resource註解的區別
不用 它的 查找 允許 type 規範 找到 註入 以及 Spring不但支持自己定義的@Autowired註解,還支持幾個由JSR-250規範定義的註解,它們分別是@Resource、@PostConstruct以及@PreDestroy。 @Resource的作
Spring介紹及配置(XML文件配置和註解配置)
處理 tis 配置文件 3.0 span 特點 inverse logging 結構 本節內容: Spring介紹 Spring搭建 Spring概念 Spring配置講解 使用註解配置Spring 一、Spring介紹 1. 什麽是Spring
Spring註解@Resource和@Autowired區別對比
vax javax ava j2ee org 必須 itl 匹配 get @Resource和@Autowired都是做bean的註入時使用,其實@Resource並不是Spring的註解,它的包是javax.annotation.Resource,需要導入,但是Sprin
Spring 常用的註解及“依賴註入”的實現
Spring 常用的註解及“依賴註入”1、spring註解@Controller 聲明Action組件@Service 聲明Service組件 @Service("myMovieLister") @Repository 聲明Dao組件@Component 泛指組件, 當不
Spring 註解<context:annotation-config> 和 <context:component-scan>的作用與區別
poi dao lis 運行 ima scrip support .... res <context:annotation-config> 是用於激活那些已經在spring容器裏註冊過的bean(無論是通過xml的方式還是通過packagesanning的方式)
spring bean 及註解的問題
Spring Beans 21.什麼是Spring beans? Spring beans 是那些形成Spring應用的主幹的java物件。它們被Spring IOC容器初始化,裝配,和管理。這些beans通過容器中配置的元資料建立。比如,以XML檔案中<bean/> 的形式定義
spring的@Autowired 和 @Resource 兩種註解的區別
在面試的時候,面試官問我@Autowired 和 @Resource 兩種註解的區別,當時懵逼了,雖然是經常用,但具體區別還真是不知道。然後搜百度記錄下。。。 一、相同點 1. 都是用來裝配 Bean,都可以
關於@Profile、@Conditional、@Primary、@Qualifier及@Scope等實現高階裝配的spring註解
1、關於@Profile註解的介紹 @Profile註解主要用在針對不同環境而條件選擇的注入bean 在開發過程中由於環境的不同,我們可能在針對某些功能,需要開發不同的實現,然而在某種環境中,只能啟用其中一種實現,其他的實現處於不啟用的狀態。這個時候我們在需要建立的bean上新增@Profi
spring 註解@PathVariable和@RequestParam的區別
@RequestParam註解是獲取靜態URL傳入的引數 @PathVariable是獲取請求路徑中的變數作為引數 @RestController @RequestMapping(value="users") public class UserController { @Re
Spring註解配置Mongo及基本CRUD操作簡介
Mongo安裝配置參考基本操作等可參考http://www.runoob.com/mongodb/mongodb-tutorial.html,其中help()方法十分實用,可以不用讓使用者不用記太多方法,如help.collection.help()會顯示集合(相當於傳統資料庫中的的表)的所有方
JDK動態代理和CGLIB動態代理,實現Spring註解管理事務區別。
註解式事務配置 1.JDK動態代理 <tx:annotation-driven transaction-manager="txManager"/> 預設啟用JDK動態代理,JDK只能代理介面不能代理類。 @Transactional註解可以標註在
@Resource、@Autowired、@Qualifier的註解注入及區別
在Java程式碼中可以使用 @Resource 或者 @Autowired 註解方式來進行注入。 雖然 @Resource 和 @Autowried 都可以完成依賴注入,但是他們是有區別的。 @Resource 預設是按照名稱來裝配注入的,只有當找不到與名稱匹配的b
Spring註解@Component、@Repository、@Service、@Controller區別
Spring 2.5 中除了提供 @Component 註釋外,還定義了幾個擁有特殊語義的註釋,它們分別是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,這 3 個註釋和 @Component 是等效的,但是從註釋類
spring註解開發及AOP
Spring的bean管理(註解) 註解介紹 1 程式碼裡面特殊標記,使用註解可以完成功能 2 註解寫法 @註解名稱(屬性名稱=屬性值) 3 註解使用在類上面,方法上面 和 屬性上面 Spring註解開發準備
Spring 開啟Annotation context:annotation-config 和 context:component-scan詮釋及區別
<context:annotation-config> 和 <context:component-scan>的區別 <context:annotation-config> 是用於啟用那些已經在spring容器裡註冊過的bean(無論是通過xml的方式
@Resource @Autowired的註解注入及區別
@Resource @Autowired的註解注入及區別 @[email protected]在Spring中常用來裝配物件。兩種方法的不同: (1) 提供方不同:@Autowired是由org.springframework.beans.f
Spring SpringMVC SpringBoot SpringCloud概念、關係及區別
一、正面解讀: Spring主要是基於IOC反轉Beans管理Bean類,主要依存於SSH框架(Struts+Spring+Hibernate)這個MVC框架,所以定位很明確,Struts主要負責表示層的顯示,Spring利用它的IOC和AOP來處理控制業務(負責對資料
Spring 開啟Annotation 和 詮釋及區別
<context:annotation-config> 和 <context:component-scan>的區別 <context:annotation-config> 是用於啟用那些已經在spring容器裡註冊過的bean(無論是通過xml的方式還是通過package