美文网首页
spring 结合proxy代理模式

spring 结合proxy代理模式

作者: 程序男保姆 | 来源:发表于2021-07-02 13:47 被阅读0次
    • Ido
    
    public interface Ido {
    
        public String login (String l);
        public String mes (String l);
    
    }
    
    
    • JDDoImpl
    
    import org.springframework.stereotype.Service;
    
    @Service(value = "jdDoImpl")
    public class JDDoImpl implements Ido {
        @Override
        public String login(String l) {
            return "JD login = " + l;
        }
    
        @Override
        public String mes(String l) {
            return "JD mes = " + l;
        }
    }
    
    
    • ZssDoImpl
    @Service(value = "zssDoImpl")
    public class ZssDoImpl implements Ido {
        @Override
        public String login(String l) {
            return "Zss login = " + l;
        }
    
        @Override
        public String mes(String l) {
            return "Zss mes = " + l;
        }
    }
    
    
    • IdoInvocationHandleProxy 核心代理
    
    @Component
    public class IdoInvocationHandleProxy<T> implements InvocationHandler {
    
        public <T> T newInstance(Class<T> clz) {
            return (T) Proxy.newProxyInstance(clz.getClassLoader(), new Class[] { clz }, this);
        }
    
        /**
         * proxy:代表动态代理对象
         * method:代表正在执行的方法
         * args:代表调用目标方法时传入的实参
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
            if (Object.class.equals(method.getDeclaringClass())) {
                try {
                    // 诸如hashCode()、toString()、equals()等方法,将target指向当前对象this
                    Object invoke = method.invoke(this, args);
                    return invoke;
                } catch (Throwable t) {
                }
            }
            System.out.println("执行之前");
    
            T t = (T) SpringContextUtils.getBean(args[0].toString());
    
            Object invoke = method.invoke(t, args);
            System.out.println("执行之后");
            return invoke;
        }
    }
    
    • Config
    
    @Configuration
    public class Config {
        @Bean
        public Ido ido() {
            IdoInvocationHandleProxy<Ido> idoIdoInvocationHandle = new IdoInvocationHandleProxy<>();
            Ido ido = idoIdoInvocationHandle.newInstance(Ido.class);
            return ido;
        }
    }
    
    • 测试 TestController
    
    @RestController
    @RequestMapping("/t")
    public class TestController {
    
        @Resource
        Ido ido;
    
        @RequestMapping("/login")
        public String login (String s){
            String login = ido.login(s);
            return login;
        }
    
    
    }
    
    

    相关文章

      网友评论

          本文标题:spring 结合proxy代理模式

          本文链接:https://www.haomeiwen.com/subject/jfojultx.html