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. 命令行参数解析函数 getopt

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

  2. py2exe打包整个项目

    这段时间做了用Python做了一个科学计算的项目,项目中用到了很多的第三方Python库,包括PyQt.traits.traitsui.matplotlib.pyface.table.numpy.tv ...

  3. ajax 分页(jquery分页插件pagination) 小例2

    封装成:myPagination.js// ajax分页 function sendAjax(flag, dataParam, url, callback) {//封装的ajax: var shus ...

  4. 通过XOML或者XAML的方式创建和启动工作流

    在Workflow Foundation中,提供了多种设计工作流的方式.例如 纯代码的方式(C#) 代码分离的方式(XOML+C#) 以上两种,可以从Visual Studio提供的项目模板中选择 他 ...

  5. 利用github搭建个人网站

    1.注册一个github  https://github.com/ 2.新建一个仓库  仓库名 用 Owner.github.io 的格式,然后点击创建 3.源码上传至github 安装github桌 ...

  6. EventBus3.0使用笔记.md

    事件总线这个其实没什么好说的,除了已经ondestroy的fragment或者activity不能接受外,只要定义了的都能接收消息 代码如下,需要注意的一点就是接收的监听事件必须用public修饰并且 ...

  7. iPhone 证书导出分享给多个开发人员操作

    1.应用程序->实用工具->keychain Access->操作如图1 2.将上图导出的证书.AppleWWDRCA.cer.mythlinkDeveloper.mobilepro ...

  8. Go -- 接口赋值

    在go语言中,接口赋值分为2中情况: 1.将对象实例赋值给接口: 2.将一个接口赋值给另一个接口. 1.将对象实例赋值给接口: 要求对象实现了接口的所有方法. 2.将接口赋值给另一个接口: 假设接口A ...

  9. mycat安装和测试

    mycat安装和测试 一.  环境准备 本机环境是三台centos6.5 IP 主机名 数据库名 安装软件 192.168.17.4 master db1 mycat,mysql 192.168.17 ...

  10. U-net图像分割

    [Keras]基于SegNet和U-Net的遥感图像语义分割 2014 年,加州大学伯克利分校的 Long 等人提出全卷积网络(FCN),这使得卷积神经网络无需全连接层即可进行密集的像素预测,CNN ...