javascript
maven aspectj_使用Spring AspectJ和Maven进行面向方面的编程
maven aspectj
Spring框架附帶AOP支持。 實(shí)際上,如Spring參考文檔中所述 ,
“ Spring的關(guān)鍵組件之一是AOP框架。 盡管Spring IoC容器不依賴于AOP,這意味著您不需要使用AOP,但AOP是對(duì)Spring IoC的補(bǔ)充,以提供一種功能強(qiáng)大的中間件解決方案。 AOP在Spring框架中用于…
- …提供聲明性企業(yè)服務(wù),尤其是代替EJB聲明性服務(wù)。 此類服務(wù)中最重要的是聲明式事務(wù)管理。 ?
- …允許用戶實(shí)現(xiàn)自定義方面,并通過(guò)AOP補(bǔ)充其對(duì)OOP的使用。 ”
盡管如此,與完整的AOP實(shí)現(xiàn)(例如AspectJ)相比, Spring AOP框架還是有某些限制。 人們?cè)谑褂肧pring AOP框架時(shí)遇到的最常見(jiàn)問(wèn)題源于Spring AOP是“基于代理的”這一事實(shí)。 換句話說(shuō),當(dāng)將bean用作依賴項(xiàng),并且應(yīng)根據(jù)特定方面建議其方法時(shí),IoC容器將注入“方面感知” bean代理,而不是bean本身。 對(duì)用戶透明地對(duì)代理bean實(shí)例執(zhí)行方法調(diào)用,以便在將調(diào)用委派給實(shí)際的“代理” bean之前和/或之后執(zhí)行方面邏輯。
此外, Spring AOP框架使用JDK動(dòng)態(tài)代理或CGLIB創(chuàng)建給定目標(biāo)對(duì)象的代理。 第一個(gè)只能為接口創(chuàng)建代理,而第二個(gè)可以代理具體類但有一定限制。 特別是,如Spring參考文檔中所述 ,
“ 如果要代理的目標(biāo)對(duì)象實(shí)現(xiàn)了至少一個(gè)接口,則將使用JDK動(dòng)態(tài)代理。 目標(biāo)類型實(shí)現(xiàn)的所有接口都將被代理。 如果目標(biāo)對(duì)象未實(shí)現(xiàn)任何接口,則將創(chuàng)建CGLIB代理。 ”
總而言之,在使用Spring AOP框架時(shí),您應(yīng)該牢記兩個(gè)重要事項(xiàng):
我們建議克服以上問(wèn)題的方法是使用AspectJ編織。 換句話說(shuō),將方面邏輯直接注入到目標(biāo)類中,并消除了代理所有方法的必要性。 有三種方法可以注入AspectJ方面所隱含的指令:
可以使用上述任何方法。 在本教程中,我們將介紹如何在Spring和Maven中使用AspectJ編譯時(shí)編織。 我們將實(shí)現(xiàn)最小的“問(wèn)候” Spring服務(wù)和相關(guān)的“問(wèn)候” AspectJ方面。 Spring服務(wù)方法調(diào)用將被AspectJ方面攔截。 AspectJ方面將使用其自己的“問(wèn)候”消息來(lái)豐富Spring服務(wù)的“問(wèn)候”消息。 AspectJ方面的“問(wèn)候”消息將從Spring容器中注入,只是為了說(shuō)明如何將Spring依賴項(xiàng)注入到AspectJ方面。
已經(jīng)為自己的bean服務(wù)實(shí)現(xiàn)了方面的Spring用戶可以透明地切換到AspectJ ,這意味著由于Spring AOP框架使用AspectJ切入點(diǎn)表達(dá)語(yǔ)言的子集,因此不需要編寫任何特殊代碼,并且@AspectJ Spring方面完全可以進(jìn)行AspectJ編織。
我們首選的開發(fā)環(huán)境是Eclipse ,因此,必須先安裝具有Maven支持的Eclipse 。 用于Eclipse的Maven插件的安裝不在本教程的討論范圍之內(nèi),因此不再討論。 但是,您將需要以下組件:
在本教程中,我們將使用Eclipse Galileo,“ m2eclipse” Maven Integration for Eclipse插件版本0.10.0,Spring版本3.0.1,aspectjrt版本1.6.7和Aspectj-maven-plugin版本1.3。
讓我們開始,
讓我們回顧一下有關(guān)Maven Web項(xiàng)目結(jié)構(gòu)的一些事情
為了在運(yùn)行時(shí)正確使用Spring ,我們必須向Web應(yīng)用程序提供所有必需的庫(kù)。 打開“ pom.xml”的圖形編輯器并執(zhí)行以下更改:
- 創(chuàng)建一個(gè)名為org.springframework.version且值為3.0.1.RELEASE的新屬性。
- 根據(jù)您的Java運(yùn)行時(shí)環(huán)境的版本創(chuàng)建一個(gè)名為maven.compiler.source的新屬性,并將其值設(shè)置為value,我們將使用1.6
- 根據(jù)您的Java運(yùn)行時(shí)環(huán)境的版本創(chuàng)建名為maven.compiler.target和值的新特性,我們將使用1.6
- 導(dǎo)航到POM編輯器的“ Dependencies”頁(yè)面,并創(chuàng)建以下依賴關(guān)系(您應(yīng)在該頁(yè)面的“ Dependency Details”部分的“ GroupId”,“ Artifact Id”和“ Version”字段中進(jìn)行填充):
- 組ID: org.springframework工件ID: spring-web版本: $ {org.springframework.version}
- 組ID:org.aspectj工件ID:aspectjrt版本:1.6.7
- 導(dǎo)航到POM編輯器的“插件”頁(yè)面并創(chuàng)建以下插件(您應(yīng)在該頁(yè)面的“插件詳細(xì)信息”部分的“ GroupId”,“工件ID”和“版本”字段中填寫):
- 組ID: org.codehaus.mojo工件ID: aspectj-maven-plugin版本: 1.3
- 在POM編輯器的“插件”頁(yè)面上,選擇新創(chuàng)建的插件(從“插件”部分中),并將其綁定到編譯執(zhí)行目標(biāo)。 為此,請(qǐng)找到“執(zhí)行”部分并創(chuàng)建一個(gè)新的執(zhí)行。 在“執(zhí)行詳細(xì)信息”部分,創(chuàng)建一個(gè)新目標(biāo)并將其命名為“ compile ”
- 新創(chuàng)建的插件需要進(jìn)行最后的配置更改。 為了使AspectJ編譯器正確地編織方面類,我們必須定義所使用的Java運(yùn)行時(shí)環(huán)境版本。 我們需要編輯“ pom.xml”文件來(lái)執(zhí)行更改。 選擇POM編輯器的“ pom.xml”頁(yè)面,找到新創(chuàng)建的插件,并如下進(jìn)行更改:
- <plugin><groupId>org.codehaus.mojo</groupId><artifactId>aspectj-maven-plugin</artifactId><version>1.3</version><configuration><source>${maven.compiler.source}</source><target>${maven.compiler.target}</target></configuration><executions><execution><goals><goal>compile</goal></goals></execution></executions> </plugin>
- 最后,如下所示更改“ maven-compiler-plugin”:
- <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.0.2</version><configuration><source>${maven.compiler.source}</source><target>${maven.compiler.target}</target></configuration>
</plugin>
如您所見(jiàn), Maven以聲明方式管理庫(kù)依賴關(guān)系。 創(chuàng)建本地存儲(chǔ)庫(kù)(默認(rèn)情況下,位于{user_home} /。m2文件夾下),所有必需的庫(kù)都從公共存儲(chǔ)庫(kù)下載并放置在該庫(kù)中。 此外,庫(kù)內(nèi)的依賴關(guān)系會(huì)自動(dòng)解決和處理。
下一步是為Web應(yīng)用程序提供掛鉤,以便在啟動(dòng)時(shí)加載Spring上下文。
在/ src / main / webapp / WEB-INF下找到“ web.xml”文件,然后添加以下內(nèi)容:
為了在啟動(dòng)時(shí)加載Spring上下文,
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>現(xiàn)在讓我們創(chuàng)建將驅(qū)動(dòng)Spring容器的applicationContext.xml文件。 在/ src / main / webapp / WEB-INF目錄下創(chuàng)建文件。 下面是一個(gè)示例“ applicationContext.xml”
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:task="http://www.springframework.org/schema/task"xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"><context:component-scan base-package="com.javacodegeeks.aspectjspring" /><bean class="com.javacodegeeks.aspectjspring.aspects.GreetingAspect" factory-method="aspectOf"><property name="message" value="Hello from Greeting Aspect"/></bean></beans>這里要注意的事情:
- 將context:component-scan元素的base-package屬性更改為項(xiàng)目的基本包,以掃描Spring組件
- 僅當(dāng)我們要向它們注入依賴項(xiàng)時(shí),才必須在“ applicationContext.xml”中定義我們的方面
- AspectJ表示“方面關(guān)聯(lián)”。 它定義了如何管理方面狀態(tài)。 支持以下狀態(tài)關(guān)聯(lián):
- 每個(gè)JVM –構(gòu)造和使用一個(gè)共享方面實(shí)例(默認(rèn))
- 每個(gè)對(duì)象–每個(gè)建議對(duì)象的方面都有其自己的狀態(tài)
- 每個(gè)控制流–每個(gè)特定控制流的方面都有其自己的狀態(tài)
所有AspectJ方面類都具有“ hasAspect()”和“ aspectOf()”靜態(tài)方法。 這些方法由AspectJ編譯器/加載時(shí)間編織器隱式生成。 因此,對(duì)于默認(rèn)的方面狀態(tài),可以使用“ aspectOf()”方法來(lái)檢索一個(gè)方面的實(shí)例 - 頁(yè)面加載后,我們檢索Spring Web應(yīng)用程序上下文,并查找“問(wèn)候”服務(wù)。 我們要做的就是調(diào)用“ sayHello()”方法以從我們的方面和服務(wù)中查看合并的問(wèn)候消息
- GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
- GWT Spring和Hibernate進(jìn)入數(shù)據(jù)網(wǎng)格世界
- Spring 3 RESTful Web服務(wù)
- GWT 2 Spring 3 JPA 2 Hibernate 3.5教程– Eclipse和Maven 2展示
- 具有Spring和Maven教程的JAX–WS
現(xiàn)在讓我們創(chuàng)建“問(wèn)候” Spring服務(wù)和相關(guān)的“問(wèn)候” AspectJ方面。 在主程序包下創(chuàng)建一個(gè)名為“服務(wù)”的子程序包,并將“ GreetingService”類放在此處。 下面是一個(gè)示例“問(wèn)候”服務(wù):
package com.javacodegeeks.aspectjspring.services;import org.springframework.stereotype.Service;@Service("greetingService") public class GreetingService {public String sayHello() {return "Hello from Greeting Service";}}在主程序包下創(chuàng)建一個(gè)名為“ aspects”的子程序包,并將“ GreetingAspect”類放在此處。 下面是一個(gè)示例“問(wèn)候”方面:
package com.javacodegeeks.aspectjspring.aspects;import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect;@Aspect public class GreetingAspect {private String message;public void setMessage(String message) {this.message = message;}@Around("execution(* com.javacodegeeks.aspectjspring.services.GreetingService.*(..))")public Object advice(ProceedingJoinPoint pjp) throws Throwable {String serviceGreeting = (String) pjp.proceed();return message + " and " + serviceGreeting;}}最后,在/ src / main / webapp文件夾下找到項(xiàng)目的主網(wǎng)頁(yè)“ index.jsp”,并進(jìn)行如下更改:
<%@ page language="java" import="org.springframework.web.context.WebApplicationContext, org.springframework.web.context.support.WebApplicationContextUtils, com.javacodegeeks.aspectjspring.services.GreetingService"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><% WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); GreetingService greetingService = (GreetingService) webApplicationContext.getBean("greetingService"); %> <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>JSP Page</title></head><body><h1>Test service invoked and greets you by saying : <%=greetingService.sayHello()%></h1></body> </html>這里要注意的事情:
要構(gòu)建應(yīng)用程序,請(qǐng)右鍵單擊您的項(xiàng)目? 運(yùn)行為? Maven包
要部署Web應(yīng)用程序,只需將“ .war”文件從“ target”目錄復(fù)制到Apache – Tomcat “ webapps”文件夾
午餐應(yīng)用程序?qū)⒛臑g覽器指向以下地址
http:// localhost:8080 / {application_name} /
如果一切順利,您應(yīng)該會(huì)在主頁(yè)上看到以下內(nèi)容:
“測(cè)試服務(wù)被調(diào)用并打招呼:“ Greeting Aspect向您問(wèn)好,Greeting Service向您問(wèn)好”
您可以從這里下載項(xiàng)目
希望你喜歡
賈斯汀
相關(guān)文章 :
翻譯自: https://www.javacodegeeks.com/2010/07/aspect-oriented-programming-with-spring.html
maven aspectj
總結(jié)
以上是生活随笔為你收集整理的maven aspectj_使用Spring AspectJ和Maven进行面向方面的编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 银行转账24小时内可以撤销是立刻退回吗?
- 下一篇: gwt 同步和异步_GWT Spring