问题:
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 的用法
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,..))
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文件
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.4.2
com.example
demo
0.0.1-SNAPSHOT
demo
Demo project for Spring Boot
11
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-aop
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
实现效果:
注意:在之前的spring mvc 使用的时候,需要使用@EnableAutoProxy 注解开启aspectj自动注解 ,同时需要将aspect java类添加到容器中(@Bean,而Springboot使用的是@Component注解)
如果springmvc使用的xml的话需要