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效果
饭前洗洗手 吃饭 饭后散散步