使用ProxyFactoryBean实现AOP基础
使用ProxyFactoryBean实现AOP
一、业务分类
主业务逻辑 OOP biz
横切业务逻辑 AOP advice
二、实现步骤
1、jar
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
2、定义一个接口
package cn.com.bochy.istu;
import java.util.List;
import cn.com.bochy.entity.Stu;
public interface IStuBiz {
public List<Stu> getAll();
public boolean save(Stu s);
public boolean update(Stu s);
public boolean delete(Stu s);
public Stu getStuByID(int id);
}
3、接口的实现类:主业务逻辑
package cn.com.bochy.istuImpl;
import java.util.List;
import cn.com.bochy.entity.Stu;
import cn.com.bochy.istu.IStuBiz;
public class StuBizImpl implements IStuBiz {
@Override
public List<Stu> getAll() {
System.out.println("getAll.....");
return null;
}
@Override
public boolean save(Stu s) {
System.out.println("save a stu....");
return false;
}
@Override
public boolean update(Stu s) {
System.out.println("update a stu....");
return false;
}
@Override
public boolean delete(Stu s) {
System.out.println("delete a stu.....");
return true;
}
@Override
public Stu getStuByID(int id) {
System.out.println("get a stu by id");
return null;
}
}
4、定义横切业务逻辑
1、before advice
package cn.com.bochy.advices;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class beforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method arg0, Object[] arg1, Object arg2)
throws Throwable {
System.out.println("before.....");
}
}
2、around advice
package cn.com.bochy.advices;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class aroundAdvice implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
System.out.println("around....");
Object result=null;
result=arg0.proceed();
return result;
}
}
3、after advice
package cn.com.bochy.advices;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class afterAdvice implements AfterReturningAdvice{
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
System.out.println("after....");
}
}
5、配置AOP:把横切业务逻辑织入横切业务逻辑
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" >
<beans>
<bean id="stu" class="cn.com.bochy.entity.Stu"></bean>
<bean id="stuBiz" class="cn.com.bochy.istuImpl.StuBizImpl"></bean>
<bean id="before" class="cn.com.bochy.advices.beforeAdvice"></bean>
<bean id="around" class="cn.com.bochy.advices.aroundAdvice"></bean>
<bean id="after" class="cn.com.bochy.advices.afterAdvice"></bean>
<!-- 把横切业务逻辑织入横切业务逻辑 -->
<bean id="aop" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 指定代理类和被代理类共同的接口 -->
<property name="interfaces" value="cn.com.bochy.istu.IStuBiz"></property>
<!-- 指定所有的拦截器(织入横切业务逻辑) -->
<property name="interceptorNames">
<list>
<value>before</value>
<value>around</value>
<value>after</value>
</list>
</property>
<!-- 指定横切业务逻辑在哪里执行 ,执行的目标 -->
<property name="target" >
<ref bean="stuBiz"/>
</property>
</bean>
</beans>