Spring學習----------AOP以及Spring配置檔案詳解
阿新 • • 發佈:2019-02-04
之前有寫了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-->