Spring 經常使用註解

使用註解來構造IoC容器

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

如:在base-package指明一個包spring

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"/>

多個包逗號隔開。安全

一、@Component

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

二、@Controller

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

1 @Controller
2 @Scope("prototype") 
3 public class UserAction 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的名字prototype

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

三、@ Service

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

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"便可,具體代碼以下:component

1 // 注入userService   
2 @Resource(name = "userService")  // @Autowired
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就主動注入給他。

四、@ 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;
相關文章
相關標籤/搜索