小知识,大挑战!本文正在参与「程序员必备小知识」创作活动
1.代理的作用
代理最直接的方式就是静态代理在原有方法上添加操作,耦合和代码量比较多。
在不改变原有代码逻辑的时候增加一些其他功能。
例如在原有的代码功能基础上做一些二开的操作,或者运行时间统计,日志,事务控制等。
下面用个简单的例子实现下动态代理的效果
2.jdk自带的
注意自带需要有个实现的接口
2.1接口定义
public interface PersonEATInterface {
public void eat();
}
2.2实现类
public class PersonEAT implements PersonEATInterface {
public void eat() {
System.out.println("吃饭");
}
}
2.3代理实现
public class PersonEatHandler implements InvocationHandler {
private Object target = null;
PersonEatHandler(Object target){
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("饭前洗洗手");
Object result = method.invoke(target, args);
System.out.println("饭后散散步");
return result;
}
}
2.4测试
public class PersonEATTest {
public static void main(String[] args) {
PersonEAT eat = new PersonEAT();
eat.eat();
PersonEatHandler handler = new PersonEatHandler(eat);
PersonEATInterface bp = (PersonEATInterface)Proxy.newProxyInstance(eat.getClass().getClassLoader(), eat.getClass().getInterfaces(), handler);
bp.eat();
}
}
2.5效果
吃饭
饭前洗洗手
吃饭
饭后散散步
3.通过cglib的实现方式
不需要定义接口
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
3.1代理类实现
public class PersonProxy implements MethodInterceptor {
public Object intercept(Object obj, Method method, Object[] objects, MethodProxy proxy) throws Throwable {
Object result;
System.out.println("饭前洗洗手");
result=proxy.invokeSuper(obj, objects);
System.out.println("饭后散散步");
return result;
}
}
3.2测试
public class PersonProxyTest {
public static void main(String[] args) throws SQLException {
PersonProxy daoProxy = new PersonProxy();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(PersonEAT.class);
enhancer.setCallback(daoProxy);
PersonEAT dt=(PersonEAT)enhancer.create();
dt.eat();
}
}
3.3效果
饭前洗洗手
吃饭
饭后散散步