zoukankan      html  css  js  c++  java
  • javaaop

    AOP(面向切面编程),官方定义就不讲了,可自行百度。按照我自己的理解就是,将代码片段动态的注入某一个已知的代码片段某一处。这样做的好处就是,在不改变原有代码情况下,又能扩充原有业务的功能。

    AOP有两种实现方式:

    1.动态代理

    例子:

    假设我们向给一个类的方法入口和出口各打印一行日志,但我们又不能改变原有代码

    接口:

    package com;
    
    public interface AlgorithmItf
    {
        void add();
    
        void del();
    
        void update();
    
        void find();
    }

    实现:

    package com;
    
    public class Algorithm implements AlgorithmItf
    {
        public void add()
        {
            System.out.println("add...");
        }
        public void del()
        {
            System.out.println("del...");
        }
        public void update()
        {
            System.out.println("update...");
        }
        public void find()
        {
            System.out.println("find...");
        }
    }

    实现面向切面注入

    package com;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class AopDyProxy<T> implements InvocationHandler
    {
        private T o;
    
        public T createInstance(T t)
        {
            o=t;
            return (T)(Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), this));
        }
         
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
        {
            Object re=null;
            System.out.println(method.getName()+" enter");
            re=method.invoke(o, args);
            System.out.println(method.getName()+" exit");
            return re;
        }
        public static void main(String[] args)
        {
            AopDyProxy<AlgorithmItf> p=new AopDyProxy<AlgorithmItf>();
            AlgorithmItf a=p.createInstance(new Algorithm());
            a.add();
            a.update();
        }
    
    }

    测试结果输出

    add enter
    add...
    add exit
    update enter
    update...
    update exit

    2.静态代理,直接上例子了(摘自网络)

    /** 
     * 静态代理可通过接口或者类进行代理 
     * 
     */  
    public class StaticProxyTest {  
        public static void main(String[] args) {  
            //基于接口  
            MyPhone myPhone = new MyPhoneImpl();  
            StaticProxy proxy = new StaticProxy(myPhone);  
            proxy.name("华为");  
            //基于类  
            MyPhoneClass myPhoneClass = new MyPhoneClass();  
            ProxyEntity entity = new ProxyEntity(myPhoneClass);  
            entity.name("小米");  
        }  
    }  
      
    /** 
     * 接口 
     * 
     */  
    interface MyPhone{  
        public void name(String str);  
    }  
    /** 
     * 接口实现类 
     * @author Administrator 
     * 
     */  
    class MyPhoneImpl implements MyPhone{  
      
        @Override  
        public void name(String str) {  
            System.out.println("早上好"+str);   
        }  
          
    }  
      
    /** 
     * 自定义静态代理类 
     * @author Administrator 
     * 
     */  
    class StaticProxy implements MyPhone{  
        MyPhone myPhone;  
          
        public StaticProxy(MyPhone myPhone) {  
            this.myPhone = myPhone;  
        }  
      
        @Override  
        public void name(String str) {  
            beforeFun();  
            myPhone.name(str);  
            afterFun();  
              
        }  
          
        public void beforeFun(){  
            System.out.println("前置代理");  
        }  
        public void afterFun(){  
            System.out.println("后置代理");  
        }  
    }  
    /** 
     * 实体类 
     * @author Administrator 
     * 
     */  
    class MyPhoneClass{  
        public void name(String str){  
            System.out.println("基于类实现:"+str);  
        }  
    }  
      
    /** 
     * 基于类的代理 
     * @author Administrator 
     * 
     */  
    class ProxyEntity extends MyPhoneClass{  
        MyPhoneClass myPhone;  
          
          
        public ProxyEntity(MyPhoneClass myPhone) {  
            this.myPhone = myPhone;  
        }  
        @Override  
        public void name(String str) {  
            beforeFun();  
            myPhone.name(str);  
            afterFun();  
        }  
        public void beforeFun(){  
            System.out.println("前置代理");  
        }  
        public void afterFun(){  
            System.out.println("后置代理");  
        }  
    }  
  • 相关阅读:
    android-studio add jar
    android-studio 下载
    fastjson对Date类型的格式化
    springboot多环境区分
    Docker开启远程访问
    docker中批量删除 tag为none的镜像
    项目无法依赖Springboot打出的jar
    Spring Boot使用Swagger2
    mysql表时间戳字段设置
    springMVC dubbo注解无效,service层返回空指针
  • 原文地址:https://www.cnblogs.com/zincredible/p/8544947.html
Copyright © 2011-2022 走看看