


How to implement a simple interceptor operation in Java through dynamic proxy
1. 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.
(1) First define an interface
public interface IUserDao { void save(); }
(2) Define the target object (target)
public class UserDaoImpl implements IUserDao { public void save() { System.out.println("--------已经保存数据---------"); } }
(3) Define the proxy object
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----
2. Use dynamic proxy to implement a simple interceptor
Since the dynamic proxy method is used, there will definitely be Interface, target class, proxy class, plus an interceptor
1. Define an interface
public interface BusinessFacade { void doSomething(); }
2. Define a target object
public class BusinessClass implements BusinessFacade { public void doSomething() { System.out.println("在业务组件BusinessClass中调用doSomething方法"); } }
3. Create an interceptor
public class InterceptorClass { public void before() { System.out.println("在InterceptorClass中调用方法:before()"); } public void after() { System.out.println("在InterceptorClass中调用方法:after()"); } }
4. Create a proxy
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!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Guide to Square Root in Java. Here we discuss how Square Root works in Java with example and its code implementation respectively.

Guide to Perfect Number in Java. Here we discuss the Definition, How to check Perfect number in Java?, examples with code implementation.

Guide to Random Number Generator in Java. Here we discuss Functions in Java with examples and two different Generators with ther examples.

Guide to Weka in Java. Here we discuss the Introduction, how to use weka java, the type of platform, and advantages with examples.

Guide to the Armstrong Number in Java. Here we discuss an introduction to Armstrong's number in java along with some of the code.

Guide to Smith Number in Java. Here we discuss the Definition, How to check smith number in Java? example with code implementation.

In this article, we have kept the most asked Java Spring Interview Questions with their detailed answers. So that you can crack the interview.

Java 8 introduces the Stream API, providing a powerful and expressive way to process data collections. However, a common question when using Stream is: How to break or return from a forEach operation? Traditional loops allow for early interruption or return, but Stream's forEach method does not directly support this method. This article will explain the reasons and explore alternative methods for implementing premature termination in Stream processing systems. Further reading: Java Stream API improvements Understand Stream forEach The forEach method is a terminal operation that performs one operation on each element in the Stream. Its design intention is
