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>  

你可能感兴趣的:(java,spring,AOP,xml,bean)