Heim  >  Artikel  >  Java  >  Was ist das Prinzip von Spring Aop?

Was ist das Prinzip von Spring Aop?

coldplay.xixi
coldplay.xixiOriginal
2020-10-30 14:51:073340Durchsuche

Frühlings-AOP-Prinzip: 1. AOP ist aspektorientiert und ein Programmierparadigma, das eine andere Perspektive zur Betrachtung der Programmstruktur zur Verbesserung der objektorientierten Programmierung OOP bietet. 2. AOP bietet Entwicklern eine Möglichkeit, übergreifende Anliegen zu beschreiben. Mechanismen und können übergreifende Anliegen automatisch in objektorientierte Softwaresysteme einbinden.

Was ist das Prinzip von Spring Aop?

Frühlings-Aop-Prinzip:

AOP (aspektorientiert) ist ein Programmierparadigma, das eine andere Perspektive zur Betrachtung der Programmstruktur bietet, um die objektorientierte Programmierung (OOP) zu verbessern.

AOP bietet Entwicklern einen Mechanismus zur Beschreibung übergreifender Anliegen und kann übergreifende Anliegen automatisch in objektorientierte Softwaresysteme einbinden, wodurch eine Modularisierung übergreifender Anliegen erreicht wird.

AOP kann Logik oder Verantwortlichkeiten kapseln, die nichts mit dem Geschäft zu tun haben, aber üblicherweise von Geschäftsmodulen wie Transaktionsverarbeitung, Protokollverwaltung, Berechtigungskontrolle usw. aufgerufen werden, um die Reduzierung von doppeltem Code im System zu erleichtern Kopplung zwischen Modulen und erleichtern die zukünftige Bedienbarkeit und Wartbarkeit. Vorteile der Verwendung von AOP

JoinPoint: Kreuzungspunkte- Schneidprobleme müssen in das Programm eingefügt werden. Die Verbindungspunkte können in der Klasseninitialisierung, dem Methodenaufruf, dem Feldaufruf oder der Ausnahmebehandlung usw. liegen. In Spring werden nur Verbindungspunkte zur Methodenausführung unterstützt.

  • Pointcut: eine Reihe verwandter Verbindungspunkte.

  • Hinweis: Ein an einem Verbindungspunkt ausgeführtes Verhalten bietet eine Möglichkeit, das vorhandene Verhalten in AOP an dem vom Einstiegspunkt ausgewählten Verbindungspunkt zu erweitern. Einschließlich Pre-Enhancement (vor der Beratung), Post-Enhancement (nach der Beratung) und Surround-Enhancement (um die Beratung herum).

  • Aspekt: ​​Die Kombination aus Benachrichtigungen und Einstiegspunkten.

Weben: Beim Weben werden Aspekte auf das Zielobjekt angewendet, um ein AOP-Proxy-Objekt zu erstellen.

  • Proxy: Wenden Sie Aspekte über einen Proxy auf das Zielobjekt an. AOP-Proxys können mithilfe dynamischer JDK-Proxys oder CGLIB-Proxys implementiert werden.

  • Ziel: Das Objekt, das in den Fokus gewoben werden muss. Das heißt, das Objekt, das als Proxy fungiert.

  • Das wichtigste Entwurfsmuster zur Implementierung von AOP ist der dynamische Proxy.
  • In Spring gibt es zwei Arten von dynamischen Proxys: Der eine ist der dynamische JDK-Proxy und der andere der dynamische cglib-Proxy.
  • Dynamische JDK-Proxy-Simulation

  • Die beiden Kernschnittstellen (Klassen) des dynamischen JDK-Proxys sind InvocationHandler und Proxy. Hinweis: Es können nur Proxy-Schnittstellen verwendet werden. Die
  • public class TimeHandler implements InvocationHandler {  
          
        // 目标对象  
        private Object targetObject;  
        
        public TimeHandler(Object targetObject){
              this.targetObject = targetObject;
        }
        @Override  
        //关联的这个实现类的方法被调用时将被执行  
        /*InvocationHandler接口的方法,proxy表示代理,method表示原对象被调用的方法,      
            args表示方法的参数*/  
        public Object invoke(Object proxy, Method method, Object[] args)  
                throws Throwable {  
            Object ret=null;  
            try{  
                System.out.println("方法之前:"+System.currentTimeMillis());    
                //调用目标方法  
                ret=method.invoke(targetObject, args);  
                System.out.println("方法之后:"+System.currentTimeMillis());  
            }catch(Exception e){  
                e.printStackTrace();  
                System.out.println("error");  
                throw e;  
            }  
            return ret;  
        }  
      
    }

    TimeHandler-Klasse implementiert die InvocationHandler-Schnittstelle. Implementieren Sie die Kernmethode invoke, die über drei Parameter verfügt. Der erste Parameter ist die generierte Proxy-Klasseninstanz, der zweite Parameter ist die Methode des Zielobjekts und der dritte Parameter ist das Parameterwert-Array der Methode.

    public class ProxyUtil {
        
        @SuppressWarnings("unchecked")
        public static <T> T proxyOne(ClassLoader loader,Class<?>[] clz,InvocationHandler handler){
            return (T)Proxy.newProxyInstance(loader, clz, handler);
        }
    }
  • Die Klasse ProxyUtil kapselt einfach die Methode Proxy.newProxyInstance(). Diese Methode hat auch 3 Parameter. Der erste Parameter generiert den Klassenlader des Proxy-Objekts, der zweite Parameter ist das Schnittstellenarray des Zielobjekts und der dritte Parameter ist die Klasseninstanz, die die InvocationHandler-Schnittstelle implementiert.
  • public interface UserManager {
        public void addUser(String userId, String userName);
    }
    public class UserManagerImpl implements UserManager {
        @Override
        public void addUser(String userId, String userName) {
            System.out.println("addUser(id:"+userId+",name:"+userName+")");
        }
    }
    public static void main(String[] args) {
             UserManager um=new UserManagerImpl(); 
             LogHandler log =new LogHandler(um); 
         um=ProxyUtil.proxyOne(um.getClass().getClassLoader(), 
                     um.getClass().getInterfaces(), log);
             
           TimeHandler time = new TimeHandler(um);
           um=ProxyUtil.proxyOne(um.getClass().getClassLoader(), 
                     um.getClass().getInterfaces(), time);
             
             um.addUser("1111", "张三");
        }

    Zu Demonstrationszwecken wird hier ein LogHandler hinzugefügt, der mit dem TimeHandler-Code identisch ist.

  • Dynamische CGLIB-Proxy-Simulation

Die beiden Kernschnittstellen (Klassen) des dynamischen CGLIB-Proxys sind MethodInterceptor und Enhancer. Ist es dem dynamischen JDK-Proxy sehr ähnlich und seine Verwendung ist ähnlich? Aber CGLIB kann Klassen und Schnittstellen vertreten. Hinweis: Abschlussklassen können nicht als Proxy verwendet werden. Die Was ist das Prinzip von Spring Aop?

public class TimeInterceptor implements MethodInterceptor {
    private Object target;  
    public TimeInterceptor(Object target) {
        this.target = target;
    }
    @Override
    public Object intercept(Object proxy, Method method, 
            Object[] args, MethodProxy invocation) throws Throwable {
        System.out.println("方法之前:"+System.currentTimeMillis());
        Object ret = invocation.invoke(target, args); 
        System.out.println("方法之后:"+System.currentTimeMillis());
        
        return ret;
    }
}

intercept-Methode hat 4 Parameter. 1. Generierte Proxy-Klasseninstanz. 2. Referenziert durch die Methode des Proxy-Objekts. 3. Array von Methodenparameterwerten. 4. Die Proxy-Referenz der Proxy-Klasse auf die Methode.

public class ProxyUtil {
    @SuppressWarnings("unchecked")
    public static <T> T proxyOne(Class<?> clz,MethodInterceptor interceptor){
        return (T)Enhancer.create(clz, interceptor);
    }
    }

Die Enhancer-Klasse ist ein Bytecode-Enhancer in CGLib.

public class UserManage {
    public void addUser(String userId, String userName) {
        System.out.println("addUser(id:"+userId+",name:"+userName+")");
    }
}
public static void main(String[] args) {
        UserManage um = new UserManage();
        TimeInterceptor time = new TimeInterceptor(um);
        um = ProxyUtil.proxyOne(um.getClass(), time);
        um.addUser("111", "老王");
    }

Verwandte kostenlose Lernempfehlungen:

Java Basic Tutorial

Das obige ist der detaillierte Inhalt vonWas ist das Prinzip von Spring Aop?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn