用註解來向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
是全部受Spring 管理組件的通用形式,@Component註解能夠放在類的頭上,@Component不推薦使用。app
@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來處理,避免struts中Action的線程安全問題。spring 默認scope 是單例模式(scope="singleton"),這樣只會建立一個Action對象,每次訪問都是同一Action對象,數據不安全,struts2 是要求每次次訪問都對應不一樣的Action,scope="prototype" 能夠保證當有請求的時候都建立一個Action對象線程
@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對應數據訪問層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;