AspectJ 不会 运行
AspectJ won't run
所以,我开始学习 spring boot 并且遇到了 AOP。
我给自己做了一个看起来像这样的相位
@Aspect
public class Logging {
@Pointcut("execution(* com.tilak.*.*(..))")
private void selectAll(){}
@Before("selectAll()")
private void beforeAdvice(){
System.out.println("Going to set up student profile");
}
@After("selectAll()")
private void afterAdvice(){
System.out.println("student profile has been set.");
}
@AfterReturning(pointcut = "selectAll()" , returning = "retVal")
private void afterReturningAdvice(Object retVal){
System.out.println("Returning: "+ retVal.toString());
}
@AfterThrowing(pointcut = "selectAll()" , throwing = "ex")
private void afterThrowingAdvice(IllegalArgumentException ex){
System.out.println("There has been an exception: " + ex.toString());
}
}
我还有一个 class 学生 看起来像这样
@Component
public class Student {
private Integer age;
private String game;
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGame() {
System.out.println("Name : " + game);
return game;
}
public void setGame(String game) {
this.game = game;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
主要 Class 看起来像这样
@SpringBootApplication
public class MainApp {
public static void main(String... z) {
SpringApplication.run(MainApp.class, z);
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanMe.class);
Student student = (Student) applicationContext.getBean("student");
student.getAge();
student.getGame();
student.printThrowException();
}
}
Bean class 看起来像这样
@Configuration
public class BeanMe {
@Bean(name = "student")
public Student studentBean(){
Student student = new Student();
student.setAge(24);
student.setGame("Tilak raj");
return student;
}
@Bean("logging")
public Logging loggingBean(){
return new Logging();
}
}
Pom 文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springbootexample</groupId>
<artifactId>firstspringboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<game>firstspringboot</game>
<description>Practise project for spring boot
</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-data-jpa</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-aop</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>
我的输出:
Age : 24
Name : Tilak raj
Exception raised Exception in thread "main"
java.lang.IllegalArgumentException at
com.tilak.aop.Student.printThrowException(Student.java:33) at
com.tilak.aop.MainApp.main(MainApp.java:24)
我想我已经包含了制作这个 运行 所需的所有依赖项,但我没有得到预期的输出。
建议应该 运行,但事实并非如此。我在这里错过了什么?
更新:
您在 main
方法中的代码执行了错误的操作。 SpringApplication.run(MainApp.class, z);
已经 returns 和 ApplicationContext
您正在再次构建它并且仅使用您的配置的一部分。缺少的部分是它没有启用 aspectj。
然而,当你重新加载一个已经加载的上下文时不要这样做,使用 Spring 以正确的方式启动。
@SpringBootApplication
public class MainApp {
public static void main(String... z) {
ApplicationContext ctx = SpringApplication.run(MainApp.class, z);
Student student = ctx.getBean("student", Student.class);
student.getAge();
student.getGame();
student.printThrowException();
}
}
这将加载应用程序、检索 bean 并调用方法。
其次你的切入点表达式也是错误的。 execution(* com.tilak.*.*(..))
表示com.tilak
包中classes的所有方法除外。由于您的 classes 在不匹配的 com.tilak.aop
包中。
使用 execution(* com.tilak..*.*(..))` or
execution(* com.tilak.aop..(..))either will work. The first includes sub packages due to the
..` 另一个使用全包。
但是这样做会导致另一个问题,该方面也会创建适用于自身(您会在启动应用程序时注意到这一点)。因此,您想将其限制为 Student
class 或排除使用 @Aspect
注释的 classes。
要进行测试,您可以使用 execution(* com.tilak.aop.Student.*(..))
作为切入点,因为它将仅匹配 Student
class 而不是方面。
所以,我开始学习 spring boot 并且遇到了 AOP。
我给自己做了一个看起来像这样的相位
@Aspect
public class Logging {
@Pointcut("execution(* com.tilak.*.*(..))")
private void selectAll(){}
@Before("selectAll()")
private void beforeAdvice(){
System.out.println("Going to set up student profile");
}
@After("selectAll()")
private void afterAdvice(){
System.out.println("student profile has been set.");
}
@AfterReturning(pointcut = "selectAll()" , returning = "retVal")
private void afterReturningAdvice(Object retVal){
System.out.println("Returning: "+ retVal.toString());
}
@AfterThrowing(pointcut = "selectAll()" , throwing = "ex")
private void afterThrowingAdvice(IllegalArgumentException ex){
System.out.println("There has been an exception: " + ex.toString());
}
}
我还有一个 class 学生 看起来像这样
@Component
public class Student {
private Integer age;
private String game;
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGame() {
System.out.println("Name : " + game);
return game;
}
public void setGame(String game) {
this.game = game;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
主要 Class 看起来像这样
@SpringBootApplication
public class MainApp {
public static void main(String... z) {
SpringApplication.run(MainApp.class, z);
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanMe.class);
Student student = (Student) applicationContext.getBean("student");
student.getAge();
student.getGame();
student.printThrowException();
}
}
Bean class 看起来像这样
@Configuration
public class BeanMe {
@Bean(name = "student")
public Student studentBean(){
Student student = new Student();
student.setAge(24);
student.setGame("Tilak raj");
return student;
}
@Bean("logging")
public Logging loggingBean(){
return new Logging();
}
}
Pom 文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springbootexample</groupId>
<artifactId>firstspringboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<game>firstspringboot</game>
<description>Practise project for spring boot
</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-data-jpa</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-aop</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>
我的输出:
Age : 24 Name : Tilak raj Exception raised Exception in thread "main" java.lang.IllegalArgumentException at com.tilak.aop.Student.printThrowException(Student.java:33) at com.tilak.aop.MainApp.main(MainApp.java:24)
我想我已经包含了制作这个 运行 所需的所有依赖项,但我没有得到预期的输出。
建议应该 运行,但事实并非如此。我在这里错过了什么?
更新:
您在 main
方法中的代码执行了错误的操作。 SpringApplication.run(MainApp.class, z);
已经 returns 和 ApplicationContext
您正在再次构建它并且仅使用您的配置的一部分。缺少的部分是它没有启用 aspectj。
然而,当你重新加载一个已经加载的上下文时不要这样做,使用 Spring 以正确的方式启动。
@SpringBootApplication
public class MainApp {
public static void main(String... z) {
ApplicationContext ctx = SpringApplication.run(MainApp.class, z);
Student student = ctx.getBean("student", Student.class);
student.getAge();
student.getGame();
student.printThrowException();
}
}
这将加载应用程序、检索 bean 并调用方法。
其次你的切入点表达式也是错误的。 execution(* com.tilak.*.*(..))
表示com.tilak
包中classes的所有方法除外。由于您的 classes 在不匹配的 com.tilak.aop
包中。
使用 execution(* com.tilak..*.*(..))` or
execution(* com.tilak.aop..(..))either will work. The first includes sub packages due to the
..` 另一个使用全包。
但是这样做会导致另一个问题,该方面也会创建适用于自身(您会在启动应用程序时注意到这一点)。因此,您想将其限制为 Student
class 或排除使用 @Aspect
注释的 classes。
要进行测试,您可以使用 execution(* com.tilak.aop.Student.*(..))
作为切入点,因为它将仅匹配 Student
class 而不是方面。