java 动态代理aop 实现日志记录

来源:互联网 发布:如何解除电脑网络限制 编辑:程序博客网 时间:2024/06/05 19:26

java动态代理实现针对的类要有实现接口

package com.example.aop;public interface BusinessService {public void login(String name, String password);public void find();}

package com.example.aop;public class BusinessServiceImpl implements BusinessService{@Overridepublic void login(String name, String password) {System.out.println("name: "+ name + ", password: "+ password);}@Overridepublic void find() {System.out.println("find..........");}}
package com.example.aop;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Arrays;import java.util.HashMap;import java.util.Map;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class LogInvocationHandler implements InvocationHandler {private static final Logger logger = LoggerFactory.getLogger(LogInvocationHandler.class);private Object target;private Object proxy;private LogInvocationHandler(){}private static Map<Class<?>, LogInvocationHandler> map = new HashMap<>();@SuppressWarnings("unchecked")public static <T> T getProxyInstance(Class<T> clazz) throws InstantiationException, IllegalAccessException {LogInvocationHandler handler = map.get(clazz);if (null == handler) {handler = new LogInvocationHandler();T target = clazz.newInstance();handler.setTarget(target);handler.setProxy(Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), handler));map.put(clazz, handler);}return (T) handler.getProxy();}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = method.invoke(target, args);logger.info("invoke: " + method.getName() + " args: " + (null == args ? null : Arrays.toString(args)) + " result:"+ result);return result;}public void setTarget(Object target) {this.target = target;}public void setProxy(Object proxy) {this.proxy = proxy;}public Object getTarget() {return target;}public Object getProxy() {return proxy;}}

package com.example.aop;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class TestAop {private static final Logger logger = LoggerFactory.getLogger(TestAop.class);public static void main(String[] args) throws InstantiationException, IllegalAccessException {BusinessService bsi = LogInvocationHandler.getProxyInstance(BusinessServiceImpl.class);bsi.login("tom", "123");bsi.find();logger.info("--------------------------------");WorkService ws = LogInvocationHandler.getProxyInstance(WorkServiceImpl.class);ws.sleep();ws.work();logger.info("--------------------------------");}}



0 0
原创粉丝点击