Spring-Aop两种代理方式:

1、JDK动态代理:用于目标类实现了接口;

2、Cglib动态代理:用于目标类没有实现接口;

spring会依据目标类是否实现接口来选择使用哪种代理方式(目标类:相当于需要被增强的类);

模拟场景:目标类:步兵类,需要上战场打仗(手提精心打造的木棍)

通知类(增强类):高级商店类,只要有士兵来就免费提供(精心打造的暴风大剑)

代理工厂类:需要一个士兵来使用商店的东西(这样才能把士兵与商店联系起来,士兵与商店本来是单独存在的相互不知道)

JDK动态代理实现:

创建maven项目引入spring-aop依赖,使用的是5.1版本

1、目标类需要实现接口,所以先创建一个接口:SoldierInterface(士兵类的接口)

package top.free;

/**
* 士兵接口
*/
public interface SoldierInterface {
public void begin();
}

2、创建目标类(步兵类去实现接口),也可以有其他的类(弓箭兵。。。)只要实现了士兵类,都是士兵。

package top.free;

/*
*步兵类
*/
public class Soldier implements SoldierInterface { @Override
public void begin() {
System.out.println("弓箭士兵开始战斗");
}
}

3、通知(也叫增强):商店类

package top.free.advice;

public class Store {
public void Before(){
System.out.println("为士兵换上暴风大剑。。。");
}
public void After(){
System.out.println("士兵胜利归来。。。");
}
}

4、创建代理工厂:需要传递过来一个士兵(不管是步兵还是弓箭兵),返回一个被商店加强的士兵

package top.free.proxy;

import top.free.SoldierInterface;
import top.free.advice.Store;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyProxyFactory {
  //传递的soldier就是需要被增强的士兵类,
public SoldierInterface MyProxyFactory(SoldierInterface soldier){
//通知,此时的商店类,在工厂中new出的实列
Store store = new Store();
SoldierInterface proxysoldier = (SoldierInterface) Proxy.newProxyInstance(
MyProxyFactory.class.getClassLoader(),//第一个参数:使用当前类的类加载器
soldier.getClass().getInterfaces(),//第二个参数:传递的soldier士兵对象的接口
new InvocationHandler() {//第三个参数,匿名内部类形式
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//前置调用商店的配置
store.Before();
//调用目标方法,soldier就是传递的士兵对象,args参数默认无参
Object invoke = method.invoke(soldier, args);
//后置,士兵执行完方法后调用
store.After();
return invoke;
}
}
);
return proxysoldier;
}
}

5、测试运行:

package top.free;

import top.free.proxy.MyProxyFactory;

public class App
{
public static void main(String[] args) {
//创建工厂
MyProxyFactory myProxyFactory = new MyProxyFactory();
//创建目标类(士兵对象),具体的实现是步兵类
SoldierInterface soldier = new Soldier();
//将创建的士兵传递给工厂,工厂中有商店帮忙打造士兵,用新士兵接收
SoldierInterface newSoldier = myProxyFactory.MyProxyFactory(soldier);
//开始
newSoldier.begin();
}
}

Cglib动态代理实现:

写Jdk代理时已引入spring相关依赖,此时maven项目中已有spring-core包,Spring5.1版本中,spring-core包中有关于Cglib的类,不需要引入cglib依赖

1、Cglib代理使用的是没有接口的目标类,所以直接创建弓箭兵:

package top.free;

/**
* Cglib目标类,没有接口,弓箭兵类
*/
public class BowsSoldier {
public void begin(){
System.out.println("开始射杀敌人。。。");
}
}

2、通知(商店类):

package top.free.advice;

public class Store {

    public void Before(){
System.out.println("为士兵换上霸王弓。。。");
}
public void After(){
System.out.println("士兵胜利归来。。。");
}
}

3、创建代理工厂:需要一个弓箭兵,返回一个装备好的弓箭兵

package top.free.proxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import top.free.BowsSoldier;
import top.free.advice.Store;
import java.lang.reflect.Method; public class MyCglibProxyFactory {
public BowsSoldier MyCglibProxyFactory(BowsSoldier solider){
//创建通知类
Store store = new Store();
//创建Enhance对象
Enhancer enhancer = new Enhancer();
//设置弓箭兵类对象
enhancer.setSuperclass(solider.getClass());
//设置回调方法
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//放在方法执行前,就是前置增强,装备弓箭
store.Before();
//执行方法,solider就是传递过来的弓箭兵对象
Object invoke = method.invoke(solider);
//后置增强
store.After();
return invoke;
}
});
//创建装备好的士兵
BowsSoldier target1= (BowsSoldier) enhancer.create();
return target1;
}
}

4、测试:

package top.free;

import top.free.proxy.MyCglibProxyFactory;
import top.free.proxy.MyProxyFactory; public class App
{
public static void main(String[] args) {//创建代理工厂
MyCglibProxyFactory myCglibProxyFactory = new MyCglibProxyFactory();
//创建一个普通的弓箭兵
BowsSoldier soldier = new BowsSoldier();
//传递弓箭兵到工厂,工厂装备好后返回,接收一个装备精良的弓箭兵
BowsSoldier target = myCglibProxyFactory.MyCglibProxyFactory(soldier);
//装备精良的弓箭兵开始战斗
target.begin();
}
}

Spring-Aop的两种代理方式的更多相关文章

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

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

  2. spring AOP的两种代理

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

  3. Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)

    第一种代理即Java的动态代理方式上一篇已经分析,在这里不再介绍,现在我们先来了解下GCLIB代理是什么?它又是怎样实现的?和Java动态代理有什么区别? cglib(Code Generation ...

  4. (一)spring aop的两种配置方式。

    sring aop的方式有两种:(1)xml文件配置方式(2)注解的方式实现,我们可以先通过一个demo认识spring aop的实现,然后再对其进行详细的解释. 一.基于注解的springAop配置 ...

  5. spring AOP的两种配置方式

    连接点(JoinPoint) ,就是spring允许你是通知(Advice)的地方,那可就真多了,基本每个方法的前.后(两者都有也行),或抛出异常是时都可以是连接点,spring只支持方法连接点.其他 ...

  6. Spring中AOP的两种代理方式(Java动态代理和CGLIB代理-转载

    内容是摘抄的,不知最初的原作者,见谅 Java 动态代理.具体有如下四步骤: 通过实现 InvocationHandler 接口创建自己的调用处理器: 通过为 Proxy 类指定 ClassLoade ...

  7. spring ----> aop的两种实现方式

    实现1:基于xml package com.rr.spring3.interf; //接口 public interface SayHello { public void sayHello(); } ...

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

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

  9. Spring AOP源码分析--代理方式的选择

    能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 年前写了一个面试突击系列的文章,目前只有redis相关的.在这个系列里,我整理了一些面试题与大家 ...

随机推荐

  1. ZOJ3953 ZJU2017校赛(贪心)

    题意:给出n个区间,求至少删掉多少个区间使得不存在区间a, b, c 两两相交    (定义两个区间相交是,区间[l1, r1]和区间[l2, r2]相交,当且仅当存在一个数x,l1<=x< ...

  2. wget: unable to resolve host address “mirrors.163.com” 的解决办法

    wget:无法解析主机地址.这就能看出是DNS解析的问题. 解决办法: 登入root(VPS). 进入/etc/resolv.conf. 修改内容为下nameserver 8.8.8.8 #googl ...

  3. JDBC的异常

    以下内容引用自http://wiki.jikexueyuan.com/project/jdbc/exceptions.html: 异常处理可以允许处理一个异常情况,例如可控方式的程序定义错误. 当异常 ...

  4. 关于Java函数不支持参数默认值的讨论,最后一条亮了 2333

  5. 【Linux多线程】三个经典同步问题

    在了解了<同步与互斥的区别>之后,我们来看看几个经典的线程同步的例子.相信通过具体场景可以让我们学会分析和解决这类线程同步的问题,以便以后应用在实际的项目中. 一.生产者-消费者问题 问题 ...

  6. Eclipse或SVN—怎样在Eclipse中安装SVNclient插件

    1.下载SVN插件,下载地址:http://download.csdn.net/download/wangshuxuncom/7638615 2.解压下载下来的压缩文件然后依据里面名为"使用 ...

  7. UVA - 11374 Airport Express (Dijkstra模板+枚举)

    Description Problem D: Airport Express In a small city called Iokh, a train service, Airport-Express ...

  8. websphere修改jsp不生效的解决办法

    最近在给客户部署系统后,进行UAT测试的时候,发现一些小问题(是一些jsp文件),改好后,就进行增量发布了,可是后来在页面刷新的时候,怎么都是显示不出来效果,后来就把服务websphere重启后,页面 ...

  9. 【bzoj1029】[JSOI2007]建筑抢修

    按照t2从小到大排列之后贪心. 若当前任务可以插入,则插入. 若当前任务不可以插入,分两种情况: ①当前任务的耗时大于等于之前插入的任务的最大耗时:跳过当前任务 ②当前任务的耗时小于之前插入的任务的耗 ...

  10. 第五课 Struts的控制器【续】Action类的execute()方法

    1.Action类的execute()方法: public ActionForward execute(ActionMapping mapping,                           ...