天天看點

Spring基礎之IOC/DI

作者:愛吃中餐的鄭鄭鄭鄭

以下内容為個人整理學習驗證,僅供參考。

基于XML的配置

IOC控制反轉:把對象交給Spring IOC控制(建立)

//bean屬性:
//id:對象在容器中唯一辨別,用于擷取對象
//class:指定類的全限定名,用于反射建立對象,預設情況下調用無慘構造方法
//init-method:指定類中的初始化方法名稱
//destroy-method:指定類中銷毀方法名稱
/**scope:指定對象的作用範圍
	singleton:預設值,單例的,生命周期(當應用加載建立容器時被建立,隻要容器在就一直活着,
  當應用截卸,容器銷毀對象也被銷毀)
  prototype:多例的,每次通路對象時都會重新建立,生命周期(當使用對象時建立新的對象執行個體,
  隻要對象在使用,就一直活着,當對象長時間不使用,被java垃圾回收器回收)
	request:将Spring建立的bean對象存入到request域中
  session:将Spring建立的bean對象存入到session域中
*/
<bean id="company" class="com.zww.model.Company"></bean>           

DI依賴注入:對象的依賴、屬性的注入

  • 構造函數注入:
public class User{
	private String name;
  private Integer age;
  public User(String name, Integer age){
  	this.name = name;
    this.age = age'
  }
}
/**
	使用構造函數方式,類中需要有一個對應參數清單的構造函數
  constructor-arg屬性:
  index:參數在構造函數參數清單的索引位置
  name:參數在構造函數中的名稱
  value:val值,隻能指派基本資料類型和String類型
  ref:指派指向其他bean類型,需要時在配置檔案中配置過的bean
**/
<bean id="user" class="com.zww.model.user">
        <constructor-arg name="name" value="ZHW"></constructor-arg>
        <constructor-arg name="age" value="26"></constructor-arg>
</bean>           
  • set方法注入
<bean id="company" class="com.zww.model.Company">
        <property name="name" value="天***科技"></property>
        <property name="address" value="北京市朝陽區"></property>
</bean>           
  • p名稱空間注入
引入p名稱空間:
在schema的名稱空間中加入:xmlns:p="http://www.springframework.org/schema/p"
<bean id="company" class="com.zww.model.Company" p:name="天***科技" 
p:address="北京市朝陽區">
</bean>           

ps:示例

//簡單類型 value
<bean id="company" class="com.zww.model.Company">
        <property name="name" value="天***科技"></property>
        <property name="address" value="北京市朝陽區"></property>
</bean>
//引用類型 ref
<bean id="user" class="com.zww.entry.User">
        <property name="name" value="ZHW"></property>
        <property name="age" value="26"></property>
        <property name="company" ref="company"></property>
</bean>
//集合類型(數組)
<bean id="address" class="com.zww.entry.Address">
  	<property name = "address">
//List集合
    		<list>//list中如果是pojo類型使用bean标簽
      			<value>北京</value>
						<value>上海</value>
				</list>
//Set集合
				<set>北京</set>
			  <set>上海</set>
//Map集合
				<map>
        		<entry key="key1" value = "val1"/>
            <entry key="key2" value = "val2"/>
        </map>
//Properties集合
				<props>
              <prop key = "key1">val1</prop>
							<prop key = "key2">val2</prop>
				</props>
  	</property>
</bean>           

基于注解配置

IOC基于注解的使用:

注解使用前需要在xml中配置:
<!-- 開啟注解并掃描指定包中帶有注解的實作類 -->
<content:component-scan base-package="com.zhw"></content:component-scan>

// value:指定bean的id,如果不指定預設為目前類名首字母小寫
@Component
一般用在實作類上,把資源讓Spring來管理,相當于xml中的配置一個<bean>
  
下面三個注解是針對@Component注解衍生注解,作用和屬性一樣,隻是提供了更加明确的語義化。
@Controller一般用于表現層的注解
@Service一般用于業務層的注解
@Repository一般用于持久層的注解           

DI基于注解的使用:

相當于标簽<property name="" value=""></property>

// 預設按照類型裝配(byType),spring自帶注解,預設要求依賴對象必須存在,如果允許為null
// 可以通過屬性@Autowird(required=false)設定
// 如果想按照名字裝配(byName)需要結合注解@Qualifier使用
@Autowired

// 在自動按照類型注入的基礎之上,再按照bean的id注入
// 再給字段注入時不能單獨使用,需要和@Autowired一起使用,但是給方法注入時可以獨立使用
@Qualifier

// 預設按照名稱裝配,可以通過name指定名稱,如果不指定當注解解除安裝字段上時按照注解字段名
// 查找,當找不到時按照類型進行裝配;如果name屬性一旦指定,隻會按照名稱進行裝配
@Resource

// 根據類型自動裝配,如果需要按照名稱進行裝配需要配合@Named使用
@Inject

// 給基本類型和String類型注入值,可以通過占位符擷取屬性檔案中的值
@Value

<!-- 擴充
	@Autowired、@Resource、@Inject差別:
	1.@Autowired是Spring自帶的,@Inject是JSR330規範實作的,@Resource是JSR250實作的,需要
      導入不同的依賴包
  2.@Autowired 和@Inject用法基本一樣,不同是@Autowired多了request屬性
  3.@Autowired 和@Inject按照類型比對,@Resource按照名稱比對
  4.@Autowried如果需要按照名稱比對需要和@Qualifier一起使用,@Inject需要和@Named一起使用
-->

// 指定bean的作用範圍,相當于标簽<bean>scope屬性
@Scope

// 相當于标簽<bean>init-method屬性 初始化方法名稱
@PostConstruct
// 相當于标簽<bean>destroy-method屬性  銷毀方法名稱
@Predestroy           

純注解使用:

// 相當于Spring的xml配置檔案
@Configuration
// 相當于bean标簽,主要用來配置非自定義的bean,@Bean标注在方法上,傳回某個執行個體方法
@Bean

// 相當于标簽<context:compontent-scan> 開啟注解掃描
@ComponentScan
// 相當于标簽<context:property-placeholder> 編輯在類上,用來加載properties配置檔案
@PropertySource
// 相當于标簽<import> 用來組合多個配置類,在引入其他配置類時
@Import           

驗證

  • 建立Spring項目:
Spring基礎之IOC/DI

預設點選下一步建立完成

  • 工作環境配置:
Spring基礎之IOC/DI

依賴配置

Spring基礎之IOC/DI

建立xml配置檔案

  • 編寫開發驗證:
Spring基礎之IOC/DI

建立對象

Spring基礎之IOC/DI

對象控制權交給Spring,并進行屬性注入

Spring基礎之IOC/DI

執行驗證

Spring IOC:spring-core包含了IOC技術,IOC主要是為了管理對象以及對象的依賴關系。

Spring基礎之IOC/DI

Bean管理繼承關系

BeanFactory:Spring IOC底層設計,提供了先進的比對機制。

ApplicationContext接口繼承自BeanFactory,實作了許多接口的擴充。

差別:

BeanFactory實作的是按需加載,即第一次擷取Bean才會建立這個Bean,而ApplicationContext會一次性建立所有Bean。BeanFactory是ApplicationContext的父接口,ApplicationContext提供了個性化功能,比如支援國際化、時間通知等,通常使用ApplicationContext,ApplicationContext常見接口實作ClassPathXmlApplicationContext

使用:

Spring基礎之IOC/DI

使用示例