引入 cglib-nodep-2.1_3.ja包

cglib产生的代理类是目标类的子类

定义接口,让切面都继承它,方便加入到动态代理方法 的那个类中使用

SalaryInterceptor类中使用 private List<Interceptor> interceptors;

1 package cn.itcast.cglibproxy.salary;
2
3 public interface Interceptor {
4 public void interceptor();
5 }
Logger .java
 1 package cn.itcast.cglibproxy.salary;
2
3 public class Logger implements Interceptor{
4
5 @Override
6 public void interceptor() {
7 // TODO Auto-generated method stub
8 System.out.println("logging");
9 }
10
11 }

其他类都继承 Interceptor接口

Privilege.java

 1 package cn.itcast.cglibproxy.salary;
2
3 public class Privilege implements Interceptor{
4
5 @Override
6 public void interceptor() {
7 // TODO Auto-generated method stub
8 System.out.println("privilege");
9 }
10
11 }

Security.java

 1 package cn.itcast.cglibproxy.salary;
2
3 public class Security implements Interceptor{
4
5 @Override
6 public void interceptor() {
7 // TODO Auto-generated method stub
8 System.out.println("security");
9 }
10
11 }

等等

目标对象

1 package cn.itcast.cglibproxy.salary;
2
3 public class SalaryManagerImpl {
4 public void showSalary() {
5 System.out.println("查看工资");
6 }
7 }

核心

 1 package cn.itcast.cglibproxy.salary;
2
3 import java.lang.reflect.Method;
4 import java.util.List;
5
6 import net.sf.cglib.proxy.Enhancer;
7 import net.sf.cglib.proxy.MethodInterceptor;
8 import net.sf.cglib.proxy.MethodProxy;
9
10 public class SalaryInterceptor implements MethodInterceptor{
11
12
13 private Object target;
14
15 private List<Interceptor> interceptors;
16
17 public SalaryInterceptor(Object target,List<Interceptor> interceptors){
18 this.target = target;
19 this.interceptors = interceptors;
20 }
21 //返回动态代理对象
22 public Object createProxy(){
      //增强对象
23 Enhancer enhancer = new Enhancer();
24 enhancer.setCallback(this);
25 enhancer.setSuperclass(this.target.getClass());
26 return enhancer.create();
27 }
28 //酷似jdk中的 invoke方法
29 //arg3中存放方法的代理相关参数
30 @Override
31 public Object intercept(Object arg0, Method arg1, Object[] arg2,
32 MethodProxy arg3) throws Throwable {
33 // TODO Auto-generated method stub
34 for(Interceptor interceptor:interceptors){
35 interceptor.interceptor();
36 }
37 arg1.invoke(this.target, arg2);
38 return null;
39 }
40
41
42 }

测试

 1 package cn.itcast.cglibproxy.salary;
2
3 import java.lang.reflect.Proxy;
4 import java.util.ArrayList;
5 import java.util.List;
6
7 import org.junit.Test;
8
9 public class SalaryTest {
10 @Test
11 public void test(){
12 Object target = new SalaryManagerImpl();
13 Logger logger = new Logger();
14 Security security = new Security();
15 Privilege privilege = new Privilege();
16 List<Interceptor> interceptors = new ArrayList<Interceptor>();
17 interceptors.add(logger);
18 interceptors.add(security);
19 interceptors.add(privilege);
20 //返回的是目标类型的子类
21 SalaryInterceptor interceptor = new SalaryInterceptor(target, interceptors);
22 SalaryManagerImpl proxy = (SalaryManagerImpl)interceptor.createProxy();
23 proxy.showSalary();
24 }
25 }

aop:

1、切面

事务、日志、安全性框架、权限等都是切面  相当于例子中的 Logger Privilege

2、通知

切面中的方法就是通知                         上面类的方法

3、目标类                SalaryManagerImpl类

4、切入点                                            在方法SalaryInterceptor 中的intercept方法中判断条件 ,什么条件调用目标方法

只有符合切入点,才能让通知和目标方法结合在一起

5、织入:

形成代理对象的方法的过程

好处:

事务、日志、安全性框架、权限、目标方法之间完全是松耦合的

aop的概念以及 cglib-nodep-2.1_3.jar第三方jia包动态代理使用的更多相关文章

  1. CGLIB介绍与原理(通过继承的动态代理)

    一.什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包.它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充.通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接 ...

  2. Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...

  3. Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)

    一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法. ...

  4. Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC

    一.为什么需要代理模式 假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: package com.zhangguo.Spring041.aop01; public class Mat ...

  5. 动态代理的两种方式,以及区别(静态代理、JDK与CGLIB动态代理、AOP+IoC)

    Spring学习总结(二)——静态代理.JDK与CGLIB动态代理.AOP+IoC   目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用cg ...

  6. CGLIB 和 JDK生成动态代理类的区别(转)

    文章转自http://luyuanliang.iteye.com/blog/1137292 AOP 使用的设计模式就是代理模式,是对IOC设计的补充.为了扩展性,往往会加上反射,动态生成字节码,生成代 ...

  7. JDK 和 CGLib 实现动态代理和区别

    JDK 和 CGLib 实现动态代理和区别 在日常的开发中,Spring AOP 是一个非常常用的功能.谈到 AOP,自然离不开动态代理. 那么,基于 JDK 和 CGLib 如何实现动态代理,他们之 ...

  8. Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

    Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为 ...

  9. AOP动态代理解析4-代理的创建

    做完了增强器的获取后就可以进行代理的创建了 AnnotationAwareAspectJAutoProxyCreator->postProcessAfterInitialization-> ...

随机推荐

  1. div+css 制作表格

    <div class="table"> <h2 class="table-caption">花名册:</h2> <di ...

  2. [转]微信小程序开发踩坑记录

    本文转自:http://www.cnblogs.com/NKnife/p/6283605.html 1.由于小程序wx.request()方法是异步的,在app.js执行ajax后,各分页加载app. ...

  3. ssh登录实现

    工程目录 配置文件详解 Spring的applicationContext.xml文件 <span ><?xml version="1.0" encoding=& ...

  4. three.js 在vscode的智能提示

    安装nodejs.启动或者重启vscode,打开控制台,输入命令 npm install --save @types/three 回车, 会多了个node_modules文件夹,再试试智能感知,出来. ...

  5. asm demo

    出处:https://blog.csdn.net/zhangjg_blog/article/details/22976929 package com.gxf.asm; import org.objec ...

  6. wamp配置步骤

    对于初做PHP网站的朋友来说,第一步肯定是希望在自己电脑是搭建PHP环境,省去空间和上传的麻烦!但搭建环境也不是件容易的事情,特别是对于新手同学来说!因此在这里跟大家介绍我作为一名新手在使用的方便好用 ...

  7. 基础架构之日志管理平台搭建及java&net使用

    在现代化的软件开发流程中,日志显得非常的重要,不可能再零散的游离在各个项目中,等查看日志的时候再登录服务器去到特定的目录去查看,这显然很繁琐且效率低下,所有整合一套日志管理平台,也显得非常重要,这篇文 ...

  8. 01_NIO基本概念

    [NIO的几个概念] Buffer(缓冲区) Channel(通道,管道) Selector(选择器,多路复用器) [Buffer] Buffer是一个对象,它包括一些要写入或者要读取的数据.在NIO ...

  9. kafka leader平衡策略

    1.1个partition的默认leader是replicas中的第一个replica 2.kafka controller会启动一个定时的check线程,kafka默认是5min周期,mafka是3 ...

  10. DELPHI 小结

    //十六进制(S)-->>十进制(I)  [重写:Jey]function hextoint(s: string): Integer; begin           //$代表16进制  ...