方式一实现MethodBeforeAdvice接口
方式二使用spring定义纯粹POJO切面
方式三与方式一一样 只是使用了spring的DefaultAdvisorAutoProxyCreator自动创建代理
package com.provider.aop;
public interface Runable {
public void run();
}
package com.provider.aop;
public class People implements Runable{
@Override
public void run() {
System.out.println("people run");
}
}
package com.provider.aop;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
public class RunAdice implements MethodBeforeAdvice,AfterReturningAdvice{
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println(returnValue);
System.out.println(method);
System.out.println(target);
System.out.println("afterReturning");
}
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println(method);
System.out.println(target);
System.out.println("before");
}
}
package com.provider.aop;
import org.aspectj.lang.JoinPoint;
public class RunAdice2{
public void afterReturning() {
System.out.println("afterReturning*****");
}
public void beforeReturning(JoinPoint jp) {
System.out.println("------");
System.out.println("before*****"+jp.getTarget()+"/"+jp.getSignature().getName());
}
}
<bean id="people" class="com.provider.aop.People"></bean>
<bean id="runAdice" class="com.provider.aop.RunAdice"></bean>
<bean id="runAdice2" class="com.provider.aop.RunAdice2"></bean>
<bean id="runPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value=".*run" />
</bean>
<bean id="sleepHelperAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="runAdice" />
<property name="pointcut" ref="runPointcut" />
</bean>
<bean id="peopleProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="people" />
<property name="interceptorNames" value="runAdice" />
<property name="proxyInterfaces" value="com.provider.aop.Runable" />
</bean>
<aop:aspectj-autoproxy/>
<aop:config>
<aop:aspect ref="runAdice2">
<aop:before method="beforeReturning" pointcut="execution(* *.run(..))"/>
<aop:after method="afterReturning" pointcut="execution(* *.run(..))"/>
</aop:aspect>
</aop:config>
package com.provider.aop;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"spring-core.xml"})
public class AopTest {
@Autowired
@Qualifier("peopleProxy")
Runable p;
@Test
public void testrun(){
p.run();
}
}
使用DefaultAdvisorAutoProxyCreator
package com.provider.aop;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.aop.support.RegexpMethodPointcutAdvisor;
@Configuration
public class AppConfig {
public @Bean RunAdice runAdice(){
return new RunAdice();
}
public @Bean(name="peple") People people(){
return new People();
}
public @Bean RegexpMethodPointcutAdvisor RegexpMethodPointcutAdvisor(){
org.springframework.aop.support.RegexpMethodPointcutAdvisor regexpMethodPointcutAdvisor = new RegexpMethodPointcutAdvisor();
regexpMethodPointcutAdvisor.setAdvice(runAdice());
regexpMethodPointcutAdvisor.setPattern(".*run");
return regexpMethodPointcutAdvisor;
}
public @Bean DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){
return new DefaultAdvisorAutoProxyCreator();
}
}
package com.provider.aop;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={AppConfig.class})
public class AppConfigTest {
@Autowired
Runable p;
@Test
public void testrun(){
p.run();
}
}