相比較使用XML配置,基于annotation的IOC配置會(huì)極大的簡(jiǎn)化配置文件的內(nèi)容,所以在beans.xml中無(wú)需再配置bean的設(shè)置,只需要開啟組件掃描即可。
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
7 http://www.springframework.org/schema/context
8 http://www.springframework.org/schema/context/spring-context-3.0.xsd">
9
10 <!-- 開啟注解 -->
11 <context:annotation-config/>
12 <!-- 指定哪些需要加入掃描 -->
13 <context:component-scan base-package="org.duyt.*"/>
14
15 </beans>
拿出一個(gè)Dao組件的注入為例
1 package org.duyt.dao;
2 public interface IUserDao {
3 public void add();
4 public void delete();
5 public void update();
6 public void load();
7 }
Dao的實(shí)現(xiàn)
1 package org.duyt.dao.impl;
2
3 import org.duyt.dao.IUserDao;
4 import org.springframework.context.annotation.Scope;
5 import org.springframework.stereotype.Repository;
6
7 //使用Repository("userDao")標(biāo)注UserDao類相當(dāng)于在配置文件中寫作
8 //<bean id="userDao" class="org.duyt.dao.impl.UserDao"/>
9 @Repository("userDao")
10 //相應(yīng)的,Scope("singleton")標(biāo)注就相當(dāng)于的配置scope="singleton"
11 @Scope("singleton")
12 public class UserDao implements IUserDao {
13 public void add() {
14 System.out.println("用戶增加方法");
15 }
16 public void delete() {
17 System.out.println("用戶刪除方法");
18 }
19 public void update() {
20 System.out.println("用戶更新方法");
21 }
22 public void load() {
23 System.out.println("用戶查詢方法");
24 }
25 }
26
spring提供了三種注解來(lái)對(duì)應(yīng)MVC的三層,數(shù)據(jù)層的注解對(duì)應(yīng)Repository,業(yè)務(wù)層對(duì)應(yīng)service,表示層對(duì)應(yīng)controller。還有一個(gè)公共的component,分開這么多是為了更好的標(biāo)注當(dāng)前這個(gè)待注入類的功能,如果不按照這些分類好的注解去注入也可以完成注入,但是還是規(guī)范的去寫。關(guān)于對(duì)象中某個(gè)屬性的注入看下面的action
1 package org.duyt.action;
2
3 import javax.annotation.Resource;
4
5 import org.duyt.domain.User;
6 import org.duyt.service.IUserService;
7 import org.springframework.context.annotation.Scope;
8 import org.springframework.stereotype.Controller;
9
10 @Controller("userAction")
11 @Scope("prototype")
12 public class UserAction {
13 @Resource
14 private IUserService userService;
15 public String testString;
16 public User user;
17
18 public UserAction() {
19 }
20
21 public UserAction(String testString) {
22 super();
23 this.testString = testString;
24 }
25
26 public void addUser(){
27 userService.add();
28 }
29 //get/set略
30 }
31
對(duì)于某個(gè)要注入的屬性,Spring自帶的注解是@AutoWire,但是這種是按照類型注入的,為了避免接口多實(shí)現(xiàn)可能出現(xiàn)的問(wèn)題,推薦可以使用javax.annotation提供的@resource,這種是按照屬性的名稱進(jìn)行注入,可以直接在屬性名之上添加注解,這樣的話連屬性的get/set都可以省了...或者是添加對(duì)應(yīng)的get/set,在set方法上添加注解。但是要注意的是,按照屬性名字進(jìn)行注入,屬性的名稱需要和注解定義組件時(shí)的id一致。Action中的Iuserservice的實(shí)例名為userService,會(huì)尋找有@service("userService")的注解進(jìn)行注入,否則會(huì)注入失敗。
測(cè)試如下
1 package org.duyt.test;
2 import org.duyt.action.UserAction;
3 import org.junit.Test;
4 import org.springframework.beans.factory.BeanFactory;
5 import org.springframework.context.support.ClassPathXmlApplicationContext;
6 public class IocTest {
7 private BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
8 @Test
9 public void test(){
10
11 //測(cè)試依賴注入
12 UserAction ua = (UserAction) factory.getBean("userAction");
13 UserAction ua2 = (UserAction) factory.getBean("userAction");
14 System.out.println(ua == ua2);
15 ua.addUser();
16 }
17 }
18
結(jié)果為:
false
用戶增加方法