依賴注入:讓各個模塊保持鬆散耦合
AOP面向切面編程:各個組件負責特定核心功能,不需要考慮事務,日誌,安全等系統服務功能,AOP將這些每個模塊都需要考慮的服務模塊化,並以聲明的方式將它們應用到它們需要影響的組件模塊中去,使得各個業務模塊更多關注自身業務,無需瞭解系統服務功能。使POJO保持簡單。
一.spring裝配bean之基於xml文件配置的方式
創建應用對象之間的協作關係的行爲通常被稱爲裝配。spring容器提供了兩種配置bean的方式:xml文件配置方式,基於java註解的配置方式。
1.1創建spring的配置,如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--bean declaratuion go here 在<beans>元素內,放置所有Spring的配置 -->
</beans>
1.2聲明簡單的bean:可以通過構造器方法和工廠方法創建bean。
構造器方法:spring容器加載bean時,調用默認的構造器實例化。
<bean id="demoBean" class="com.demo.client.DemoBean" />
構造器方法:聲明指定構造方法通過構造器注入參數的值。通過<constructor-arg>元素來告訴spring額外的信息。
<bean id="demoBean" class="com.demo.client.DemoBean" >
<constructor-arg value="param的值" />
<constructor-arg ref="param爲具體某個自定義類型,即某個聲明的bean的id" />
</bean>
舉個例子:
<bean id="demoBean" class="com.demo.client.DemoBean" >
<constructor-arg value="10" />
<constructor-arg ref="demoId" />
</bean>
<bean id="demoId" class="com.demo.client.DemoParam" />
注意:對於非簡單類型,比如自定義類型,spring使用ref屬性來將指定Id的Bean引用傳遞給構造器。
工廠方法:針對於無公開構造方法的bean
<bean id="demoId"
class="com.demo.client.DemoParam"
factory-method="類的靜態方法" />
1.3 bean的作用域
<bean id="demoId"
class="com.demo.client.DemoParam" scope="prototype" />
singleton |
在每一個Springle容器中,一個bean定義只有一個對象實例(默認) |
prototype |
允許bean的定義可以被實例化任意次(每次調用都創建一個實例) |
request |
在一次Http請求中,每個bean定義對應一個實例,該作用域僅在基於web的spring上下文中才有效 |
session |
在一個Http Session請求中,每個bean定義對應一個實例,該作用域僅在基於web的spring上下文中才有效 |
global-session |
在一個全局Http Session請求中,每個bean定義對應一個實例,該作用域僅在portlet上下文中才有效 |
1.4 初始化和銷燬bean
<bean id="demoId"
class="com.demo.client.DemoParam" scope="prototype"
init-method="Bean實例化後立即調用初始化指定的方法"
destory-method="Bean從容器中移除和銷燬前,調用的方法"/>
此外,還有默認的init-method和destory-method。比如在上下文定義中有很多Bean都擁有相同名字的初始化方法和銷燬方法。此時沒有必要爲每一個bean聲明init-method和destory-method。可以使用<beans>元素的default-init-method和default-destory-method屬性。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
default-init-method=“Bean實例化後立即調用初始化指定的方法”
default-destory-method=“Bean從容器中移除和銷燬前,調用的方法”
</beans>
default-init-method和default-destory-method屬性分別爲應用上下文中所有bean設置了共同的初始化方法和銷燬方法。
1.5注入bean屬性
使用<property>元素配置Bean屬性,通過setter方法注入值。與<constructor-arg>類似,只是<constructor-arg>通過構造參數注入值。
<bean id="demoId"
class="com.demo.client.DemoParam" scope="prototype"
<property name = "key" value="the key value">
<property name = "demoParam (DemoParam類型的屬性名,比如這裏是demoParam)" ref="demoId">
</bean>
使用spring命名空間p裝配屬性。在spring的xml配置中增加聲明:xmlns:p="http://www.springframework.org/schema/p"
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
<bean id="demoId"
class="com.demo.client.DemoParam" scope="prototype"
p : key="the key value"
p : demoParam-ref = "the key value" />
-ref後綴作爲一個標識來告知spring應該裝配一個引用而不是字面值。
使用表達式裝配SpEL
它通過運行期執行的表達式將值裝配到bean的屬性或者構造參數中。在<property>元素中的value屬性中使用#{}界定符把這個值裝配到bean的屬性值。
1.6裝配集合
spring提供了4種類型的集合配置元素。
<list> |
裝配list類型的值,可重複 |
<set> |
裝配set類型的值,不可重複 |
<map> |
裝配map類型的值,名稱和值可以爲任意類型 |
<props> |
裝配properties類型的值,名稱和值必須是string類型 |