spring註解 總結

要獲得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包單元測試必加的。

通過這種方式進行單元測試就會帶來很多便利。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章