aop学习总结二------使用cglib动态代理简单实现aop功能

模拟业务需求:

1.拦截所有业务方法

2.判断用户是否有权限,有权限就允许用户执行业务方法,无权限不允许用户执行业务方法

(判断是否有权限是根据user是否为null)

CGLIB的代理:目标对象没有实现接口

业务类:

package ql.service.impl;

public class PersonServiceBean {

    private String user=null;

    public PersonServiceBean(){}

    public PersonServiceBean(String user){
this.user=user;
} public String getUser() {
return user;
} public void setUser(String user) {
this.user = user;
} public void save(String name) { System.out.println("我是save()方法");
} public void update(String name, Integer personId) {
System.out.println("我是update()方法");
} public String getPersonName(Integer personId) {
System.out.println("我是getPersonName()方法");
return "success";
} }

CGLIB动态代理工厂类:

package ql.aop;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import ql.service.impl.PersonServiceBean; public class CGLIBProxyFactory implements MethodInterceptor { // 目标对象
private Object targetObject; // 得到一个代理实例
public Object createProxyIntance(Object targetObject) {
this.targetObject = targetObject;
// 该类用于生产代理对象
Enhancer enhancer = new Enhancer();
// 继承了目标对象,对目标类的所有非final方法进行覆盖,并加上自己的代码
enhancer.setSuperclass(this.targetObject.getClass());
enhancer.setCallback(this);
return enhancer.create();
} public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
PersonServiceBean bean = (PersonServiceBean) this.targetObject; Object result = null;
if (bean.getUser() != null) {
result = methodProxy.invoke(targetObject, args);
}
return result;
}
}

单元测试类:

package ql.test;

import org.junit.Before;
import org.junit.Test; import ql.aop.CGLIBProxyFactory;
import ql.service.impl.PersonServiceBean; public class ProxyTest { @Before
public void setUp() throws Exception {
} @Test
public void testCGLIBProxyFactory1() { CGLIBProxyFactory cglibProxyFactory=new CGLIBProxyFactory();
PersonServiceBean personServiceBean=(PersonServiceBean) cglibProxyFactory.createProxyIntance(new PersonServiceBean());
personServiceBean.save("小明");
}
@Test
public void testCGLIBProxyFactory2() {
CGLIBProxyFactory cglibProxyFactory=new CGLIBProxyFactory();
PersonServiceBean personServiceBean=(PersonServiceBean) cglibProxyFactory.createProxyIntance(new PersonServiceBean("xxxx"));
personServiceBean.save("小明");
} }

aop学习总结二------使用cglib动态代理简单实现aop功能的更多相关文章

  1. aop学习总结一------使用jdk动态代理简单实现aop功能

    aop学习总结一------使用jdk动态代理实现aop功能 动态代理:不需要为目标对象编写静态代理类,通过第三方或jdk框架动态生成代理对象的字节码 Jdk动态代理(proxy):目标对象必须实现接 ...

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

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

  3. Spring事务Transactional和动态代理(二)-cglib动态代理

    系列文章索引: Spring事务Transactional和动态代理(一)-JDK代理实现 Spring事务Transactional和动态代理(二)-cglib动态代理 Spring事务Transa ...

  4. 浅谈Java代理二:Cglib动态代理-MethodInterceptor

    浅谈Java代理二:Cglib动态代理-MethodInterceptor CGLib动态代理特点: 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生 ...

  5. 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】

    一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...

  6. Spring AOP中的JDK和CGLIB动态代理

    Spring在将Advice织入目标对象的Joinpoint是在运行时动态进行的.它采用的方式可能有两种,即JDK动态代理与CGLIB代理.Spring会根据具体的情况在两者之间切换. 实际情况如下: ...

  7. JDK动态代理和CGLib动态代理简单演示

    JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...

  8. Java动态代理(二)CGLIB动态代理应用

    JDK自从1.3版本开始,就引入了动态代理,JDK的动态代理用起来非常简单,但是它有一个限制,就是使用动态代理的对象必须实现一个或多个接口 .如果想代理没有实现接口的类可以使用CGLIB包. CGLI ...

  9. cglib动态代理(即AOP)

    Computer.java package com.wh.spring_aop; public class Computer { public void playLOL(){ System.out.p ...

随机推荐

  1. luogu 2735 电网 皮克公式

    题目链接 题意 给定一个格点三角形,三个顶点分别为(0,0),(n,m),(p,0),求三角形内部的格点个数. 思路 皮克公式: \[S = \frac{i}{2}+b-1\] \(S\)为三角形面积 ...

  2. 命令行参数解析函数 getopt

    命令行参数解析函数 —— getopt() getopt()函数声明如下: #include <unistd.h> int getopt(int argc, char * const ar ...

  3. Python入门--18--异常与try,except语句

    Python标准异常总结 AssertionError 断言语句(assert)失败 AttributeError 尝试访问未知的对象属性 EOFError 用户输入文件末尾标志EOF(Ctrl+d) ...

  4. js中加“var”和不加“var”的区别,看完觉得这么多年js白学了

    Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的.可以正常运行的代码并不代表是合适的代码. var num = 1: 是在 ...

  5. js-html音乐播放

    <img src="images/music.png" id="music" class="rotate"> <audio ...

  6. ES6之Array.includes()函数

    一.定义 includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false. 二.语法 arr.includes(searchElement) arr.includ ...

  7. bzoj 3328 : PYXFIB

    Discription Input 第一行一个正整数,表示数据组数据 ,接下来T行每行三个正整数N,K,P Output T行,每行输出一个整数,表示结果 Sample Input 1 1 2 3 S ...

  8. Java随机数技巧-新手篇

    package 向家康; import java.util.concurrent.ThreadLocalRandom; public class 练习21 { public static void m ...

  9. php程序调试: xdebug的配置

    怎样在phpeclipse中像调试Java程序一样调试php呢? XDebug的版本号非常多,打开http://xdebug.org/index.php.把站点细致看一下,你会发现有句"If ...

  10. Cocos2d-x学习笔记(18)(TestCpp源代码分析-2)

    本章主要讲controller.h/cpp文件的分析,该文件主要用于演示样例场景管理类TestController,用于显示全部演示样例的菜单. //controller.cpp #include & ...