配置aopaop简介要介绍面向切面变成(aspect-oriented programming,aop),需要先考虑一个这样的场景:公司有一个人力资源管理系统目前已经上线,但是系统运行不稳定,有时运行的很慢,为了检测到底是哪个环节出现问题了,开发人员想要监控每一个方法执行的时间,再根据这些执行时间判断出问题所在。当问题解决后,再把这些监控移除掉。系统目前已经运行,如果手动修改系统成千上万个方法,工作量太大,而且这些监控方法以后还要移除掉;如果能够在系统运行过程中动态添加代码,就能很好的解决问题。面向切面编程(aop)是一种动态添加代码到系统运行时的方式。spring boot 对 aop 提供了很好的支持。在 aop 中,有一些常见的概念需要了解:
连接点是指类中可以被增强的方法。例如,想修改那个方法的功能,那么该方法就是一个连接点
切入点(pointcut)是指定义对连接点(joinpoint)进行拦截的操作。这个定义是指拦截所有以 insert 开始的方法作为切入点
在拦截到 joinpoint 之后,要执行的操作是发送通知。例如,之前说到的打印日志监控。通知分为前置通知、后置通知、异常通知、最终通知、环绕通知
aspect(切面):pointcut 和 advice 的结合
target(目标对象):要增强的类成为 target
spring boot 支持spring boot 在 spring 的基础上对 aop 的配置提供了自动化配置解决方案 spring-boot-starter-aop ,首先引入依赖,如下:
<!-- aop 依赖 --><dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-aop</artifactid></dependency>
然后在com.sang.aop.service 包下创建 userservice 类,如下:
@servicepublic class userservice { public string getuserbyid(integer id){ system.out.println("get..."); return "user"; } public void deleteuserbyid(integer id){ system.out.println("delete..."); }}
然后创建切面,如下:
@component@aspectpublic class logaspect { @pointcut("execution(* com.sang.aop.service.*.*(..))") public void pc1() { } @before(value = "pc1()") public void before(joinpoint jp) { string name = jp.getsignature().getname(); system.out.println(name + "方法开始执行..."); } @after(value = "pc1()") public void after(joinpoint jp) { string name = jp.getsignature().getname(); system.out.println(name + "方法执行结束..."); } @afterreturning(value = "pc1()", returning = "result") public void afterreturning(joinpoint jp, object result) { string name = jp.getsignature().getname(); system.out.println(name + "方法返回值为:" + result); } @afterthrowing(value = "pc1()",throwing = "e") public void afterthrowing(joinpoint jp, exception e) { string name = jp.getsignature().getname(); system.out.println(name+"方法抛异常了,异常是:"+e.getmessage()); } @around("pc1()") public object around(proceedingjoinpoint pjp) throws throwable { return pjp.proceed(); }}
代码解释:
@aspect 注解表明这是一个切面类
@pointcut() annotation is used in the method pc1() to define a pointcut.。execution 中的第一个 * 表示方法返回任意值,第二个 * 表示 service 包下的任意类,第三个 * 表示类中的任意方法,括号中的两个点表示方法参数任意,即这里描述的切入点为 service 包下所有类中的所有方法
before() 方法使用了 @before注解 ,表示这是一个前置通知,该方法在目标方法执行之前执行。joinpoint 参数可提供有关目标方法的名称、修饰符及其他信息
after() 方法使用了 @after注解,表示这是一个后置通知,该方法在目标方法执行之后执行
afterreturning() 方法使用了 @afterreturning 注解,表示这是一个返回通知,在该方法中可以获取目标方法的返回值。@afterreturning 注解中的 returning 参数表示与方法参数对应的返回值的变量名。注意,在方法参数中定义了 result 的类型为 object ,表示目标方法的返回值可以使任意类型,若 result 参数的类型为 long ,则该方法只能处理目标方法返回值为 long 的情况
afterthrowing() 方法使用了 @afterthrowing 注解,表示这是一个异常通知,即当目标方法发生异常时,该方法会被调用,异常类型为 exception 表示所有的异常都会进入该方法中执行,若异常类型为 arithmeticexception ,则表示只有目标方法抛出 arithmeticexception 异常时才会进入该方法处理
这段话的重写版本:使用 @around 注解的 around() 方法被称为环绕通知。环绕通知拥有所有通知中最为强大的功能,它可以实现前置通知、后置通知、异常通知以及返回通知。目标方法进入环绕通知后,通过调用 proceedingjoinpoint 对象的 proceed 方法使目标方法继续执行,开发者可以在此修改目标方法的执行参数、返回值等,并且可以在此处理目标方法的异常
配置完成后,接下来在controller 中创建接口,分别调用 userservice 中的两个方法,即可看到 logaspect 中的代码动态的嵌入目标方法中执行了,如下:
getuserbyid方法开始执行...
get...
getuserbyid方法返回值为:user
getuserbyid方法执行结束...
deleteuserbyid方法开始执行...
delete...
deleteuserbyid方法返回值为:null
deleteuserbyid方法执行结束...
其它自定义欢迎页spring boot 项目在启动后,首先会去静态资源路径下查找 index.html 作为首页文件,若查找不到,则会去查找动态的 index.html 作为首页文件。
例如,如果想使用静态的 index.html 页面作为项目的首页,只需在 resources/static 目录下创建 index.html 文件疾苦。若想使用动态页面作为项目首页,则需在 resources/templages 目录下创建 index.html (使用thymeleaf 模板) 或者 index.ftl(使用 freemarker 模板),然后在 controller 中返回逻辑视图名,如下:
@controllerpublic class indexcontroller { @requestmapping("/index") public string index(){ return "index"; }}
运行项目,输入"http://localhost:8081",查看结果
自定义 faviconfavicon.ico 是浏览器选项卡左上角的图标,可以放在静态资源路径下或者类路径下,静态资源路径下的 favicon.ico 优先级高于类路径下的 favicon.ico
可以使用在线转换网站:https://www.bitbug.net/ 将一张普通图片转为 .ico 图片,转换成功后,将文件重命名为 favicon.ico ,然后复制到 resources/static 目录下,如图
启动项目,查看效果
注意:清缓存,然后 ctrl+f5 强制刷新
除去某个自动配置spring boot 中提供了大量的自动化配置类,在 spring boot 的入口类上有一个 @springbootapplication 注解。该注解是一个组合注解,由 @springbootconfiguration、@enableautoconfiguration、@componentscan 组成,其中 @enableautoconfiguration 注解开启自动化配置,相关的自动化配置就会被使用。要移除某个自动化配置,开发者可以按照以下方法进行相应的配置更改
@springbootapplication@enableautoconfiguration(exclude = {errormvcautoconfiguration.class})public class chapter04application { public static void main(string[] args) { springapplication.run(chapter04application.class, args); }}
在 @enableautoconfiguration 注解中使用 exclude 属性去除 error 的自动化配置类,这时如果在 resources/static/error 目录下创建 4xx.htnl、5xx.html ,访问出错时就不会自动跳转了。由于 @enableautoconfiguration 注解的 exclude 属性值是一个数组,因此有多个要排除的自动化配置文件只需要继续添加即可。另外一种配置方法是在 application.properties 文件中进行配置,示例如下:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.errormvcautoconfiguration
添加前
添加后
以上就是springboot整合web之aop怎么配置的详细内容。