Spring註解註入
在使用註解前必須對Spring容器進行頭文件導入和配置上下文環境。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:context="http://www.springframework.org/schema/context" 4 xmlns:util="http://www.springframework.org/schema/util" 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context-3.2.xsd10 http://www.springframework.org/schema/util 11 http://www.springframework.org/schema/util/spring-util-3.2.xsd"> 12 13 <!-- 開啟屬性註解 --> 14 <!-- <context:annotation-config /> --> 15 16<!-- 開啟包掃描 --> 17 <context:component-scan base-package="dao,service,web"/> 18 </beans>
屬性註解原理:
在解析到配置文件中開啟了屬性註解,在創建對象時發現屬性存在註解,這時就會進行自動裝配的操作。首先根據id去匹配,如果匹配成功則註入,若失敗則根據class進行匹配,匹配成功則註入,失敗則飄紅(報錯)。
包掃描原理:(開啟了包掃描則沒必要再去開啟屬性註解)
在配置文件中開啟了註解(屬性或包掃描)標簽,則Spring容器啟動時解析XML配置文件會解析到包掃描的註解標簽,則會掃描到包中帶有註解的類時為其創建對象並將對象存入Map中,key就是首字母小寫的類名,value就是創建的對象;在創建完對象後如果有屬性註解則按照屬性註解的方式進行註入。至此整個對象創建完成。
Spring註解註入分類:
1) @Component
2) @Controller
3) @Service
4) @Repository
5) @Autowried
6) @Qualifier
7) @Resource
8) @Value
9) @Scope
10) @Lazy
11) @PostConstruct
12) @PreDestroy
@Component
? 例如
@Component
public class User implements Person{}
? 或者
@Component(value="user")
@Component("user") //指定id
? 說明
@Component 是所有受Spring 管理組件的通用形式,Spring 還提供了更加細化的註解形式:@Controller(web層),@Service(service層),@Repository(Dao層);
針對包的分層結構進行註解,不過效果一致。
@Controller | @Service | @Repository
? 例如
@Controller
public class SoftCreateServletImpl implements ISoftCreateServlet {}
? 或者
@Controller("softCreateServletImpl")
? 說明
@Controller 負責註冊一個bean 到spring 上下文中,bean 的ID 默認為類名稱開頭字母小寫
@Autowired
? 例如
@Autowired
private ISoftPMService softPMService;
? 或者
@Autowired(required=false)
private ISoftPMService softPMService = new SoftPMServiceImpl();
? 說明
@Autowired 根據bean 類型從spring 上下文中進行查找,註冊類型必須唯一,否則報異常。
[email protected] 的區別在於,@Resource 允許通過bean 名稱或bean [email protected](required=false) 表示,如果spring 上下文中沒有找到該類型的bean 時, 才會使用new SoftPMServiceImpl();
@Autowired 標註作用於 Map 類型時,如果 Map 的 key 為 String 類型,則 Spring 會將容器中所有類型符合 Map 的 value 對應的類型的 Bean 增加進來,用 Bean 的 id 或 name 作為 Map 的 key。
@Autowired 還有一個作用就是,如果將其標註在 BeanFactory 類型、ApplicationContext 類型、ResourceLoader 類型、ApplicationEventPublisher 類型、MessageSource 類型上,那麽 Spring 會自動註入這些實現類的實例,不需要額外的操作。
@Qualifier
? 例如
@Autowired
@Qualifier("softService")
private ISoftPMService softPMService;
? 說明
[email protected] 時,如果找到多個同一類型的bean,則會拋異常,此時可以使用 @Qualifier("beanName"),明確指定bean的名稱進行註入,此時與 @Resource指定name屬性作用相同。
一般與Autowired一起使用;
@Resource
? 例如
@Resource
private DataSource dataSource; // inject the bean named ‘dataSource‘
? 或者
@Resource(name="dataSource")
@Resource(type=DataSource.class)
? 說明
@Resource 默認按bean 的name 進行查找,如果沒有找到會按type 進行查找,[email protected] 類似。
@Resource是由SUN公司提供,並不是Spring自帶的,[email protected]@Autowired沒啥不一樣,但是在聚合項目中會出現異常。
在沒有為 @Resource 註解顯式指定 name 屬性的前提下,如果將其標註在 BeanFactory 類型、ApplicationContext 類型、ResourceLoader 類型、ApplicationEventPublisher 類型、MessageSource 類型上,那麽 Spring 會自動註入這些實現類的實例,不需要額外的操作。此時 name 屬性不需要指定 ( 或者指定為""),否則註入失敗;
@Value
? 例如
@Value("20")
private int id;
? 或者
@Value("${id}")
@Value("[email protected]}")
? 說明
@Value 是對Java中的基本類型和一些復雜的基本類型通過註解註入。< 八種基本類型,List,Map,Set,Properties >
@Value("${id}") 是通過properties配置文件將id賦值。在XML配置文件添加:
<!-- 將properties配置文件加載到Spring容器中 --> <context:property-placeholder location="classpath:/arge.properties"/>
@Value("[email protected]}") 給四種復雜的類型進行註入。需要在XML配置:
1 <!-- 復雜的基本數據類型 --> 2 <util:list id="list"> 3 <value>詹姆斯</value> 4 <value>韋德</value> 5 <value>安東尼</value> 6 <value>保羅</value> 7 </util:list> 8 9 <util:map id="map"> 10 <entry key="賽季" value="2017"></entry> 11 <entry key="戰況" value="三比一翻盤奪冠"></entry> 12 <entry key="FMVP" value="詹姆斯"></entry> 13 </util:map> 14 15 <util:set id="set"> 16 <value>克利夫蘭騎士</value> 17 <value>芝加哥公牛</value> 18 <value>紐約尼克斯</value> 19 </util:set> 20 21 <util:properties id="prop"> 22 <prop key="狀元">西蒙斯</prop> 23 <prop key="榜眼">英格拉姆</prop> 24 <prop key="探花">布朗</prop> 25 </util:properties>
@Scope
? 例如
@Scope("session")
@Repository()
public class UserSessionBean implementsSerializable {}
? 說明
在使用XML 定義Bean 時,可以通過bean 的scope 屬性來定義一個Bean 的作用範圍,
[email protected] 註解來完成
@Scope中可以指定如下值:
singleton:定義bean的範圍為每個spring容器一個實例(默認值)--單例
prototype:定義bean可以被多次實例化(使用一次就創建一次)--多例
request:定義bean的範圍是http請求(springMVC中有效)
session:定義bean的範圍是http會話(springMVC中有效)
global-session:定義bean的範圍是全局http會話(portlet中有效)
@Lazy
? 例如
@Lazy()
public class void User{}
? 或者
@Lazy(true)
? 說明
[email protected]不生效。
@PostConstruct | @PreDestroy
? @PostConstruct
[email protected] ,這個方法就會在Bean 初始化之後被Spring 容器執 行
(註:Bean 初始化包括,實例化Bean ,並裝配Bean 的屬性(依賴註入))。
? @PreDestroy
[email protected] ,這個方法就會在Bean 被銷毀前被Spring 容器執行。
Spring註解註入