要獲得Spring的一個Bean ,可以通過在配置文件裏進行配置Bean,Spring 2.5 以後提出了註解的方式同樣也可以配置Bean,在企業項目中,往往使用兩者相結合的方式。
下面總結下我所遇到的註解及其用法,方便日後查閱。
一、什麼是註解
簡單的理解就是 簡化 我們的工作
如前面獲得一個類UserService的Bean ,我們得在配置文件中配:<bean id="userService" class="com.bzc.www.service.UserService"></bean>
使用註解只需要在類UserService的上一行寫一句 @Service("userService") 即可
二、要做哪些準備才能使用註解
在 一、什麼是註解 裏,我們可以很輕鬆的在UserService的上一行寫一句 @Service("userService") ,但是僅僅這樣寫是不起作用的。你得讓spring容器知道去哪裏找到這些註解,只有spring容器認識這些註解並知道它們有什麼用,這時候就需要做一些準備工作了。在applicationContext.xml文件裏進行。
1)引入約束
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
2)配置讓spring容器去找到寫了註解的包
<!-- spring去掃描這些包,才能找到哪些類使用了註解 -->
<context:component-scan base-package="com.bzc.www"></context:component-scan>
1.對類進行的註解
1)@Component
這個註解是spring 2.5新特性裏的對類註解的統稱,也就是說所有的類都可以用這個註解進行配置Bean
2)@Controller 、@Service 、@Repository
這三個註解可以理解爲作用和@Component相同,既然相同,爲什麼要引用呢?
在一個項目裏,尤其是MVC的項目裏,有表現層、業務層、數據連接層,如果每一層都有特定的類註解是不是會更新清晰呢。這三個Component的衍生註解就是這個作用
@Controller 表現層註解
@Service 業務層註解
@Repository 數據層註解
注:每個註解裏可能有若干個value值,如Service註解裏就有這個屬性,完整的寫應該是: @Service(value="userService"),但是我們約定俗稱,這裏的value值可以省略,直接寫成@Service("userService")。這裏的value值就相當於<bean id="userService" class="com.bzc.www.service.UserService"></bean>裏面的id值,用於唯一標識。
2.對屬性的注入
注:1.用註解的方式對屬性的注入可以直接對屬性寫註解,也可以對屬性對應的set方法寫註解;
2.這裏和配置文件對屬性注入的區別是,直接對屬性寫註解時,可以不寫它的set方法也能完成注入。
@Service("userService")
public class UserService {
@Value("張三")
private String name;
@Autowired
private UserDao userDao;
@Override
public String toString() {
return "UserService [name=" + name + ", userDao=" + userDao + "]";
}
}
1)對簡單類型的註解
這裏的簡單類型包括八種基本類型和String等包裝類型
使用@Value("值")的方式進行屬性的注入
2)對複雜類型的註解 @Autowired
這裏的複雜類型值在一個類裏引入另一個類的對象作爲屬性,比如這裏的
private UserDao userDao;
UserDao本身就是一個數據類型,這時候可以使用@Autowired進行註解,這裏強調一下,@Autowired 是根據類型進行諸如的,所以後面不需要寫value值,這裏根據下方是UserDao 這個類型進行自動註解的。
3)@Qualifer("userDao")
@Qualifer("userDao") 這個註解和@Autowired 一樣,區別是後者是依賴類型諸如,不用寫value值,而前者是根據名稱注入的,前者裏的userDao是:
@Repository("userDao")
public class UserDao {
}
@Repository裏的userDao
這個註解一般和@Autowired配合使用,如下:
@Autowired
@Qualifier("userDao")
private UserDao userDao;
4)Resource(name="userDao")
這個註解也是對複雜對象的使用,也是依賴名稱注入屬性的,簡單的理解爲Resource(name="userDao")和@Qualifer("userDao")是一樣的。
在企業開發中,用到最多的應該是 2)的使用。3) 和4)需要認識,在見到的時候不至於懵逼即可。
3.註解初始化和銷燬方法
前面說到,在Bean的生命週期裏,有兩個步驟,一個是在Bean被初始化的時候會執行的方法,另一個是Bean被銷燬時執行的方法,當然銷燬時需要關閉applicationContext對象。做到認識,會使用即可。
@PostConstruct
public void setup(){
//配置Bean初始化方法
}
@PreDestroy
public void destory(){
//配置Bean銷燬時方法
}
4.Bean的作用範圍
@Scope 註解是個類註解,直接對類進行註解,默認情況下,也就是沒有寫@Scope時是單例模式創建Bean,如果現在需要使用多例模式創建Bean,只需要在類的上一行添加註解: @Scope("prototype") 即可。
5.spring3.0 註解新特性
上面說到的四個註解都是spring 2.5的註解特性,spring 3.0 又引入了幾個新註解,JavaConfig思想:使用一個java類來代替配置文件對Bean進行配置。
@Configuration
public class JavaConfig {
@Bean(name="userDao")
public UserDao getUserDao(){
return new UserDao();
}
@Bean(name="userService")
public UserService getUserService(){
return new UserService();
}
}
當然了,第一步還是需要在配置文件applicationContext.xml裏引入約束和掃描包配置,參照 : 二、要做哪些準備才能使用註解
這裏有兩個註解 :
@Configuration 這是個類註解器,告訴Spring 被這個註解的類就是一個工廠,這裏的類型JavaConfig可以隨意取。
@Bean(name="userDao") 這是個方法註解,等同於<bean id="userDao" class="com.bzc.www.service.UserDao"></bean>
6.測試用註解
前面在進行測試Bean的時候都要通過下面這句代碼來獲得,很長很煩。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Bean1 bean1 = (Bean1) applicationContext.getBean("userDao");
每次獲得Bean都要寫這兩句就會造成大量重複代碼,我們可以使用註解的方式來代替這句代碼:
1)引包:
spring-test-3.2.0.RELEASE.jar spring的測試包,整合junit4包
junit4.jar 點擊工程右鍵--> build path --> add libararys --> 選擇junit --> 選擇junit4 --> finished
2)註解寫法如下
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class) //必寫
@ContextConfiguration(locations="classpath:applicationContext.xml") //必寫
public class TestJunit {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
@Test //必寫
public void demo1(){
userDao.addUser();
}
}
其中有 三個註解是必須要寫的。
第一個註解 @RunWith(SpringJUnit4ClassRunner.class) 是固定寫法,整合junit4方便測試;
第二個註解 @ContextConfiguration(locations="classpath:applicationContext.xml") 加載配置文件,這裏的classpath:表示src目錄下,後面是我配置文件的名字;
第三個註解 @Test 是junit包單元測試必加的。
通過這種方式進行單元測試就會帶來很多便利。