1.概念:AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
使用这种AOP方式要求目标类有接口+实现类,如没有接口只有实现类,则要使用CGLIB的方式。
2.术语:
2.1 target:目标类,需要被代理的类。例如:UserService
2.2 Joinpoint(连接点):所谓连接点是指那些可能被拦截到的方法。例如:所有的方法
2.3 PointCut 切入点:已经被增强的连接点。例如:addUser()
2.4 advice 通知/增强,增强代码。例如:after、before
2.5 Weaving(织入):是指把增强advice应用到目标对象target来创建新的代理对象proxy的过程.
2.6 proxy 代理类
2.7 Aspect(切面): 是切入点pointcut和通知advice的结合
一个线是一个特殊的面。
一个切入点和一个通知,组成成一个特殊的面。
3.代码
3.1 创建IUserService的接口
public interface IUserService {
// 面向切面编程
public void addUser();
public void updateUser();
public int deleteUser(int id);
}
3.2 UserServiceImpl类实现IUserService接口
public class UserServiceImpl implements IUserService {
@Override
public void addUser() {
System.out.println("Service 添加用户");
}
@Override
public void updateUser() {
System.out.println("Service 更新用户");
}
@Override
public int deleteUser(int id) {
System.out.println("Service 通过id删除用户");
return 1;
}
}
3.3 声明一个面向切面的对象,如我这里写的是MyAspect
//切面类,代码增强与切入点的结合
public class MyAspect {
public void before(){
System.out.println("开启事务");
}
public void after(){
System.out.println("提交事务");
}
}
3.4 实现一个UserService的工厂类
public class UserServiceFactory {
public static IUserService createUserService(){
// 1.创建目标对象target
IUserService userService = new UserServiceImpl();
// 2.声明切面类对象
MyAspect aspect = new MyAspect();
// 3.把切面类2个方法 应用 目标类
// 3.1 创建JDK代理
IUserService serviceProxy = (IUserService) Proxy.newProxyInstance(UserServiceFactory.class.getClassLoader(), userService.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法名:"+method.getName());
System.out.println("参数:"+args);
// 开始事务
aspect.before();
Object o = method.invoke(userService,args);
System.out.println("JDK代理拦截返回值"+o);
// 结束事务
aspect.after();
return o;
}
});
return serviceProxy;
}
}
3.5 测试
public class Test {
@Test
public void Test(){
IUserService userService = UserServiceFactory.createUserService();
userService.deleteUser(10);
userService.add();
userService.updateUser();
}
}
结果如下: