首先要明白,基於註解和XML兩種方式的實現功能是同樣的,只是兩種不一樣的配置方式。java
在使用註解與xml結合的方式配置IoC以前,首先要引入context標籤:spring
xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
再配置包的掃描:session
<?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及其衍生註解的類函數
@Component註解做用是將資源交給Spring進行管理,至關於xml中配置的bean。ui
經過屬性value指定bean的id,若不指定則默認bean的名稱爲類的名稱,首字母小寫。spa
@Component產生三個衍生註解-@Controller、@Service、@Repository。它們與@Component的做用及用法一致,習慣上表達更爲清晰的意義:prototype
DI的裝配方式有兩種:按類型裝配,按名稱裝配。這裏的裝配至關於xml配置方式中的:code
<property name="" ref="">
@Autowired默認按類型裝配(byType),它是由AutowiredAnnotationBeanPostProcessor類實現。component
@Autowired是spring自帶的註解,它默認狀況下要求依賴對象必須存在,若是須要容許null值,能夠設置它的required屬性爲false,如:@Autowired(required=false)。xml
@Inject是根據類型進行自動裝配的,若是須要按名稱進行裝配,則須要配合@Named;
@Inject是JSR330中的規範,須要導入javax.inject.Inject;實現注入,它能夠做用在變量、setter方法、構造函數上。
@Resource默認按名稱裝配(byName),能夠經過@Resource的name屬性指定名稱, @Resource屬於J2EE JSR250規範的實現。
@Resource若是沒有指定name屬性,當註解寫在字段上時,默認取字段名進行按照名稱查找,當找不到與名稱匹配的bean時才按照類型進行裝配。若是name屬性一旦指定,就只會按照名稱進行裝配。
推薦使用@Resource註解,這個註解屬於J2EE的,減小了與spring的耦合。至關於xml中的<property name="" value="">
其實咱們的按名稱裝配與按類型裝配兩種方式之間並無明顯的分界線,如@Resource也能夠經過類型進行裝配,而咱們的按照類型裝配也能夠和其餘註解結合的方式實現按照名策劃那個裝配。
@Autowired能夠與@Qualifier結合實現按名稱裝配。在自動按照類型注入的基礎之上,再按照 Bean 的 id 注入,@Qualifier在給字段注入時不能獨立使用,必須和@Autowire 一塊兒使用;可是給方法參數注入時,能夠獨立使用。
注意,@Autowired、@Resource、@Inject區別:
經常使用的註解如@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修改時,不用改源碼,不涉及從新編譯和部署。於是具體的配置方式由我的進行選擇。
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做用範圍設置 |