1. 程式人生 > >Spring基於註解和XML混合方式的使用

Spring基於註解和XML混合方式的使用

首先要明白,基於註解和XML兩種方式的實現功能是一樣的,只是兩種不同的配置方式。

一、IoC配置

1、配置xml

在使用註解與xml結合的方式配置IoC之前,首先要引入context標籤:

xmlns:context="http://www.springframework.org/schema/context" 

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 

再配置包的掃描:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 掃描com.luis包下所有使用註解的型別 --> 
    <context:component-scan base-package="com.luis" />
</beans>

此配置起的作用是掃描com.luis包下所有帶@Component及其衍生註解的類

2、配置註解

2.1、@Component註解

@Component註解作用是將資源交給Spring進行管理,相當於xml中配置的bean。

通過屬性value指定bean的id,若不指定則預設bean的名稱為類的名稱,首字母小寫。

2.2、@Component衍生註解

@Component產生三個衍生註解[email protected]、@Service、@Repository。它們與@Component的作用及用法一致,習慣上表達更為清晰的意義:

  • @Controller:一般用於表現層(controller)的註解。
  • @Service:一般用於業務層(service)的註解。
  • @Repository:一般用於持久層(dao)的註解。

二、DI註解配置

DI的裝配方式有兩種:按型別裝配,按名稱裝配。這裡的裝配相當於xml配置方式中的:

<property name="" ref="">

1、按型別裝配

1.1、@Autowired

@Autowired預設按型別裝配(byType),它是由AutowiredAnnotationBeanPostProcessor類實現。

@Autowired是spring自帶的註解,它預設情況下要求依賴物件必須存在,如果需要允許null值,可以設定它的required屬性為false,如:@Autowired(required=false)。

1.2、@Inject

@Inject是根據型別進行自動裝配的,如果需要按名稱進行裝配,則需要配合@Named;

@Inject是JSR330中的規範,需要匯入javax.inject.Inject;實現注入,它可以作用在變數、setter方法、建構函式上。

2、按名稱裝配

2.1、@Resource

@Resource預設按名稱裝配(byName),可以通過@Resource的name屬性指定名稱, @Resource屬於J2EE JSR250規範的實現。

@Resource如果沒有指定name屬性,當註解寫在欄位上時,預設取欄位名進行按照名稱查詢,當找不到與名稱匹配的bean時才按照型別進行裝配。如果name屬性一旦指定,就只會按照名稱進行裝配。

推薦使用@Resource註解,這個註解屬於J2EE的,減少了與spring的耦合。相當於xml中的<property name="" value="">

2.2、註解組合

其實我們的按名稱裝配與按型別裝配兩種方式之間並沒有明顯的分界線,如@Resource也可以通過型別進行裝配,而我們的按照型別裝配也可以和其他註解結合的方式實現按照名策劃那個裝配。

@Autowired可以與@Qualifier結合實現按名稱裝配。在自動按照型別注入的基礎之上,再按照 Bean 的 id 注入,@Qualifier在給欄位注入時不能獨立使用,必須和@Autowire 一起使用;但是給方法引數注入時,可以獨立使用。

注意,@Autowired、@Resource、@Inject區別

  • @Autowired是spring自帶的,@Inject是JSR330規範實現的,@Resource是JSR250規範實現的,需要匯入不同的包
  • @Autowired、@Inject用法基本一樣,不同的是@Autowired有一個request屬性
  • @Autowired、@Inject是預設按照型別匹配的,@Resource是按照名稱匹配的
  • @Autowired如果需要按照名稱匹配需要和@Qualifier一起使用,@Inject和@Name一起使用

2.3、其他註解

常用的註解如@Value,用於給基本型別和String型別注入值、使用佔位符獲取屬性檔案中的值

@Value(“${name}”)//name是properties檔案中的key
private String name;

bean作用範圍註解@Scope,用於指定 bean 的作用範圍,通過value進行取值,其值可取:singleton、prototype、request、session、globalsession

生命週期註解@PostConstruct、@PreDestroy,作用相當於xml中的<bean id="" class="" init-method="" destroy-method=""/>

另外還有一大批註解,將會在下一篇中進行說明。

三、註解和xml兩種配置方式對比

兩種配置方式各有優點:註解配置簡單,維護方便(找到類,就相當於找到了對應的配置);xml修改時,不用改原始碼,不涉及重新編譯和部署。因而具體的配置方式由個人進行選擇。

Spring管理bean方式對比:

基於xml 基於註解
Bean定義 <bean id="" calss=""/> @Component及其衍生註解
Bean名稱 通過id或name指定 @Component("person")
Bean注入 <property>或p名稱空間 @Autowired、@Resource
Bean作用範圍、生命週期 init-method、destory-method、scope屬性 @PostConstruct初始化,@PreDestroy銷燬,@Scope作用範圍設定