使用Spring Boot进行面向方面的编程

在上一篇文章中,我提供了一个有关如何通过使用ProxyFactoryBean并实现MethodBeforeAdvice接口在Spring实现宽高比定向的简单示例。

在此示例中,我们将学习如何通过使用Spring Boot和Aspect4j注释来实现方面方向。

让我们从gradle文件开始。

group 'com.gkatzioura'
version '1.0-SNAPSHOT'apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'spring-boot'sourceCompatibility = 1.8buildscript {repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.3.RELEASE")}
}repositories {mavenCentral()
}dependencies {compile("org.springframework.boot:spring-boot-starter-web") {exclude module: "spring-boot-starter-tomcat"}compile("org.springframework.boot:spring-boot-starter-jetty")compile("org.slf4j:slf4j-api:1.6.6")compile("ch.qos.logback:logback-classic:1.0.13")compile("org.aspectj:aspectjweaver:1.8.8")testCompile("junit:junit:4.11")
}

除了Spring Boot插件外,我们还必须包括AspectJweaver软件包。

应用类别

package com.gkatzioura.spring.aop;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;/*** Created by gkatzioura on 5/28/16.*/
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication springApplication = new SpringApplication();ApplicationContext applicationContext = springApplication.run(Application.class,args);}
}

我们将实现一项服务,该服务将获取指定名称的示例。

样本模型将是一个简单的pojo

package com.gkatzioura.spring.aop.model;/*** Created by gkatzioura on 5/28/16.*/
public class Sample {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}

该服务将创建一个示例对象。

package com.gkatzioura.spring.aop.service;import com.gkatzioura.spring.aop.model.Sample;
import org.springframework.stereotype.Service;/*** Created by gkatzioura on 5/28/16.*/
@Service
public class SampleService {public Sample createSample(String sampleName) {Sample sample = new Sample();sample.setName(sampleName);return sample;}
}

到目前为止,一切都很好。 假设我们要在创建样本之前和之后执行一些操作。 Spring的AOP可以帮助我们做到这一点。
createSample函数是一个JoinPoint。 主要概念是与建议一起使用。 根据文档建议,是方面在特定的连接点处采取的措施。

在我们的例子中,我们想在创建样本之前做一些额外的日志记录。 因此,我们将使用之前建议类型。

package com.gkatzioura.spring.aop.aspect;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;/*** Created by gkatzioura on 5/28/16.*/
@Aspect
@Component
public class SampleServiceAspect {private static final Logger LOGGER = LoggerFactory.getLogger(SampleServiceAspect.class);@Before("execution(* com.gkatzioura.spring.aop.service.SampleService.createSample (java.lang.String)) && args(sampleName)")public void beforeSampleCreation(String sampleName) {LOGGER.info("A request was issued for a sample name: "+sampleName);}}

我们使用@Before注释实现了一个函数。 我们提供给注解的参数是切入点表达式。 切入点表达式可帮助我们定义函数,这将触发我们的建议和应使用的函数参数。 因此,在执行createSample方法之前,应该在屏幕上显示一条日志消息。

假设我们要在执行该方法之前和之后采取更多措施,甚至更改createSample函数的结果,我们可以使用@Around Advice。

package com.gkatzioura.spring.aop.aspect;import com.gkatzioura.spring.aop.model.Sample;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;/*** Created by gkatzioura on 5/28/16.*/
@Aspect
@Component
public class SampleServiceAspect {private static final Logger LOGGER = LoggerFactory.getLogger(SampleServiceAspect.class);@Before("execution(* com.gkatzioura.spring.aop.service.SampleService.createSample (java.lang.String)) && args(sampleName)")public void beforeSampleCreation(String sampleName) {LOGGER.info("A request was issued for a sample name: "+sampleName);}@Around("execution(* com.gkatzioura.spring.aop.service.SampleService.createSample (java.lang.String)) && args(sampleName)")public Object aroundSampleCreation(ProceedingJoinPoint proceedingJoinPoint,String sampleName) throws Throwable {LOGGER.info("A request was issued for a sample name: "+sampleName);sampleName = sampleName+"!";Sample sample = (Sample) proceedingJoinPoint.proceed(new Object[] {sampleName});sample.setName(sample.getName().toUpperCase());return sample;}}

正如我们所看到的aroundSampleCreation建议一样,更改输入并更改结果。 您可以在github上找到源代码

翻译自: https://www.javacodegeeks.com/2016/05/aspect-oriented-programming-spring-boot.html

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

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

相关文章

java中的单例模型

参考网址:http://www.runoob.com/design-pattern/singleton-pattern.html 1.目的:保证一个类仅有一个实例,并提供一个访问它的全局访问点。(比如世界只有一个月亮,党只有一个主席) 2. 优点: 1、在内存里只有一个实例,减少了内存的开销&#x…

计算机电路基础张志良,计算机电路基础

图书简介配套资源:电子课件本书特色:★ 金牌作者编写,专门针对计算机专业设计教学内容★ 内容广、难度浅、适用面宽★ 配有《学习指导与习题解答》(ISBN 978-7- 111- 35112-2)本书配套资源,样书均可在本页下载申请,也可…

Java-变量函数 上

类的组成(三部分)全局变量(成员变量)和局部变量成员方法(函数)变量按照变量的数据类型分类基本数据类型 字符型 布尔 整型 浮点型引用数据类型 String 数组根据变量定义的位置不同(或者…

计算机程序备份,将应用程序快照备份到计算机

Linux/UNIX 示例脚本创建一个 shell (.sh) 文件,在其中包含类似如下所示的脚本,以自动下载快照。如果密码中包含特殊字符,请参阅“处理特殊字符”。#!/bin/sh# Sample script to download and maintain 10 maintenance backups# Update the f…

跨站点脚本(xss)_跨站点脚本(XSS)和预防

跨站点脚本(xss)如OWASP网站(https://www.owasp.org/index.php/Cross-site_Scripting_(XSS))所述,跨站点脚本(XSS)攻击的变种几乎是无限的。 在这里,我建议使用基于Servlet筛选器的解决方案来清…

ajax的请求参数详解以及前后台交互详解

function rejectSub(){//从隐藏域中拿到userIDvar userId $("input:hidden[nameuserId]").val();var flag;$.ajax({type : "POST",//请求方式有post,get请求方式,这里是post请求url:${base}/compactedExpert/qcVerificationCompact…

countdown软件测试死亡时间真假,countdown

countdown死亡倒计时真的假的?countdown这款软件是一款有电影衍生出来的产品,很多朋友都很好奇这个countdownapp测试死亡时间准不准,那么今天小编就为大家带来详细的介绍,感兴趣的朋友们一起来看看吧!这是一款在电影倒忌时中出现的时钟软件&…

Spring Boot和Spring数据JPA集成

如今,借助于Spring Boot和spring Data,spring和JPA集成已变得轻而易举。 我要设置一个PostgreSQL服务器 docker pull postgres #run the container docker run --name postgreslocal -e POSTGRES_PASSWORDpostgres -d postgres #get the ip docker ins…

专业软件 —— 硬件评测

1. 硬盘评测 crystaldiskinfo:CrystalDiskInfo – Crystal Dew Worldcrystaldiskmark:硬盘跑分,CrystalDiskMark – Crystal Dew World2. CPU 与 GPU CPU-ZGPU-Z转载于:https://www.cnblogs.com/mtcnn/p/9421010.html

桌面记事本软件测试工资,记事本的一个BUG

我们常用的小工具,系统中附件里的“记事本”工具,有个比较有意思的BUG,让我们按以下步骤来看看。1. 在开始菜单的附件里打开记事本2. 复制引号中的内容,粘贴到记事本里“AAAA BBB CCC DDDDD”3. 把它保存到桌面上,文件…

深度学习目标检测算法综述(论文和代码)

RCNN-→SPP Net-→ Fast RCNN-→ Faster RCNN-→ YOLO-→ SSD 思路是:a,生成候选框 b,CNN提取特征 c,分类网络 d,回归,位置精修(refine) RCNN: 论文: https://arxiv.org/pdf/1311.2524.pdf 源码: https://github.com/rbgirshick/rcnn 一些解读…

在计算机中描述景物结构形状与外貌,在计算机中通过描述景物的结构、形状与外貌,然后将它绘制成图在屏幕上显示出来,此类图像称为_____。...

并实打印现共享文件和机等共享功能,计中通屏完全地相信平等互通,网工需的则所作模局域式是,网络的各没有台计一个内部主次之分若要算机。算机述景包括条件主要区域规划发展。过描的咨项目询包括(准备建设阶段。结构包括咨询主要工程任务师的。…

JBoss Fuse:使用JEXL的动态蓝图文件

在本文中,我将展示如何在Apache Aries Blueprint xml文件中添加一些内联脚本。 我不一定会称其为最佳实践,但我一直认为这种功能可能有用。 可能当我被迫使用xml来模拟命令式编程结构(例如使用Apache Ant时)时,我开始…

设置序列

//Oracle 中给主键设置自增长,先设序列,在设置触发器Create table BigCustemer1( ID number(10), cus_name varchar2(20),contacts varchar2(20),phone varchar2(20) ,email varchar2(30),address varchar2(50),notes varchar2(70)); create sequence bi…

材料成形计算机辅助设计,材料成型及计算机辅助设计(综述)

CAE介绍CAE的现状及其软件综述CAE的现状及其软件综述主要内容:1、CAE的现状;2、CAE软件综述。摘要计算机辅助工程(CAE)是一种迅速发展的信息技术,是实现重大工程和工业产…

background-size属性100% cover contain

backgroun-size: 数字:100px 80px 百分比:100% 100% 相对于父元素的,能占满全屏,但是比例可能会失真 cover:占满全屏,可能一部分显示不出来 contain:有一个占满方向占满,背景图不失真…

服务器是计算机的一种 是指,pc服务器是指什么意思

大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。pc服务器是指电脑服务器,pc即为personal computer个人电脑。电脑服务器是一种高性能计算机,作为网络的节点,存储、处理网络上80%的数据、信息&…

小程序richtext_用于基于SWT的应用程序的RichText编辑器组件

小程序richtext本文将完成使用SWT实现我们自己的RichText编辑器组件的任务。 在为我的一位客户开发基于桌面的应用程序时,我遇到了这样的可视化组件的需求,并希望添加一项功能,以允许用户使用粗体,斜体,删除线等功能来…

《重构-改善既有代码的设计》学习笔记(一)

其实看了重构之后,发现重构和设计模式有很多很多相通的地方,或者有着同样的目的。你完全可以参考设计模式的原则来修改已有的代码。 1.单一职责原则 2.开放--封闭原则 3.依赖倒装原则 4.迪米特原则(类松耦合) 笔者也在《重构》这本…

展示Java开发人员课程包

60个小时以上的课程,5门所有级别的课程:成为Java编程专家 嘿,怪胎, 本周,在我们的JCG Deals商店中 ,我们提供了一个极端的报价 。 我们提供的Java Developer Course Bundle 仅售39美元,而不是…