问题:
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
原因:
在使用aop的时候,书写execution出现错误
@Pointcut("execution(public * *(..))")
package com.example.demo.aopdemo;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class MyAopTest {
@Pointcut("execution(public * *(..))")
public void startaop(){};
@Before("startaop()")
private void beforhello()
{
System.out.printf("before ---hello");
}
@After("startaop()")
private void afterHello()
{
System.out.printf("after ---hello");
}
}
修改之后就变成了 (按道理我之前使用 execution(public * *(..)) 也应该没得啥问题)
@Pointcut("execution(public * com.example.demo.Controller..*.*(..))")
为此回顾的了一下execution 的用法
1 模式介绍
Execution(<修饰符模式(public private protected>?<返回类型模式 void string int><方法名模式com.test.Hello.sayhello>(<参数模式>)<异常模式>?) 除了返回类型模式 方法名参数和参数模式 外,其他项都是可以选择的。
这是匹配所有public 类型的方法
execution(public * *(..))
匹配所有以set结尾的连接点
execution(* set*(..))
匹配AccountServivce 接口的所有方法
Execution(* com.xyz.service.AccountService.*(..))
匹配service包中所有的方法
Execution(* com.xyz.service..(..))
匹配service包及其子包中得所有方法
Execution(* com.xyz.service…(..))
匹配joke(String,int)方法且joke方法的第一个入参是String ,第二个入参是int
Execution(* joke(String,int))
匹配目标类中joke方法,该方法第一个参数为String 后面可以有任意个入参且入参类型不限 joke(String s1),joke(String s1,String s2) joke(String s1,String s2,String s3)
Execution(* joke(String,..))
2 使用aop,这里使用javaconfig来实现
Controller
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UseController {
@RequestMapping("/esProduct")
public void aopbefor()
{
System.out.println("11111111111111");
}
}
切面java
package com.example.demo.aopdemo;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class MyAopTest {
@Pointcut("execution(public * com.example.demo.Controller..*.*(..))")
public void startaop(){};
@Before("startaop()")
private void beforhello()
{
System.out.printf("before ---hello");
}
@After("startaop()")
private void afterHello()
{
System.out.printf("after ---hello");
}
}
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
实现效果:
注意:在之前的spring mvc 使用的时候,需要使用@EnableAutoProxy 注解开启aspectj自动注解 ,同时需要将aspect java类添加到容器中(@Bean,而Springboot使用的是@Component注解)
如果springmvc使用的xml的话需要
<aop:aspectj-proxy>
<bean class=“com.test.aoptest”>