在spring框架中有兩個重要的特征即:控制反轉(IOC)和面向切面(AOP)
什么是IOC
IOC:即控制反轉,控制權的轉移,應用程序本身不負責依賴對象的創建和維護,而是由外部容器負責創建和維護
DI(依賴注入)是其一種實現方式 目的:創建對象并且組裝對象之間的關系 ioc容器會幫助我們自動創建對象
IOC作用:找IOC容器-容器返回對象-使用容器
DI-IOC的另一表達,即組件以一些預先定義好的方式接受來自如容器的資源注入
在spring容器中默認僅存在一個Bean實例,Bean以單實例的方式存在,即無論實例化多少個bean對象它們的引用都是相等的
什么是DI
DI即依賴于某種方法給Bean的屬性賦值,DI有三種賦值方式
- 屬性注入 構造器set方法注入 通過xml文件中<property name="屬性名" value="屬性值"></property>或p屬性注入
- 構造器注入 <constructor-arg value="屬性值" index="構造器中下標位置(可省)"></constructor-arg>//構造器注入資源時按順序進行
- 工廠注入
配置Spring配置文件
- 通過<property>標簽注入
<bean id="person1" class="summer.spring.bean.Person">
<property name="name" value="zhangsan"></property>
<property name="age" value="12"></property>
</bean>
name屬性的值對應javaBean中定義的屬性,value即為要給屬性賦的值
- <constructor-arg index>順序注入
<bean id="car1" class="summer.spring.bean.Car" >
<constructor-arg value="奔馳" index="0"></constructor-arg>
<constructor-arg value="德國" index="1"></constructor-arg>
<constructor-arg value="3000000.0" index="2"></constructor-arg>
</bean>
index索引對應javaBean中第幾個屬性,從0開始
- 從外部屬性文件中注入
配置properties文件,與Bean的屬性相對應
personName=\u674E\u56DB\u5F20\u4E09
personAge=55
配置Spring文件
<context:property-placeholder location="classpath:Person.properties"/>通過context:property-placeholder標簽引入
<bean id="person1" class="spring2.bean.Person" >
<property name="name" value="${personName}"></property>
<property name="age" value="${personAge}"></property>
</bean>
${}是SPEL表達式,其中的值與properties文件定義的屬性值匹配。
bean的引用
當一個對象內中包含另一個對象時在配置文件中可以通過<ref>元素或ref屬性為 Bean 的屬性或構造器參數指定對Bean的引用(id),也可以在屬性或構造器里包含Bean的聲明,這樣的Bean稱為內部Bean
<bean id="car1" class="summer.spring.bean.Car">
<constructor-arg value="奔馳" index="0"></constructor-arg>
<constructor-arg value="德國" index="1"></constructor-arg>
<constructor-arg value="3000000.0" index="2"></constructor-arg>
</bean>
<bean id="person1" class="summer.spring.bean.Person">
<property name="name" value="zhangsan"></property>
<property name="age" value="12"></property>
<property name="car" ref="car1"></property>
</bean>
id值在整個spring配置文件中是唯一的!?。?/p>
引用集合
一個對象中包含另一個對象的集合時可以通過List、Map標簽配置
<bean id="person1" class="summer.spring.bean.Person">
<property name="name" value="zhangsan"></property>
<property name="age" value="12"></property>
<property name="cars" >
<list>
<bean class="summer.spring.bean.Car">
<constructor-arg value="奔馳" index="0"></constructor-arg>
<constructor-arg value="德國" index="1"></constructor-arg>
<constructor-arg value="3000000.0" index="2"></constructor-arg>
</bean>
<bean class="summer.spring.bean.Car">
<constructor-arg value="BMW" index="0"></constructor-arg>
<constructor-arg value="德國" index="1"></constructor-arg>
<constructor-arg value="2990000.0" index="2"></constructor-arg>
</bean>
</list>
</property>
</bean>
Spring的繼承
<bean id="car1" class="spring2.bean.Car" >
<property name="type" value="BMW"></property>
</bean>
<bean id="person1" class="spring2.bean.Person" autowire="byType">
<property name="name" value="小明"></property>
<property name="car" ref="car1"></property>
</bean>
<bean id="person2" parent="person1"></bean>
person2繼承了person1的所有屬性,當自身屬性于父類不一樣時可以重新在<property>標簽中定義自己的屬性值,將會覆蓋父類原有的屬性值。注意abstract和autowire的屬性不會被子Bean繼承
抽象Bean
<bean id="abstractPerson" abstract="true" >
<property name="name" value="tom"></property>
<property name="car" ref="car1"></property>
</bean>
抽象Bean并不是一個只是存在的Bean,而是一個具有相同一類屬性的Bean的一個模板,class屬性可以去掉,于java中抽象類非常類似