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:
/** * 定义一个接口 */ public interface Sleepable { /** * 睡觉方法 */ void sleep(); }
/** * 本人实现睡觉接口 */ 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
<!-- 创建一个增强 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>
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:
<!-- 创建一个增强 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:
/** * 通过注解的方式 添加增强 */ @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("睡觉后要做美梦"); }
<!--扫描包 --> <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"/>
<!-- 目标类 --> <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(); }
Weitere Beispiele zur Erläuterung der AOP-Implementierung im Spring-Framework von Java finden Sie auf der chinesischen PHP-Website!