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產生三個衍生注解-@Controller、@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作用范圍設置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM