您的位置:首页 > 编程语言 > Java开发

静态代理,jdk动态代理和cjlib动态代理

2017-08-01 19:46 141 查看

1.静态代理

//抽象主题
public interface ISubject {
//定义一个方法,request
public void request();
}

//准备一个真实主题和一个代理主题
public class RealSubject implements ISubject{
public void request() {
System.out.println("我是主业务");
}
}

public class ProxySubject implements ISubject{
//构造一个真是主题并进行封装
private RealSubject real;
//定义一个方法
public void request() {
//code
System.out.println("before");

real.request();

//code
System.out.println("after");
}
public RealSubject getReal() {
return real;
}
public void setReal(RealSubject real) {
this.real = real;
}
}
@Test
/**
* 静态代理测试
*/
public void staticproxyTest(){

ProxySubject proxy=new ProxySubject();
//准备一个真实主题,他在后期代码中会作为代理对象的属性
RealSubject real=new RealSubject();

proxy.setReal(real);

proxy.request();

}

2.jdk动态代理

//定义一个接口
public interface IUserDAO {
public String add();
public String edit();
}

public class UserDAOImpl implements IUserDAO{
public String add() {
//开启事务
System.out.println("add ok!");
return "add";
//logger
}

public String edit() {
//开启事务
System.out.println("edit ok!");
return "edit";
//开启事务
}
}

@Test
/**
* jdk动态代理测试
*/
public void staticproxyTest() {
//01.先创建出接口实现类
final IUserDAO dao=new UserDAOImpl();//该代理类具有 final 和 public 修饰符,意味着它可以被所有的类访问,但是不能被再度继承
//02.类Proxy
IUserDAO proxy=(IUserDAO) Proxy
.newProxyInstance(dao.getClass() //获取实现类的类加载器
//dao.getClass()或者写成UserDaoImpl.class().getClassLoader()
.getClassLoader(), dao.getClass(). //
getInterfaces(), // 获取实现类接口
new InvocationHandler() { //Invocation(调用 ) Handler (处理)
@Override
/**proxy 代理对象 不能用 如果用了就会无限循环
* method 被代理对象 方法 add()
* args add方法的参数 (代理对象的方法参数)
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {

//code 1
System.out.println("start Tran");
//真正业务
//执行dao对象的add方法,传入的是args参数,返回值是result
Object result = method.invoke(dao, args);
//code 2
System.out.println("write logger");

return result;
}
});

String add = proxy.add();
System.out.println("======="+add+"=======");//"add"
proxy.edit();
}

3.cjlib动态代理

//重点在于理解他的单测内容
public class UserService {
public void delete(){
System.out.println("delete ok!");
}
}

@Test
/**
* cglib动态代理测试
*/
public void cglibProxyTest(){

final UserService service=new UserService();

//cglib动态代理
//01.需要类 Enhancer
Enhancer enhancer=new Enhancer();//导入spring-core4.2.3.RELEASE
enhancer.setSuperclass(service.getClass());
enhancer.setCallback(new org.springframework.cglib.proxy.MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects,
MethodProxy methodProxy) throws Throwable {
System.out.println("before");

method.invoke(service, objects);

System.out.println("after");
return null;
}
});

//02.用方法
UserService proxy= (UserService)enhancer.create();
//03.
proxy.delete();
}
/* CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,
但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,
因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要
9857
更为合适一些。
同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。*/



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: