要介紹一個面向切面變成(Aspect-Oriented Programming,AOP),需要先考慮一個這樣的場景:公司有一個人力資源管理系統目前已經上線,但是系統運作不穩定,有時運作的很慢,為了偵測到底是哪個環節出現問題了,開發人員想要監控每一個方法執行的時間,再根據這些執行時間判斷出問題所在。當問題解決後,再把這些監控移除掉。系統目前已經運行,如果手動修改系統成千上萬個方法,工作量太大,而且這些監控方法以後還要移除掉;如果能夠在系統運行過程中動態添加程式碼,就能很好的解決問題。面向切面編程(AOP)是一種動態添加程式碼到系統運行時的方式。 Spring Boot 對 AOP 提供了很好的支援。在 AOP 中,有一些常見的概念需要了解:
連接點是指類別中可以被增強的方法。例如,想要修改那個方法的功能,那麼該方法就是一個連接點
切入點(Pointcut)是指定義對連接點(Joinpoint)進行攔截的操作。這個定義是指攔截所有以 insert 開始的方法作為切入點
在攔截到 Joinpoint 之後,要執行的操作是發送通知。例如,之前說到的列印日誌監控。通知分為前置通知、後置通知、例外通知、最終通知、環繞通知
Aspect(切面):Pointcut 與Advice 的組合
<!-- AOP 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>然後在com.sang.aop.service 包下創建UserService 類,如下:
@Service public class UserService { public String getUserById(Integer id){ System.out.println("get..."); return "user"; } public void deleteUserById(Integer id){ System.out.println("delete..."); } }然後創建切面,如下:
@Component @Aspect public 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(); } }程式碼解釋:
get...getUserById方法傳回值為:user
其它
getUserById方法執行結束...
deleteUserById方法開始執行...
delete...
deleteUserById方法傳回值為:null
deleteUserById方法執行結束...
例如,如果想使用静态的 index.html 页面作为项目的首页,只需在 resources/static 目录下创建 index.html 文件疾苦。若想使用动态页面作为项目首页,则需在 resources/templages 目录下创建 index.html (使用Thymeleaf 模板) 或者 index.ftl(使用 FreeMarker 模板),然后在 Controller 中返回逻辑视图名,如下:
@Controller public class IndexController { @RequestMapping("/index") public String index(){ return "index"; } }
运行项目,输入"http://localhost:8081",查看结果
favicon.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怎麼配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!