引入 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. 腾讯云AI应用产品总监王磊:AI 在传统产业的最佳实践

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 背景:5月23-24日,以"焕启"为主题的腾讯"云+未来"峰会在广州召开,广东省各级政府机构领导.海 ...

  2. 使用rem单位的问题——Google下字体很大

    rem的看法 rem单位确实好处蛮多的,它是相对于根节点,让我们整个网站单位可以统一.还可以让我们的字体更好的自适应网站的大小.但是,你用过了就知道,它会出现一个问题: 用Chrome浏览器打开你做的 ...

  3. SQLite.dll在xp中部署时的报错处理

    错误信息: System.IO.FileNotFoundException: Could not load file or assembly 'System.Data.SQLite.dll' or o ...

  4. 创建一个自定义的Application类

    由于每个应用程序必须创建一个Application对象,vs为开发人员提供了模板来减轻开发人员的重复工作.当使用vs创建一个WPF应用程序是,vs会自动创建一个app.xaml文件, <Appl ...

  5. git提交空文件夹和删除远程文件

    git提交空文件夹 在文件夹中创建 .gitkeep 文件,文件内容如下 # Ignore everything in this directory * # Except this file !.gi ...

  6. 十一、cent OS下搭建SVN服务器

    安装SVN命令:yum install subversion 查看安装位置:rpm -ql subversion,我们看到它在/usr/bin目录下生成了svn的二进制文件 查看svn版本:/usr/ ...

  7. spring历史和哲学

    spring 历史: 2004年 Spring Framework 1.0 final 正式问世. 1.在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分 ...

  8. 简单的CRUD(二)

    一.重构简单的CRUD 1.JDBC工具类 1.因为在crud中都包含一些相同的代码所以可以提取出来,抽取代码重构为工具类. 2.将工具类设置为static静态类,方便调用,不需要new对象. pub ...

  9. java 断点续传(springMvc),可支持html5 vedio在线播放 posted @ 2017年3月11日 16:15:44

    Controller @RequestMapping(value = "/getVedio") public void getVedio(HttpServletRequest re ...

  10. vue-构建项目相关事项

    安装 :vue-cli npm install -g vue-cli 使用webpack 打包 vue 項目的創建: vue init webpack 項目名子 生產基本的項目結構后 進入到項目目錄 ...