Home >Java >javaTutorial >How to implement a simple interceptor operation in Java through dynamic proxy
Before using dynamic proxies to implement interceptors, let us first briefly understand what Java proxies are.
Agent, as the name suggests, does not directly operate the object being proxied (hereinafter referred to as the target object, which sounds more comfortable), but indirectly uses the methods in the target object through a proxy object. Agents are divided into two modes, one is static agent and the other is dynamic agent. Next, write an example of a static proxy.
Whether it is a static proxy or a dynamic proxy, the target object (target) must implement an interface (interface). Note that if you use the proxy provided by cglib, you do not have to implement the interface, but implement it through a subclass. This method will not be discussed for now.
public interface IUserDao { void save(); }
public class UserDaoImpl implements IUserDao { public void save() { System.out.println("--------已经保存数据---------"); } }
public class UserDaoProxy implements IUserDao { private IUserDao target;//将目标对象放到代理对象中 public UserDaoProxy(IUserDao target){ this.target = target; } public void save() { System.out.println("------开始事务------"); target.save(); System.out.println("-------提交事务------"); } }
Test Next:
public class Test { public static void main(String[] args){ IUserDao userDao = new UserDaoImpl(); UserDaoProxy proxy = new UserDaoProxy(userDao); proxy.save();//通过代理对象调用save方法 } }
The output result is:
------Start transaction------
--------Data has been saved ----------------Commit transaction------
There is a problem with this method, that is, the proxy object must It is also necessary to implement the same interface implemented by the proxy object, which leads to serious coupling. Therefore, an improved method is used below, namely dynamic proxy (jdk proxy).
The dynamic proxy method also requires the target object (target) to implement an interface
(1) Define an interface (IUserDao)
(2) Define a target object class (UserDaoImpl )
(3) Create a dynamic proxy class
public class ProxyFactory { //维护一个目标对象 private Object target; public ProxyFactory(Object target) { this.target = target; } //给目标对象生成代理对象 public Object getProxyInstance() { System.out.println("----target class---" + target.getClass()); System.out.println("----target interfaces---" + target.getClass().getInterfaces()); return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("----开始事务2-----"); //执行目标对象方法 Object returnValue = method.invoke(target, args); System.out.println("----提交事务2----"); return returnValue; } }); } }
Test it:
public class Test { public static void main(String[] args) { //目标对象 IUserDao target = new UserDao(); System.out.println(target.getClass()); //给目标对象创建代理对象 IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance(); System.out.println("----proxy----:" + proxy.getClass()); proxy.save(); proxy.delete(); } }
Output result:
class com.jd.pattern. proxy.dynamicProxy.UserDao
----target class---class com.jd.pattern.proxy.dynamicProxy.UserDao
----target interfaces---[Ljava.lang.Class;@1fb3ebeb
----proxy----: class com.sun.proxy.$Proxy0
----Start transaction 2-----
-----Save completed--- ---
----Submit transaction 2----
----Start transaction 2-----
----Delete completed--------Submit transaction 2----
Since the dynamic proxy method is used, there will definitely be Interface, target class, proxy class, plus an interceptor
public interface BusinessFacade { void doSomething(); }
public class BusinessClass implements BusinessFacade { public void doSomething() { System.out.println("在业务组件BusinessClass中调用doSomething方法"); } }
public class InterceptorClass { public void before() { System.out.println("在InterceptorClass中调用方法:before()"); } public void after() { System.out.println("在InterceptorClass中调用方法:after()"); } }
public class DynamicProxyHandler { //声明被代理对象 private Object target; //创建拦截器 InterceptorClass interceptor = new InterceptorClass(); //动态生成一个代理对象,并绑定被代理类和代理处理器 public Object getProxyInstance(final Object target) { this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { interceptor.before(); Object result = method.invoke(target, args); interceptor.after(); return result; } }); } }
Test it:
public class Test { public static void main(String[] args) { //创建动态代理工具 DynamicProxyHandler proxyHandler = new DynamicProxyHandler(); //创建业务组件 BusinessFacade target = new BusinessClass(); //获取代理对象 BusinessFacade proxy = (BusinessFacade) proxyHandler.getProxyInstance(target); //通过代理对象调用目标对象方法 proxy.doSomething(); } }
Output result:
Call the method in InterceptorClass: before()
Call the doSomething method in the business component BusinessClass
Call the method in InterceptorClass: after()
The above is the detailed content of How to implement a simple interceptor operation in Java through dynamic proxy. For more information, please follow other related articles on the PHP Chinese website!