aop的概念以及 cglib-nodep-2.1_3.jar第三方jia包动态代理使用
引入 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包动态代理使用的更多相关文章
- CGLIB介绍与原理(通过继承的动态代理)
一.什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包.它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充.通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接 ...
- Spring AOP中的JDK和CGLib动态代理哪个效率更高?
一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法. ...
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
一.为什么需要代理模式 假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: package com.zhangguo.Spring041.aop01; public class Mat ...
- 动态代理的两种方式,以及区别(静态代理、JDK与CGLIB动态代理、AOP+IoC)
Spring学习总结(二)——静态代理.JDK与CGLIB动态代理.AOP+IoC 目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用cg ...
- CGLIB 和 JDK生成动态代理类的区别(转)
文章转自http://luyuanliang.iteye.com/blog/1137292 AOP 使用的设计模式就是代理模式,是对IOC设计的补充.为了扩展性,往往会加上反射,动态生成字节码,生成代 ...
- JDK 和 CGLib 实现动态代理和区别
JDK 和 CGLib 实现动态代理和区别 在日常的开发中,Spring AOP 是一个非常常用的功能.谈到 AOP,自然离不开动态代理. 那么,基于 JDK 和 CGLib 如何实现动态代理,他们之 ...
- Atitit 代理CGLIB 动态代理 AspectJ静态代理区别
Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为 ...
- AOP动态代理解析4-代理的创建
做完了增强器的获取后就可以进行代理的创建了 AnnotationAwareAspectJAutoProxyCreator->postProcessAfterInitialization-> ...
随机推荐
- sharding-jdbc集成spring+mybatis分表分库
maven: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...
- zato——Channels Outgoing connections
Channels,服务获得请求.方式 AMQP JMS WebSphere MQ plain HTTP SOAP ZeroMQ 其中,只有HTTP是同步的 Plain HTTP和SOAP暴漏服务直接通 ...
- 【分布式消息队列-MQ】
http://www.cnblogs.com/itfly8/p/5155983.html
- [转]Using MVC 6 And AngularJS 2 With .NET Core
本文转自:http://www.c-sharpcorner.com/article/using-mvc-6-and-angularjs-2-with-net-core/ CoreMVCAngular2 ...
- 创建一个自定义的Application类
由于每个应用程序必须创建一个Application对象,vs为开发人员提供了模板来减轻开发人员的重复工作.当使用vs创建一个WPF应用程序是,vs会自动创建一个app.xaml文件, <Appl ...
- 三、thymeleaf的使用
1.简介 thymleaf是一个基于html的页面模板,springboot极力推荐使用它,代替jsp. API地址:https://www.thymeleaf.org/doc/tutorials/3 ...
- HDU 1561 The more, The Better 经典树形DP
The more, The Better Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- python文件操作各种模式和常用方法总结r r+ rb r+b
1.读,r r+ rb r+b read() 全部读取 read(n) 读取一部分 r模式下:n 个字符. rb模式下:n个 字节. readline() 按行读取. readlines() 返回个列 ...
- python caser运行编码
#!/usr/bin/env python# -*- coding:utf-8 -*-import os def encryption(): str_raw = raw_input("请输入 ...
- webapp 的简单开发
web app 的技术平台很多,如adobe phonegap.sencha touch.appcan(国产).dcloud(国产)平台.我选择了dcloud平台,原因:简单,容易上手. web ap ...