什么是AOP?

          AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

应用场合:事务管理、性能监视、安全检查、缓存 、日志等。

Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码。

AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码。

纵向继承:

横向抽取:

AOP底层将采用代理机制实现

1.接口 + 实现类 :spring采用 jdk 的动态代理Proxy

2.实现类:spring 采用 cglib字节码增强代理。

代码实现:在增删改方法之前,增加事务处理(开启事物,提交事物),前提不修改当前类。

userService.java
public interface userService {
void save();
void delete();
void update();
void find();
}
userServiceImpl.java
@Component("userService")
public class userServiceImpl implements userService{
//增强 public void save() { System.out.println("保存用户"); } public void delete() {
//
System.out.println("删除用户");
//
} public void update() { System.out.println("修改用户");
} public void find() {
System.out.println("查找用户");
} }

1)JDK 动态代理

jdk动态代理实现主要靠Proxy类和InvocationHandler接口来实现。

userServiceProxyFactory.java

public class userServiceProxyFactory implements InvocationHandler{
//代理对象
private userService us; public userServiceProxyFactory(userService us){
super();
this.us=us;
}
//返回代的对象
//参数1,类加载器 参数2,代理类的接口 参数3.实现增强的代码(对原方法增强的一个方法)
public userService getUserServiceProxy(){
return (UserService)Proxy.newProxyInstance(userServiceProxyFactory.class.getClassLoader(),
UuerServiceImpl.class.getInterfaces(),this); }
@Override
//参数1,代理对象 参数2,原代理对象的方法 参数3,代理方法的参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强
System.out.println("开启事务"); //前置通知
Object invoke = method.invoke(us, args); //调用原方法(切入点) + (通知) = 切面
System.out.println("提交事务"); //后置通知
return invoke;
} }

测试代码:

public class Mytest {

    @Test//动态代理
public void test(){
userService us = new userServiceImpl();
userServiceProxyFactory factory = new userServiceProxyFactory(us);
userService userServiceProxy = factory.getUserServiceProxy();//返回代理后的对象
//未使用jdk动态代理
us.save();
System.out.println("--------------------------");
//使用动态代理对象
userServiceProxy.save();
}
}

2)CGLIB代理

public class UserServiceProxyFactory2 {
//代理对象
/*private UserService us; public UserServiceProxyFactory2(UserService us){
super();
this.us=us;
}*/
//返回代理对象
public UserService getUserServiceProxy(){
Enhancer en = new Enhancer(); //帮我们生成代理对象
en.setSuperclass(UserServiceImpl.class);
en.setCallback(new MethodInterceptor() {
@Override
//参数1,目标对象 参数2,目标对象的方法 参数3,方法中参数 参数4 代理方法
public Object intercept(Object proxyObj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("开启事务");
//目标方法调用
//Ojbect invoke = method.invoke(us, args)
Object invokeSuper = methodProxy.invokeSuper(proxyObj, args);
System.out.println("提交事务"); return invokeSuper;
}
});
UserService us = (UserService) en.create(); //创建代理对象
return us;
}
}

测试代码

public class Mytest {

    @Test
public void test2(){
UserServiceProxyFactory2 factory = new UserServiceProxyFactory2();
UserService userServiceProxy = factory.getUserServiceProxy();
UserServiceProxy.save();
} }

04_Spring AOP两种代理方法的更多相关文章

  1. 死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  2. spring AOP的两种代理

    本篇记录下spring AOP的两种代理,为下一篇AOP实现做下铺垫. 1.JDK动态代理  2.cglib代理 1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP2.如果目标对象 ...

  3. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  4. Spring两种代理区别

    Spring的两种代理JDK和CGLIB的区别浅谈: Java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用invokeHandler类来处理: 而cglib动态代理是利用a ...

  5. Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对 ...

  6. Spring-Aop的两种代理方式

    Spring-Aop两种代理方式: 1.JDK动态代理:用于目标类实现了接口: 2.Cglib动态代理:用于目标类没有实现接口: spring会依据目标类是否实现接口来选择使用哪种代理方式(目标类:相 ...

  7. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  8. git两种合并方法 比较merge和rebase

    18:01 2015/11/18git两种合并方法 比较merge和rebase其实很简单,就是合并后每个commit提交的id记录的顺序而已注意:重要的是如果公司用了grrit,grrit不允许用m ...

  9. 两种Ajax方法

    两种Ajax方法 Ajax是一种用于快速创建动态网页的技术,他通过在后台与服务器进行少量的数据交换,可以实现网页的异步更新,不需要像传统网页那样重新加载页面也可以做到对网页的某部分作出更新,现在这项技 ...

随机推荐

  1. Java常用文件下载与查找的URL

    Java JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html Tomcat: http://tomcat.a ...

  2. Apache2.2+tomcat7 负载均衡配置

    思路及步骤:第一步配置tomcat,第二步配置apache 服务器,第三步添加项目到tomcat中并测试 第一步配置tomcat 1,打开 第一个tomcat,conf文件夹下的server.xml ...

  3. 【学术篇】SDOI2011 计算器

    好一道三合一...(然而被我做成了四合一) 其实1 2 3是独立的OvO 然后就可以逐个分析了... 1 快速幂..就不说了..(我省选的时候有这么水的20pts部分分么←_← 2 两种做法(写在标题 ...

  4. csps模拟87888990部分题解

    题面:https://www.cnblogs.com/Juve/articles/11752338.html https://www.cnblogs.com/Juve/articles/1175241 ...

  5. gulp是什么?

    什么是gulp? gulp初涉 1.什么是gulp? gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器:它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的 ...

  6. .net Framework 中的四种计时器

    在Framework中存在着4种定时器:其中分为两类, 多线程计时器 1:System.Threading.Timer 2:System.Timers.Timer 特殊目的的单线程计时器: 1:Sys ...

  7. 小程序修改默认的radio样式

    1.wxml: <radio-group class="radio-group" bindchange="radioChange"> <vie ...

  8. Android Butterknife使用方法总结

    原文链接:http://blog.csdn.net/donkor_/article/details/77879630 前言: ButterKnife是一个专注于Android系统的View注入框架,以 ...

  9. HDU-1492-The number of divisors(约数) about Humble Numbers -求因子总数+唯一分解定理的变形

    A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, ...

  10. 收藏的链接-Git

    git远程删除分支后,本地git branch -a 依然能看到的解决办法. - qq_763034592的博客 - CSDN博客 https://blog.csdn.net/qq_16885135/ ...