maven aspectj_使用Spring AspectJ和Maven进行面向方面的编程

maven aspectj

Spring框架附带AOP支持。 实际上,如Spring参考文档中所述 ,

Spring的关键组件之一是AOP框架。 尽管Spring IoC容器不依赖于AOP,这意味着您不需要使用AOP,但AOP是对Spring IoC的补充,以提供一种功能强大的中间件解决方案。 AOP在Spring框架中用于…

  • …提供声明性企业服务,尤其是代替EJB声明性服务。 此类服务中最重要的是声明式事务管理。  
  • …允许用户实现自定义方面,并通过AOP补充其对OOP的使用。

尽管如此,与完整的AOP实现(例如AspectJ)相比, Spring AOP框架还是有某些限制。 人们在使用Spring AOP框架时遇到的最常见问题源于Spring AOP是“基于代理的”这一事实。 换句话说,当将bean用作依赖项,并且应根据特定方面建议其方法时,IoC容器将注入“方面感知” bean代理,而不是bean本身。 对用户透明地对代理bean实例执行方法调用,以便在将调用委派给实际的“代理” bean之前和/或之后执行方面逻辑。

此外, Spring AOP框架使用JDK动态代理或CGLIB创建给定目标对象的代理。 第一个只能为接口创建代理,而第二个可以代理具体类但有一定限制。 特别是,如Spring参考文档中所述 ,

如果要代理的目标对象实现了至少一个接口,则将使用JDK动态代理。 目标类型实现的所有接口都将被代理。 如果目标对象未实现任何接口,则将创建CGLIB代理。

总而言之,在使用Spring AOP框架时,您应该牢记两个重要事项:

  1. 如果您的“代理” bean实现了至少一个接口,则只能将代理bean强制转换为该接口。 如果尝试将其强制转换为“代理” bean类,则应期望在运行时引发ClassCastException。 尽管如此, Spring AOP框架提供了强制CGLIB代理的选项,但有上述限制(请参阅Spring参考文档的相关章节)
  2. 方面不适用于术中呼叫。 这意味着代理无法拦截来自相同“代理” bean的另一个方法的方法的调用

我们建议克服以上问题的方法是使用AspectJ编织。 换句话说,将方面逻辑直接注入到目标类中,并消除了代理所有方法的必要性。 有三种方法可以注入AspectJ方面所隐含的指令:

  1. 编译时间编织–通过AspectJ编译器编译目标源或方面类
  2. 编译后编织–向已编译的类注入方面指令
  3. 加载时间编织–在类加载期间将方面指令注入字节码

可以使用上述任何方法。 在本教程中,我们将介绍如何在Spring和Maven中使用AspectJ编译时编织。 我们将实现最小的“问候” Spring服务和相关的“问候” AspectJ方面。 Spring服务方法调用将被AspectJ方面拦截。 AspectJ方面将使用其自己的“问候”消息来丰富Spring服务的“问候”消息。 AspectJ方面的“问候”消息将从Spring容器中注入,只是为了说明如何将Spring依赖项注入到AspectJ方面。

已经为自己的bean服务实现了方面的Spring用户可以透明地切换到AspectJ ,这意味着由于Spring AOP框架使用AspectJ切入点表达语言的子集,因此不需要编写任何特殊代码,并且@AspectJ Spring方面完全可以进行AspectJ编织。

我们首选的开发环境是Eclipse ,因此,必须先安装具有Maven支持的Eclipse 。 用于Eclipse的Maven插件的安装不在本教程的讨论范围之内,因此不再讨论。 但是,您将需要以下组件:

  1. 从这里蚀
  2. 从这里开始 ,Eclipse的Maven插件

在本教程中,我们将使用Eclipse Galileo,“ m2eclipse” Maven Integration for Eclipse插件版本0.10.0,Spring版本3.0.1,aspectjrt版本1.6.7和Aspectj-maven-plugin版本1.3。

让我们开始,

  1. 创建一个新的Maven项目,转到File? 项目? Maven? Maven项目
  2. 在向导的“选择项目名称和位置”页面中,确保未选中“创建简单项目(跳过原型选择)”选项,单击“下一步”以继续使用默认值
  3. 在向导的“选择原型”页面中,在“目录”下拉列表中选择“ Nexus Indexer”,并在刷新原型选择区域后,从“ org.codehaus.mojo”中选择“ webapp-jee5”原型。原型”。 您可以使用“过滤器”文本框来缩小搜索结果范围。 点击“下一步”继续
  4. 在向导的“输入工件ID”页面中,您可以定义项目的名称和主程序包。 我们将“ Group Id”变量设置为“ com.javacodegeeks”,将“ Artifact Id”变量设置为“ aspectjspring”。 前面提到的选择组成了主项目包“ com.javacodegeeks.aspectjspring”和项目名“ aspectjspring”。 点击“完成”退出向导并创建您的项目

让我们回顾一下有关Maven Web项目结构的一些事情

  1. / src / main / java文件夹包含应用程序动态内容的源文件
  2. / src / test / java文件夹包含用于单元测试的所有源文件
  3. / src / main / webapp文件夹包含用于创建有效的Web应用程序的基本文件,例如“ web.xml”
  4. / target文件夹包含已编译和打包的可交付成果
  5. “ pom.xml”是项目对象模型(POM)文件。 包含所有项目相关配置的单个文件。

为了在运行时正确使用Spring ,我们必须向Web应用程序提供所有必需的库。 打开“ pom.xml”的图形编辑器并执行以下更改:

  1. 在POM编辑器的“概述”页面上的“属性”部分中找到并执行以下更改:
  • 创建一个名为org.springframework.version且值为3.0.1.RELEASE的新属性。
    • 根据您的Java运行时环境的版本创建一个名为maven.compiler.source的新属性,并将其值设置为value,我们将使用1.6
      • 根据您的Java运行时环境的版本创建名为maven.compiler.target和值的新特性,我们将使用1.6
        • 导航到POM编辑器的“ Dependencies”页面,并创建以下依赖关系(您应在该页面的“ Dependency Details”部分的“ GroupId”,“ Artifact Id”和“ Version”字段中进行填充):
          • 组ID: org.springframework工件ID: spring-web版本: $ {org.springframework.version}
            • ID:org.aspectj工件ID:aspectjrt版本:1.6.7
            1. 导航到POM编辑器的“插件”页面并创建以下插件(您应在该页面的“插件详细信息”部分的“ GroupId”,“工件ID”和“版本”字段中填写):
              • 组ID: org.codehaus.mojo工件ID: aspectj-maven-plugin版本: 1.3
              1. 在POM编辑器的“插件”页面上,选择新创建的插件(从“插件”部分中),并将其绑定到编译执行目标。 为此,请找到“执行”部分并创建一个新的执行。 在“执行详细信息”部分,创建一个新目标并将其命名为“ compile
              2. 新创建的插件需要进行最后的配置更改。 为了使AspectJ编译器正确地编织方面类,我们必须定义所使用的Java运行时环境版本。 我们需要编辑“ pom.xml”文件来执行更改。 选择POM编辑器的“ pom.xml”页面,找到新创建的插件,并如下进行更改:
              3. <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>
              4. 最后,如下所示更改“ maven-compiler-plugin”:
              5. <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>

                如您所见, Maven以声明方式管理库依赖关系。 创建本地存储库(默认情况下,位于{user_home} /。m2文件夹下),所有必需的库都从公共存储库下载并放置在该库中。 此外,库内的依赖关系会自动解决和处理。

                下一步是为Web应用程序提供挂钩,以便在启动时加载Spring上下文。

                在/ src / main / webapp / WEB-INF下找到“ web.xml”文件,然后添加以下内容:

                为了在启动时加载Spring上下文,

                <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
                </listener>

                现在让我们创建将驱动Spring容器的applicationContext.xml文件。 在/ src / main / webapp / WEB-INF目录下创建文件。 下面是一个示例“ 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>

                这里要注意的事情:

                1. 将context:component-scan元素的base-package属性更改为项目的基本包,以扫描Spring组件
                2. 仅当我们要向它们注入依赖项时,才必须在“ applicationContext.xml”中定义我们的方面
                3. AspectJ表示“方面关联”。 它定义了如何管理方面状态。 支持以下状态关联:
                • 每个JVM –构造和使用一个共享方面实例(默认)
                • 每个对象–每个建议对象的方面都有其自己的状态
                • 每个控制流–每个特定控制流的方面都有其自己的状态
                  所有AspectJ方面类都具有“ hasAspect()”和“ aspectOf()”静态方法。 这些方法由AspectJ编译器/加载时间编织器隐式生成。 因此,对于默认的方面状态,可以使用“ aspectOf()”方法来检索一个方面的实例

                现在让我们创建“问候” Spring服务和相关的“问候” AspectJ方面。 在主程序包下创建一个名为“服务”的子程序包,并将“ GreetingService”类放在此处。 下面是一个示例“问候”服务:

                package com.javacodegeeks.aspectjspring.services;import org.springframework.stereotype.Service;@Service("greetingService")
                public class GreetingService {public String sayHello() {return "Hello from Greeting Service";}}

                在主程序包下创建一个名为“ aspects”的子程序包,并将“ GreetingAspect”类放在此处。 下面是一个示例“问候”方面:

                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文件夹下找到项目的主网页“ index.jsp”,并进行如下更改:

                <%@ 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>

                这里要注意的事情:

                1. 页面加载后,我们检索Spring Web应用程序上下文,并查找“问候”服务。 我们要做的就是调用“ sayHello()”方法以从我们的方面和服务中查看合并的问候消息

                要构建应用程序,请右键单击您的项目? 运行为? Maven包

                要部署Web应用程序,只需将“ .war”文件从“ target”目录复制到Apache – Tomcat “ webapps”文件夹

                午餐应用程序将您的浏览器指向以下地址

                http:// localhost:8080 / {application_name} /

                如果一切顺利,您应该会在主页上看到以下内容:

                “测试服务被调用并打招呼:“ Greeting Aspect向您问好,Greeting Service向您问好”

                您可以从这里下载项目

                希望你喜欢

                贾斯汀

                相关文章 :

                • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
                • GWT Spring和Hibernate进入数据网格世界
                • Spring 3 RESTful Web服务
                • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程– Eclipse和Maven 2展示
                • 具有Spring和Maven教程的JAX–WS

                翻译自: https://www.javacodegeeks.com/2010/07/aspect-oriented-programming-with-spring.html

                maven aspectj

              本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359825.shtml

              如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

              相关文章

              ios 查询mysql数据库操作系统_iOS数据库FMDB--增删改查(模糊查询)详细介绍

              简介&#xff1a;很早就想整理一下数据库的使用了&#xff0c;刚好最近接触较多&#xff0c;加之可以安排出空余的时间&#xff0c;所以瓜子我贡献出自己喝咖啡的时间整理一下FMDB的使用&#xff0c;以下是对FMDB的介绍以及基本使用 --- insert、delete、update、select。其中s…

              java arraylist 重复_Java中ArrayList去除重复元素

              Java中ArrayList去除重复元素//删除ArrayList中重复元素public static void removeDuplicate(ArrayList list) {for ( int i 0 ; i for ( int j list.size() - 1 ; j > i; j -- ) {ForCytoLevel3 jjj (ForCytoLevel3)list.get(j);ForCytoLevel3 i…

              c#时间转换

              转自 http://blog.csdn.net/yysyangyangyangshan/article/details/6782874最近做ASP.NET的一个项目&#xff0c;获取时间的时候&#xff0c;由于我的系统时间设置了上午和下午&#xff0c;结果DateTime.Now老是写不到数据库中&#xff0c;然后&#xff0c;上网查了个[csharp]vi…

              SQL Server 2008 R2如何生成带数据的数据库脚本

              1.对想要复制的数据库右键&#xff0c;“任务”&#xff0c;“生成脚本” 2.下面需要注意的是&#xff0c;默认情况下&#xff0c;只会生成仅架构的脚本&#xff0c;也就是说仅仅有表结构&#xff0c;而没有数据的空壳。所以需要额外的设置。 在设置脚本编写选项&#xff0c;选…

              java saxreader_JAVA解析XML,SAXReader无法使用

              写了段代码要解析XML文件。for (int p 0; p < files.length; p) {System.out.println("Dom4jxml2:333::"p);if (files[p].isFile() && files[p].getName().startsWith("CN_MT1101_")) {File f new File(files[p].getPath());System.out.print…

              methodhandle_概览Java 7 MethodHandle及其用法

              methodhandle由于Java的Reflection API&#xff0c;我们已经能够在运行时检查和更改程序执行。 特别是&#xff0c;我们可以在运行时观察接口/类/方法和字段&#xff0c;而无需在编译时知道它们的名称。 JDK 7为这种动态/运行时检查引入了一个新的参与者&#xff0c;即方法句柄…

              quartz CronExpression表达式

              一个cron表达式有至少6个&#xff08;也可能7个&#xff09;有空格分隔的时间元素。按顺序依次为1.秒&#xff08;0~59&#xff09;2.分钟&#xff08;0~59&#xff09;3.小时&#xff08;0~23&#xff09;4.天&#xff08;月&#xff09;&#xff08;0~31&#xff0c;但是你需…

              java两个字符串前缀_java – 找到两个字符串的最长公共前缀

              我想找到两个字符串的最长公共前缀.有没有办法循环我的最后几个if语句,以便我可以结束彼此不匹配的最后几个字符&#xff1f;System.out.println("Enter the first string: ");String s input.nextLine();System.out.println("Enter the second string: "…

              Codeforces 427 D. Match amp; Catch

              后缀数组.... 在两个串中唯一出现的最小公共子串 D. Match & Catchtime limit per test1 secondmemory limit per test512 megabytesinputstandard inputoutputstandard outputPolice headquarter is monitoring signal on different frequency levels. They have got two …

              gwt 同步和异步_GWT Spring和Hibernate进入数据网格世界

              gwt 同步和异步利用Infinispan Data Grid的功能最大化Hibernate性能。 一个GWT &#xff0c; Spring &#xff0c; JPA &#xff0c; Hibernate &#xff0c; Infinispan集成教程。 在本教程中&#xff0c;我们将讨论如何将Infinispan用作Hibernate二级缓存提供程序。 Infinis…

              java分页 jar_零基础学java之javaEE,分页

              【分页】一 分页1.1分页概念引入什么是分页?分页(英语&#xff1a;Paging)&#xff0c;是一种操作系统里存储器管理的一种技术&#xff0c;可以使电脑的主存可以使用存储在辅助存储器中的数据。操作系统会将辅助存储器(通常是磁盘)中的数据分区成固定大小的区块&#xff0c;称…

              查看修改MySQL字符集

              查看修改MySQL字符集 http://blog.sina.com.cn/s/blog_70ac6bec01016fts.html 查看修改MySQL字符集 (2012-08-22 09:53:21) 转载▼标签&#xff1a; 字符集 mysql数据库 mysql字符集查看 mysql启动命令 修改mysql字符集 分类&#xff1a; 网站开发MySQL字符集多种多样…

              java上传文件需要的依赖_SpringBoot使用commons-fileupload上传文件的类

              网上找了一些&#xff0c;都是基本介绍&#xff0c;没有直接就可以使用类&#xff0c;在实际工作当中都有适合当前项目的上传文件的方法&#xff0c;本人写了一个类&#xff0c;比较基础&#xff0c;但呆以满足项目的上传文件功能&#xff0c;使用了commons-fileupload这个组件…

              ArcGIS for Android示例解析之离线地图-----LocalTiledLayer

              转自&#xff1a;http://blog.csdn.net/wozaifeiyang0/article/details/7327423 LocalTiledLayer 看到这个标题是否是很激动&#xff0c;如题&#xff0c;该示例就是添加一个离线地图&#xff0c;这应该是很多开发人员期盼已久的功能了吧&#xff0c;正式版一处这个应该是一个很…

              md5 算法java实现_java实现MD5算法

              import java.security.MessageDigest;/** 加密工具*author 刘彦青***/public class EncryptUtil {/** MD5加密** param jiami* 源字符串* return 加密后的字符串 */public final static String md5(String jiami) {char hexDigits[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C,…

              wikioi 1017--乘积最大

              给定一个数串&#xff0c;以及K&#xff0c;求对这个数串K划分的乘积最大值。 DP思路&#xff1a;一开始肯定想到的是递归&#xff0c;假设在某两个字符间有一个乘号&#xff0c;那么乘积最大就是乘号两边的区间接着划分的乘积最大值。 于是状态空间表示如下dp[i][k]表示从0~i之…

              java在线找错_平台配置及测试错误提示及解决方案

              平台配置错误提示及解决方案开发者在点击提交服务的时候可能会遇到以下各种各样的问题&#xff0c;本文列举出部分平台会弹出的提示&#xff0c;以便解决提交出现的问题。1、 请完成分发国家配置原因&#xff1a;未选择分发国家或未保存解决&#xff1a;在配置-发布国家中&…

              d3 mysql_javascript – 在d3可视化中访问MySQL数据库

              我需要一些关于d3和MySQL的帮助.以下是我的问题&#xff1a;我有数据存储在MySQL中(例如&#xff1a;关键字及其频率).我现在想用d3将其可视化.据我所知,d3需要json文件作为输入.我的问题是&#xff1a;如何从d3脚本访问这个MySQL数据库&#xff1f;我能想到的一种方法是&#…

              resteasy_Tomcat 7上具有RESTeasy JAX-RS的RESTful Web服务– Eclipse和Maven项目

              resteasy开发Web服务的RESTful方法不断受到越来越多的关注&#xff0c;并且似乎正在将SOAP淘汰。 我不会讨论哪种方法更好&#xff0c;但是我相信我们都同意REST更轻量级。 在本教程中&#xff0c;我将向您展示如何使用RESTeasy开发RESTful服务以及如何将它们部署在Tomcat服务器…

              java httpserver 多个接口_多个Servlet之间数据共享实现方案

              1.数据共享&#xff1a;OneServlet工作完毕后&#xff0c;将产生数据交给TwoServlet来使用Servlet规范中提供四种数据共享方案1.ServletContext接口2.Cookie类3.HttpSession接口4.HttpServletRequest接口ServletContext接口:1.介绍&#xff1a;1)来自于Servlet规范中一个接口。…