• AOP jdk动态代理


    一:

       jdk动态代理是Spring AOP默认的代理方法。要求 被代理类要实现接口,只有接口里的方法才能被代理,主要步骤是先创建接口,接口里创建要被代理的方法,然后定义一个实现类实现该接口,接着将被代理对象注入到一个中间对象,中间对象实现InvocationHandler接口,实现该接口可以在 被代理对象调用它的方法前后插入一些代码。Proxy.newProxyInstance()能利用中间对象来生产代理对象。

    二:

    (1)创建接口:

    package net.wang.aop;
    
    /**
     * 被代理对象必须实现的接口
     * @author LiuRuoWang
     */
    public interface UserService {
    	
    	public void addUser(User user);
    	
    	public User getUser(int id);
    }
    

    (2)创建实现类:

    package net.wang.aop;
    
    /**
     * 被代理对象,必须实现接口
     * @author LiuRuoWang
     */
    public class UserServiceImpl implements UserService{
    
    	public void addUser(User user) {
    		System.out.println("add User!");
    	}
    
    	public User getUser(int id) {
    		User user=new User();
    		user.setId(id);
    		System.out.println("get User!");
    		return user;
    	}
    	
    }
    

    (3)创建代理中间类

    package net.wang.aop;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    /**
     * 代理中间类
     * @author LiuRuoWang
     */
    public class ProxyUtil implements InvocationHandler{
    	
    	//被代理对象
    	private Object target;
    	
    	public void setTarget(Object target) {
    		this.target = target;
    	}
    	
    	public Object getTarget() {
    		return target;
    	}
    	
    	public ProxyUtil(Object target){
    		this.target=target;
    	}
    	
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		System.out.println("do sth before!");
    		method.invoke(target, args);
    		System.out.println("do sth after!");
    		return null;
    	}
    	
    	
    }
    

    (4)pojo类:

    package net.wang.aop;
    
    /**
     * User pojo类
     * @author LiuRuoWang
     */
    public class User {
    	
    	private Integer id;
    	
    	private String name;
    	
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	
    	public Integer getId() {
    		return id;
    	}
    	
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	public String getName() {
    		return name;
    	}
    }
    

    (5)测试结果

    package net.wang.aop;
    
    import java.lang.reflect.Proxy;
    
    public class ProxyTest {
    	
    	public static void main(String[] args) {
    		
    		Object proxyedObject = new UserServiceImpl();
    		
    		ProxyUtil proxyUtils = new ProxyUtil(proxyedObject);
    		//生成代理对象,并对这些接口进行代理
    		UserService proxyObject = (UserService) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), 
    				UserServiceImpl.class.getInterfaces(),proxyUtils);
    		proxyObject.getUser(1);
    		proxyObject.addUser(new User()); 
    	}
    }
    

    (6)

    image

  • 相关阅读:
    SCOI2014 方伯伯的OJ onlinejudge
    【JZOJ4854】【NOIP2016提高A组集训第6场11.3】小澳的坐标系
    【JZOJ4847】【NOIP2016提高A组集训第5场11.2】夕阳
    【JZOJ4846】【NOIP2016提高A组集训第5场11.2】行走
    【JZOJ4845】【NOIP2016提高A组集训第5场11.2】寻找
    【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集
    【JZOJ4840】【NOIP2016提高A组集训第4场11.1】小W砍大树
    【JZOJ4835】【GDOI2017模拟10.31】量化交易
    【JZOJ4831】【NOIP2016提高A组集训第3场10.31】方程式
    【JZOJ4832】【NOIP2016提高A组集训第3场10.31】高维宇宙
  • 原文地址:https://www.cnblogs.com/liuruowang/p/4544710.html
Copyright © 2020-2023  润新知