1. 程式人生 > >Spring學習----------AOP以及Spring配置檔案詳解

Spring學習----------AOP以及Spring配置檔案詳解

            之前有寫了Spring的一個特性IOC,現在在來寫Spring的另一個特性AOP,AOP中個一些概念,看了網路上的講解AOP的文章,講的都很正確,可是不是很好理解,我在來寫一點,可能不太精確,但理解容易點。AOP是用動態代理(裝飾模式),解決橫切行問題:下面看下AOP中概念.

                 Aspect:是一個橫切行問題的一個抽象。他不是具體實現,只是一個橫切面。

                Adivce:是對橫切行問題的一個具體實現,比如我們對Service前進行安全檢查,那麼Advice可能就是一個安全檢查的一個具體的類,其中實現了安全檢查的一個具體的方法。

                JoinPoint:現在我們已經知道了橫切性問題了(Aspect),和橫切行問題的具體實現(Adivce)那個,我們在哪植入Advice了,我們在JoinPoint標出,比如Service中的addUser方法。

                PointCut:ok,現在有個JoinPoint,那麼理解PointCut就容易了,PointCut就是對JoinPoint集合的一個選擇規則,比如add*表示,所有的add開頭的方法都是JoinPoint

                Weaving:是一個過程,是將Adivce植入到JoinPoint的一個動作。

     <!--   下面是網友總結的-->

  • 目標物件(Target Object):被一個或者多個切面所通知的物件。例如,AServcieImpl和BServiceImpl,當然在實際執行時,Spring AOP採用代理實現,實際AOP操作的是TargetObject的代理物件。
  • AOP代理(AOP Proxy)在Spring AOP中有兩種代理方式,JDK動態代理和CGLIB代理。預設情況下,TargetObject實現了介面時,則採用JDK動態代理,例如,AServiceImpl;反之,採用CGLIB代理,例如,BServiceImpl。強制使用CGLIB代理需要將<aop:config>
    proxy-target-class 屬性設為true

下面我們看下Spring配置檔案的具體實現

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
	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-3.0.xsd"
	 >

    <!-- 配置 dataSource -->
	<bean id="dataSource"
	      class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"
			value="com.mysql.jdbc.Driver">
		</property>
		<property name="url"
			value="jdbc:mysql://localhost:3306/blog_ssh">
		</property>
		<property name="username" value="root"></property>
		<property name="password" value="43995201"></property>
	</bean>
	
	<!-- 配置sessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="mappingResources">
		   <list>
		      <value>com.lee.pojo.Article.hbm.xml</value>
		      <value>com.lee.pojo.ArticleType.hbm.xml</value>
		      <value>com.lee.pojo.Consumer.hbm.xml</value>
		      <value>com.lee.pojo.Discuss.hbm.xml</value>
		      <value>com.lee.pojo.Friend.hbm.xml</value>
		      <value>com.lee.pojo.Photo.hbm.xml</value>
		      <value>com.lee.pojo.Restore.hbm.xml</value>
		      <value>com.lee.pojo.Vote.hbm.xml</value>
		   </list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.MySQLDialect
				</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
				<prop key="hibernate.show_sql">true</prop>
			</props>
		</property>
	</bean>
	
	<!-- 配置事務管理器 -->
	<bean id="tansacationManger" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	     <property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	
	<!-- 配置事務的傳播特行(JoinPoint) -->
	<tx:advice id="txAdvice" transaction-manager="tansacationManger"> 
      <tx:attributes>
        <tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>
        <tx:method name="*" read-only="true"/> 
      </tx:attributes> 
    </tx:advice>  
	
	<!-- 配置那些類參與事務(PointCut) -->
	<aop:config> 
       <aop:pointcut id="transactionPointcut" expression="execution(* com.lee.service.*.*(..))"/> 
       <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/> 
    </aop:config> 
</beans>

<!--這個連結是Spring配置的 5種方法,樓主頂http://www.blogjava.net/robbie/archive/2009/04/05/264003.html-->