1. 程式人生 > >Spring註解註入

Spring註解註入

path qualifier tpms @value scope 會話 數據類型 rep person

在使用註解前必須對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.xsd
10 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註解註入