Spring 中的AOP学习

例子:
1.定义接口和实现(for interceptor)
public interface ITest {
public abstract void doTest(int i);
public abstract void executeTest();
}
public class Test implements ITest{
public void doTest(int i){
System.out.println(i);
}
public void executeTest(){
for (int i=0;i<250000;i++){

}
}
}

2.Before Advice定义
import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

/**
* 在方法调用联结点之前触发
* @author Administrator
*
*/
public class TracingBeforeAdvice implements MethodBeforeAdvice{

public void before(Method m, Object[] args, Object target) throws Throwable{
System.out.println( "Hello world! (by " + this.getClass().getName() + ")");
}
}

3.After Advice定义
import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

/**
* 在方法调用联结点之后触发通知
* 只有在联结点在无异常的情况下获得返回值时才运行通知
* @author Administrator
*
*/
public class TracingAfterAdvice implements AfterReturningAdvice{
public void afterReturning(Object object,
Method m,
Object[] args,
Object target)
throws Throwable {
System.out.println("Hello world! (by " + this.getClass().getName() +")");
}
}

4.Around Advice定义
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class AroundAdvice implements MethodInterceptor{
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Hello world! (by " + this.getClass().getName() +")");

invocation.getArguments()[0] = 20;

invocation.proceed();

System.out.println("Goodbye! (by " + this.getClass().getName() + ")");
return null;
}
}

5.applicationContext.xml配置文件
    <!--通知bean -->
<bean id="theAroundAdvice"
class="com.logcd.spring.aop.AroundAdvice"/>
<bean id="theTracingBeforeAdvice"
class="com.logcd.spring.aop.TracingBeforeAdvice"/>
<bean id="theTracingAfterAdvice"
class="com.logcd.spring.aop.TracingAfterAdvice"/>

<!-- 将切入点定义与通知bean关联起来 -->
<bean id="theTracingBeforeAdvisor"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref local="theTracingBeforeAdvice" />
</property>
<property name="patterns">
<list>
<value>.*do.*</value>
<value>.*execute.*</value>
</list>
</property>
</bean>

附:通过名称选择方法
<bean id="theTracingBeforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">  
<property name="mappedName">
<!--可以使用mappedNames定义方法列表-->
<value> doTest </value> <!-- 方法名 -->
</property>
<property name="advice">
<ref bean=" theTracingBeforeAdvice "/>
</property>
</bean>

Pattern属性符:
. 符合任何单一字符 + 符合前一个字符一次或多次 *  符合前一个字符零次或多次

    <bean id="theTracingAfterAdvisor"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref local="theTracingAfterAdvice" />
</property>
<property name="patterns">
<list>
<value>.*do.*</value>
<value>.*execute.*</value>
</list>
</property>
</bean>

<bean id="theAroundAdvisor"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref local="theAroundAdvice" />
</property>
<property name="patterns">
<list>
<value>.*do.*</value>
</list>
</property>
</bean>

<!—-受监控的对象-->
<bean id="test" class="com.logcd.spring.aop.Test"/>

<!—启动拦截-->
<bean id="myAOPProxy"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.logcd.spring.aop.ITest</value>
</property>
<!--是否强制使用CGLIB进行动态代理
<property name="proxyTargetClass">
<value>true</value>
</property>
-->
<property name="target">
<ref local="test"/>
</property>
<property name="interceptorNames">
<list>
<value>theTracingBeforeAdvisor</value>
<value>theTracingAfterAdvisor</value>
<value>theAroundAdvisor</value>
</list>
</property>
</bean>

6.测试
public void testAOP() {
ApplicationContext ctx=new
FileSystemXmlApplicationContext("applicationContext.xml");
ITest test = (ITest) ctx.getBean("myAOPProxy");
test.doTest(10);
test.executeTest();
}

7. 如果要为目标对象提供advice,必须要为其建立代理对象,如果程序规模很大时,一个个代理会很麻烦,spring提供了自动代理BeanNameAutoProxyCreator与 DefaultAdvisorAutoProxyCreator
BeanNameAutoProxyCreator:根据beanName进行自动代理.
spring配置:
	<bean id="beanNameAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
<property name="beanNames">
<list>
<value>*test</value>
</list>
</property>
<property name="interceptorNames">
<value>theAroundAdvisor</value>
</property>
</bean>

8. 可以定义BeanNameAutoProxyCreator,该bean是个bean后处理器,无需被引用,因此没有id属性,这个bean后处理器,根据事务拦截器为目标bean自动创建事务代理,比如配置:
<!-- Spring声明式事务 –->
<bean id="transactionManager"  
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="autoProxyCreator"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames" value="transactionInterceptor" />
<property name="beanNames" value="*Dao,*Po,*Tao,*BatchDeal" /> </bean>
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributeSource" ref="transactionAttributeSource" />
</bean>
<bean id="transactionAttributeSource" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
<property name="properties">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> </props>
</property>
</bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值