關於spring的配置檔案總結

阿木俠發表於2017-06-03

spring比較龐大,很多功能實現依賴配置檔案,比較繁瑣的配置檔案確實比較頭疼,這裡通過查閱,上網等方法總結了關於spring配置檔案的內容,如果有不全或者失誤之處希望大家多多指正。

<beans     這裡是配置檔案的根節點,所有配置在beans中,內可以包含多個bean

         xmlns=http://www.springframework.org/schema/beans

xmlns:XML NameSpace的縮寫,因為XML檔案的標籤名稱都是自定義的,自己寫的和其他人定義的標籤很有可能會重複命名,而功能卻不一樣,所以需要加上一個namespace來區分這個xml檔案和其他的xml檔案,類似於Java中的package

————————————————————————————————————————

         xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

xmlns:xsi: 是指xml檔案遵守xml規範,xsi全名:xml schema instance,是指具體用到的schema資原始檔裡定義的元素所準守的規範。即http://www.w3.org/2001/XMLSchema-instance這個檔案裡定義的元素遵守什麼標準

         上面兩個是最基本的名稱空間,必不可少的       

————————————————————————————————————————

  xmlns:p=http://www.springframework.org/schema/p

xmlns:p工程中為了簡化配置,使用p標籤時,就需要開啟這個名稱空間,開啟後才能識別p標籤的配置


 如:使用p標籤前的配置:

<bean name=" classicBean"class="com.example.TestBean"> 
   <property name="email" value="577@qq.com"/> 
</bean>

使用p標籤簡化後:

<bean name=" p-namespaceBean"class="com.example.TestBean" p:email="577@qq.com"/> 

————————————————————————————————————————

xmlns:aop=http://www.springframework.org/schema/aop

xmlns:aop啟用AOP功能時的名稱空間,使用切面等都要用到,spring的核心之一,一般情況都會啟動的名稱空間


常用到的spring的宣告通知:

前置通知:<aop:before>

後置通知:<aop:after-returning>

異常通知:<aop:after-throwing>

最終通知:<aop:after>

環繞通知:<aop:around>

關於前後置常用通知的具體細節,以前部落格中有介紹:

http://blog.csdn.net/weixin_36380516/article/details/72551678

————————————————————————————————————————

xmlns:tx=http://www.springframework.org/schema/tx

xmlns:tx啟動宣告式事務時的名稱空間

————————————————————————————————————————

         xmlns:c=http://www.springframework.org/schema/c

xmlns:cp標籤一樣,都是為了簡化spring的配置的,使用c標籤時要開啟這個空間,使c標籤能夠識別

比如:傳統配置方法:

<bean id="bar"class="x.y.Bar"/> 
<bean id="baz"class="x.y.Baz"/> 
<bean id="foo"class="x.y.Foo"> 
   <constructor-arg ref="bar"/> 
   <constructor-arg ref="baz"/> 
   <constructor-arg value="577@qq.com /> 
</bean>

使用c標籤後:

<bean id="bar"class="x.y.Bar"/> 
<bean id="baz"class="x.y.Baz"/> 
<bean id="foo"class="x.y.Foo" c:bar-ref="bar" c:baz-ref="baz"c:email="577@qq.com "/>

————————————————————————————————————————

xmlns:cache=http://www.springframework.org/schema/cache

xmlns:cache開啟快取標註空間,Spring框架提供了大量的快取相關的標註,在應用中通過使用這些快取標註實現快取。要使用快取標註,首先需要配置開啟快取標註空間。


開啟後在應用中就可以引用Spring框架的快取標註,如:

@Cacheable("a_cache_name"),作用於被緩衝的方法,對方法執行結果的快取

@CacheEvict,作用於被緩衝的方法,將方法執行的結果從快取中移除

@CachePut,更新快取

@Caching,將作用於一個方法的多個快取操作打包為一個整體

@CacheConfig,作用於Java類,設定通用的快取相關引數

————————————————————————————————————————

         xmlns:util=http://www.springframework.org/schema/util

xmlns:util意思是開啟util空間,util標籤可以進行簡化操作,使用<util:list><util:map><util:set><util:properties>等標籤,用它來取代ListFactoryBeanMapFactoryBeanSetFactoryBeanPropertiesFactoryBean

用它來取代ListFactoryBeanMapFactoryBeanSetFactoryBeanPropertiesFactoryBean

         如:使用<util:property-path>標籤為某個Bean的屬性成員設定id屬性,使之在容器管理中,而不必設定org.springframework.beans.factory.config.PropertyPathFactoryBean

<util:property-path  id="PI"
path="user.pi"/>

id值設定為PI的Bean,其值將會是user.pi

————————————————————————————————————————

xmlns:task=http://www.springframework.org/schema/task

xmlns:task開啟配置定時器空間,spring框架提供了對定時器的支援,通過配置檔案就可以很好的實現定時器,只需要應用啟動,就自動啟動定時器。

關於spring中定時器的使用,上一篇部落格有介紹:

http://blog.csdn.net/weixin_36380516/article/details/72596834

————————————————————————————————————————

         xmlns:oxm=http://www.springframework.org/schema/oxm

xmlns:oxm開啟OXM進行物件XML對映的空間,Spring OXM對主流O/X Mapping框架做了一個統一的抽象和封裝,MarshallerUnmarshallerSpring OXM兩個核心介面。Marshaller用於將物件轉成XMLUnmarshaller用於將XML轉成物件。

————————————————————————————————————————

         xmlns:mvc=http://www.springframework.org/schema/mvc

xmlns:mvc當使用springMVC開發Web專案時,就要開啟這個名稱空間

————————————————————————————————————————

         xmlns:lang=http://www.springframework.org/schema/lang

xmlns:lang lang用來將那些已經被定義在一些動態語言(例如JrubyGroovy)中的物件作為beans中的物件存放到spring容器中。展示還沒有用到過。。

————————————————————————————————————————

         xmlns:jms=http://www.springframework.org/schema/jms

xmlns:jmsspring整合jms時需要開啟的空間,是springjms的封裝,用來簡化非同步接收訊息的程式碼。官方文件:

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/core/JmsTemplate.html

————————————————————————————————————————

         xmlns:jee=http://www.springframework.org/schema/jee

xmlns:jee 開啟jee標籤空間,jee標籤用來處理javaee標準相關的問題,例如查詢一個jndi物件以及定義一個ejb的引用等。

一般使用org.springframework.jndi.JndiObjectFactoryBean方法配置datasource資料來源的時候開啟這個名稱空間。

————————————————————————————————————————

         xmlns:jdbc=http://www.springframework.org/schema/jdbc

xmlns:jdbc開啟jdbc的名稱空間,之後配置檔案中可以使用jdbc標籤了,例如:

配置<jdbc:initialize-database>標籤,在spring工程啟動時,去執行一些sql,也就是初始化資料庫。比如向資料庫中建立一些表及插入一些初始資料等。sql的路徑需要在其子標籤jdbc:script中去指定。

————————————————————————————————————————

         xmlns:context=http://www.springframework.org/schema/context

xmlns:context:開啟上下文標籤,可以用來為spring配置檔案引入其他地方的配置,如,最常見的呼叫資料庫配置db.properties檔案:

<context:property-placeholderlocation="classpath:db.properties"/>

————————————————————————————————————————

         xsi:schemaLocation="http://www.springframework.org/schema/oxm

xsi:schemaLocation:是指本文件裡的xml元素所遵守的規範,這些規範都是由官方制定的,可以進你寫的網址裡面看版本的變動。xsd的網址還可以幫助你判斷使用的程式碼是否合法。


下面根據一份applicationContext.xml檔案,說明每一步配置的作用:

<?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"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:c="http://www.springframework.org/schema/c"
	xmlns:cache="http://www.springframework.org/schema/cache"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:task="http://www.springframework.org/schema/task"
	xmlns:oxm="http://www.springframework.org/schema/oxm"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:lang="http://www.springframework.org/schema/lang"
	xmlns:jms="http://www.springframework.org/schema/jms"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/oxm 
		http://www.springframework.org/schema/oxm/spring-oxm-4.1.xsd
		http://www.springframework.org/schema/jms 
		http://www.springframework.org/schema/jms/spring-jms-4.1.xsd
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
		http://www.springframework.org/schema/jee 
		http://www.springframework.org/schema/jee/spring-jee-4.1.xsd
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-4.1.xsd
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/util 
		http://www.springframework.org/schema/util/spring-util-4.1.xsd
		http://www.springframework.org/schema/jdbc 
		http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd
		http://www.springframework.org/schema/cache 
		http://www.springframework.org/schema/cache/spring-cache-4.1.xsd
		http://www.springframework.org/schema/task 
		http://www.springframework.org/schema/task/spring-task-4.1.xsd
		http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
		http://www.springframework.org/schema/lang 
		http://www.springframework.org/schema/lang/spring-lang-4.1.xsd
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx.xsd">
	
		<!-- 資料庫資訊資料來源 -->
		<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		
			<!-- 指定連線資料庫的驅動 -->
			<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver">
			</property>
			
			<!-- 連線資料庫的url -->
			<property name="url" value="jdbc:oracle:thin:@localhost:1521:dalin">
			</property>
			
			<!-- 使用者名稱密碼 -->
			<property name="username" value="ssh"></property>
			<property name="password" value="123"></property>
			
			<!-- 設定資料庫連線池的最大連線數 -->
			<property name="maxPoolSize">
				<value>20</value>
			</property>
			
			<!-- 設定資料庫連線池的最小連線數 -->
			<property name="minPoolSize">
				<value>2</value>
			</property>
			
			<!-- 設定資料庫連線池的初始化連線數 -->
			<property name="initialPoolSize">
				<value>2</value>
			</property>
			
			<!-- 設定資料庫連線池的連線的最大空閒時間,單位為秒 -->
			<property name="maxIdleTime">
				<value>10</value>
			</property>
	</bean>
		
		<!-- 定義sessionFactory -->
		<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<!-- 注入資料來源 -->
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.Oracle9Dialect
				</prop>
				<!-- <prop key="hibernate.show_sql">true</prop>  -->
			</props>
		</property>
		<!-- hibernate的對映檔案,這個自動生成,一般不改動 -->
		<property name="mappingResources">
			<list>
				<value>org/jvsun/pojo/Buy.hbm.xml</value>
				<value>org/jvsun/pojo/BuyDetail.hbm.xml</value>
				</list>
		</property></bean>
		<!-- 採購單配置開始 -->
	<bean id="BuyAction" class="org.jvsun.action.BuyAction">  
        <property name="services" ref="BuyServices"></property>  
    </bean>  
    <bean id="BuyServices" class="org.jvsun.services.impl.BuyServicesImpl">  
        <property name="dao" ref="BuyDAO"></property>  
    </bean>  
    <bean id="BuyDAO" class="org.jvsun.dao.impl.BuyDAOImpl">  
        <property name="sessionFactoy" ref="sessionFactory"></property>  
    </bean> 
		<!-- 採購單配置結束 -->
		
		<!-- 定義使用的事務管理器 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	
	 <!-- 定義需要進行事務攔截的方法及所採用的事務控制型別 --> 
	<!--propagation="REQUIRED",事務的衍生方式為必需,即事務的傳播方式。有則用現成事務無則建立新的-->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="do*" propagation="REQUIRED" />
			<tx:method name="find*" propagation="REQUIRED" />
			<!-- 這表明僅對do和find開頭的方法進行事務控制,REQUIRED宣告這些如果當前沒有事務就去建立一個新的,如果有的話就用當前事務 -->
		</tx:attributes>
	</tx:advice>
	
	
	
	<!-- 宣告一個切入點 -->
	<aop:config>
		<aop:pointcut id="productServiceMethods"
			expression="execution(* org.jvsun.services.impl.*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="productServiceMethods" />
	</aop:config>
	<!-- 
	execution切入點指示符 ,用法稍後說
	-->
	
	
	<!-- 宣告支援事務註解的(@Transactional) -->
	<tx:annotation-driven transaction-manager="transactionManager" />
</beans>

切入點表示式說明:

execution切入點指示符

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

除了返回型別模式(上面程式碼片斷中的ret-type-pattern),名字模式和引數模式以外, 所有的部分都是可選的

引數模式稍微有點複雜:

1,()匹配了一個不接受任何引數的方法

2,(..)匹配了一個接受任意數量引數的方法(零或者更多)

3,模式(*)匹配了一個接受一個任何型別的引數的方法

4,模式(*,String)匹配了一個接受兩個引數的方法,第一個可以是任意型別, 第二個則必須是String型別

例如:

任意公共方法的執行:

execution(public * *(..))

任何一個名字以“set”開始的方法的執行:

execution(* set*(..))

AccountService介面定義的任意方法的執行:

execution(* com.xyz.service.AccountService.*(..))

在service包中定義的任意方法的執行:

execution(* com.xyz.service.*.*(..))

在service包或其子包中定義的任意方法的執行:

execution(* com.xyz.service..*.*(..))

大概就這麼多了,歡迎大家補充。

相關文章