Quantcast
Channel: CodeSection,代码区,Linux操作系统:Ubuntu_Centos_Debian - CodeSec
Viewing all articles
Browse latest Browse all 11063

Spring AOP关于cglib动态代理

$
0
0

一:

Spring AOP的默认代理方式是jdk动态代理,还有另外一种代理方式是cglib代理,简单说前者基于接口,后者基于继承,基本思路是将被代理对象的类作为父类,然后创建子类来进行方法的调用,调用的同时可以插入我们需要加入的方法。

二:

(1)pojo类

package net.wang.cglib;
/**
* User pojo类
* @author LiuRuoWang
*/
public class User {

private Integer id;

private String name;

public void setId(Integer id) {
this.id = id;
}

public Integer getId() {
return id;
}

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}
}

(2)接口UserService

package net.wang.cglib;
public interface UserService {

public void addUser(User user);

public User getUser(int id);
}

(3)实现类UserServiceImpl

package net.wang.cglib;
public class UserServiceImpl implements UserService{
public void addUser(User user) {
System.out.println("add User!");
}
public User getUser(int id) {
User user=new User();
user.setId(id);
System.out.println("get User!");
return user;
}

}

(4)中间类CGProxy,需实现MethodInterceptor接口

package net.wang.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGProxy implements MethodInterceptor{

//代理对象
private Object target;

public CGProxy(Object target) {
this.target=target;
}

public Object getProxyObject(){
Enhancer enhancer = new Enhancer();
//设置被代理对象类为父类
enhancer.setSuperclass(target.getClass());
//回调intercept方法
enhancer.setCallback(this);
//创建代理对象
return enhancer.create();
}
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
System.out.println("do sth before!");
Object result=arg3.invokeSuper(arg0, arg2);
System.out.println("do sth after!");
return result;
}


}

(5)测试

package net.wang.cglib;
public class CGProxyTest {
public static void main(String[] args) {
//被代理对象
Object proxyedObject = new UserServiceImpl();
CGProxy cgProxy = new CGProxy(proxyedObject);
UserService proxyObject = (UserService) cgProxy.getProxyObject();
proxyObject.getUser(1);
proxyObject.addUser(new User());
}
}

以上代码继承接口,并不是代表着基于jdk动态代理方式,只是纯粹的面向接口编程,具体是哪种代理方式,还需看中间类的具体实现。

结果:

Spring AOP关于cglib动态代理

Spring AOP自定义注解方式实现日志管理 http://www.linuxidc.com/Linux/2015-11/125019.htm

Spring AOP进行日志记录 http://www.linuxidc.com/Linux/2015-11/124731.htm

使用Spring AOP进行性能监控 http://www.linuxidc.com/Linux/2012-07/64681.htm

利用Spring AOP 更新Memcached 缓存策略的实现 http://www.linuxidc.com/Linux/2012-03/56503.htm

Spring AOP的两种代理 http://www.linuxidc.com/Linux/2015-11/125017.htm

Spring AOP的注解实例 http://www.linuxidc.com/Linux/2015-11/125018.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-07/133641.htm


Spring AOP关于cglib动态代理

Viewing all articles
Browse latest Browse all 11063

Latest Images

Trending Articles