因此,我开始学习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());
}
}
我还有一个班级学生,看起来像这样
@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();
}
}
主类看起来像这样
@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类看起来像这样
@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>
我的输出:
年龄:24
姓名:Tilak raj
引发异常线程“主”中的异常
java.lang.IllegalArgumentException在
com.tilak.aop.Student.printThrowException(Student.java:33)在
com.tilak.aop.MainApp.main(MainApp.java:24)
我认为我已经包括了进行此运行所需的所有依赖关系,但我没有得到预期的输出。
咨询应该运行,但不是。我在这里想念什么?
更新:
最佳答案
您在main
方法中的代码做错了事。 SpringApplication.run(MainApp.class, z);
已经返回了一个ApplicationContext
,您正在重新构造它,并且仅使用部分配置。缺少的部分是没有启用AspectJ的事实。
但是,当您重新加载已经加载的上下文时,请不要这样做,以适当的方式使用Spring Boot。
@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
包中类的所有方法的例外。由于您的班级在不匹配的com.tilak.aop
包中。使用
execution(* com.tilak..*.*(..))` or
execution(* com.tilak.aop ..(..))either will work. The first includes sub packages due to the
..`另一个使用完整软件包。但是,这样做会导致另一个问题,方面也将创建适用于自身的内容(启动应用程序时会注意到这一点)。因此,您想将其限制为
Student
类或排除使用@Aspect
注释的类。要进行测试,可以将
execution(* com.tilak.aop.Student.*(..))
用作切入点,因为它将仅匹配Student
类,而不匹配方面。关于java - AspectJ无法运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52163816/