Heim  >  Artikel  >  Java  >  Beispiele zur Erläuterung der AOP-Implementierung im Spring-Framework von Java

Beispiele zur Erläuterung der AOP-Implementierung im Spring-Framework von Java

高洛峰
高洛峰Original
2017-01-23 10:41:461285Durchsuche

Einführung
Aspektorientierte Programmierung (AOP) bietet einen weiteren Blickwinkel auf die Programmstruktur und gleicht auf diese Weise die Mängel der objektorientierten Programmierung (OOP) aus. Zusätzlich zu den Kursen bietet AOP Aspekte an. Aspekte modularisieren Belange, beispielsweise die Transaktionsverwaltung über mehrere Typen und Objekte hinweg. (Diese Anliegen werden oft als übergreifende Anliegen bezeichnet.)

Eine Schlüsselkomponente von Spring ist das AOP-Framework. Dennoch ist der Spring IoC-Container nicht auf AOP angewiesen, was bedeutet, dass Sie frei entscheiden können, ob Sie AOP verwenden möchten oder nicht. AOP bietet leistungsstarke Middleware-Lösungen, die den Spring IoC-Container vollständiger machen.

Spring 2.0 AOP:

Spring 2.0 bietet eine einfachere und leistungsfähigere Möglichkeit, Aspekte anzupassen. Benutzer können wählen, ob sie einen schemabasierten Ansatz oder die @AspectJ-Annotation verwenden möchten. Für neue Anwendungen empfehlen wir Benutzern, den @AspectJ-Stil zu verwenden, wenn sie mit Java 5 entwickelt wurden, andernfalls können sie den musterbasierten Stil verwenden. Beide Stile unterstützen vollständig Advice-Typen und die Pointcut-Sprache von AspectJ, verwenden jedoch weiterhin Spring AOP zum Weben.

In diesem Kapitel geht es hauptsächlich um die Unterstützung von Spring 2.0 für musterbasiertes und @AspectJ-basiertes AOP. Spring 2.0 behält die vollständige Abwärtskompatibilität mit Spring 1.2 bei. Im nächsten Kapitel wird die zugrunde liegende AOP-Unterstützung erläutert, die von der Spring 1.2-API bereitgestellt wird.

AOP im Frühjahr verwendet:

Bietet deklarative Unternehmensdienste, insbesondere als Ersatz für deklarative EJB-Dienste. Der wichtigste Dienst ist das deklarative Transaktionsmanagement, das auf der Transaktionsabstraktion von Spring aufbaut.

Ermöglicht Benutzern die Implementierung benutzerdefinierter Aspekte und die Verwendung von AOP, um die Verwendung von OOP zu verbessern.

Beispiele
Wir verwenden häufig die folgenden:1. Proxy-basiertes AOP
2. Reine und einfache Java-Objektaspekte
4. Aspcet-Aspekte in Injektionsform
Lassen Sie uns sie einzeln anwenden.
Lassen Sie uns zunächst ein paar grundlegende Klassen schreiben.
Schnittstellenklasse:

Implementierungsklasse:
/** 
 * 定义一个接口 
 */
public interface Sleepable { 
  
  /** 
   * 睡觉方法 
   */
  void sleep(); 
}


Erweiterungsklasse:
/**
 * 本人实现睡觉接口
 */
public class ChenLliNa implements Sleepable {
  
  @Override
  public void sleep() {
    // TODO Auto-generated method stub
    System.out.println("乖,该睡觉了!");
  }
}

/**
 * 定义一个睡眠的增强 同时实现前置 和后置
 */
public class SleepHelper implements MethodBeforeAdvice, AfterReturningAdvice {
  
  @Override
  public void afterReturning(Object returnValue, Method method,
      Object[] args, Object target) throws Throwable {
     System.out.println("睡觉前要敷面膜");
  }
  
  @Override
  public void before(Method method, Object[] args, Object target)
      throws Throwable {
    System.out.println("睡觉后要做美梦");
  }
  
}


1. Proxy-basiertes AOP

Zum Beispiel in der Konfigurationsdatei:
<!-- 创建一个增强 advice -->
  <bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper"/>
  
  <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>
  <!-- 定义切点  匹配所有的sleep方法-->
  <bean id ="sleepPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
      <property name="pattern" value=".*sleep"></property>
  </bean>
    
  <!-- 切面  增强+切点结合 -->
  <bean id="sleepHelperAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
     <property name="advice" ref="sleepHelper"/>
     <property name="pointcut" ref="sleepPointcut"/>
  </bean>
    
  <!-- 定义代理对象 -->
  <bean id="linaProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
      <property name="target" ref="lina"/>
      <property name="interceptorNames" value="sleepHelperAdvisor"/>
      <!-- <property name="proxyInterfaces" value="com.tgb.springaop.service.Sleepable"/> -->
  </bean>
Musterattribut gibt einen regulären Ausdruck an, der mit allen Schlafmethoden übereinstimmt

Verwenden Sie org.springframework.aop.support . Der Zweck von DefaultPointcutAdvisor besteht darin, Pointcuts und Erweiterungen zu einem vollständigen Aspekt zu kombinieren.
Nach der endgültigen Konfiguration wird über org.springframework.aop.framework.ProxyFactoryBean ein endgültiges Proxy-Objekt generiert.

2. Reiner und einfacher Java-Objektaspekt
Was meinst du mit reinem und einfachem Java-Objektaspekt? Im Vergleich zur ersten Konfiguration besteht meiner Meinung nach keine Notwendigkeit, einen Proxy zu verwenden, sondern durch Spring. Zu diesem Zeitpunkt sollte unsere Konfigurationsdatei wie folgt geändert werden:


Ist es nicht erforderlich, den Proxy zu konfigurieren? .
<!-- 创建一个增强 advice -->
<bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper"/>
<!-- 目标类 -->
<bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>
  
<!-- 配置切点和通知-->
<bean id ="sleepAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
   <property name="advice" ref="sleepHelper"></property>
   <property name="pattern" value=".*sleep"/>
</bean>
  
<!-- 自动代理配置 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

3. @Aspect-Anmerkungsformular
Nach unserer Erfahrung wissen wir, dass das Anmerkungsformular einfacher ist als die Konfigurationsdatei. Zu diesem Zeitpunkt müssen Sie die vorhandene Methode oder Klasse mit Anmerkungen versehen:


Schreiben Sie einfach in die Konfigurationsdatei:
/**
 * 通过注解的方式 添加增强
 */
@Aspect
@Component
public class SleepHelper03 {  
    
  /*@Pointcut("execution(* com.tgb.springaop.service.impl..*(..))")*/
  @Pointcut("execution(* *.sleep(..))")
  public void sleeppoint(){}
    
  @Before("sleeppoint()")
  public void beforeSleep(){
    System.out.println("睡觉前要敷面膜");
  }
    
  @AfterReturning("sleeppoint()")
  public void afterSleep(){
    System.out.println("睡觉后要做美梦");
  }


4. Injektionsform des Aspcet-Aspekts
<!--扫描包 -->
   <context:component-scan base-package="com.tgb" annotation-config="true"/> 
   <!-- ASPECTJ注解 -->
   <aop:aspectj-autoproxy proxy-target-class="true" /> 
     
   <!-- 目标类 -->
   <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>
Persönlich denke ich, dass dies die einfachste und einfachste ist häufig verwendet, ist auch die flexibelste. Die Konfigurationsdatei lautet wie folgt:



Die in der Konfigurationsdatei erwähnte Klasse SleepHelper02 lautet wie folgt:
<!-- 目标类 -->
  <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>
  <bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper02"/>
    
  <aop:config>
    <aop:aspect ref="sleepHelper">
       <aop:before method="beforeSleep" pointcut="execution(* *.sleep(..))"/>
       <aop:after method="afterSleep" pointcut="execution(* *.sleep(..))"/>
    </aop:aspect>
  </aop:config>

/**
 * 通过注解的方式 添加增强
 */
  
public class SleepHelper02 {
  public void beforeSleep(){
    System.out.println("睡觉前要敷面膜");
  }
  public void afterSleep(){
    System.out.println("睡觉后要做美梦");
  }
}


Doesn Sieht nicht alles gleich aus? Es ist ganz einfach. Wird jeder Spring AOP verwenden? !

Was den Aufruf betrifft, finden Sie hier mehrere Testklassen, die im Grunde gleich sind:

/**
 * 配置文件 spring_aop.xml 通过代理
 */
@Test
public void test(){
  ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop.xml");
    
  Sleepable sleeper =(Sleepable) ct.getBean("linaProxy");
    
  sleeper.sleep();
}
  
/**
 * 配置文件 spring_aop_01.xml  简答的java对象
 */
@Test
public void test01(){
  ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop_01.xml");
    
  Sleepable sleeper = (Sleepable)ct.getBean("lina");
    
  sleeper.sleep();
}
  
/**
 * 配置文件 spring_aop_03.xml 通过aspect注解
 */
@Test
public void test03(){
  ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop_03.xml");
    
    Sleepable sleeper = (Sleepable)ct.getBean("lina");
    
  sleeper.sleep();
}
/**
 * 配置文件 spring_aop_02.xml 通过apsect配置文件
 * @author 陈丽娜
 * @version 2015年5月31日上午10:09:37
 */
@Test
public void test02(){
  ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop_02.xml");
    
  Sleepable sleeper = (Sleepable)ct.getBean("lina");
    
  sleeper.sleep();
}


Aus den Testklassen geht hervor, dass es keinen Unterschied in ihrer Verwendung gibt, egal wie aop implementiert wird. Die Ergebnisse dieser Testklassen sind gleich:


Beispiele zur Erläuterung der AOP-Implementierung im Spring-Framework von JavaWeitere Beispiele zur Erläuterung der AOP-Implementierung im Spring-Framework von Java finden Sie auf der chinesischen PHP-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