我有一个带有几个类、配置类和方面的 Spring Boot 应用程序,如下所示。下面的例子是为了说明我面临的问题。
我有办公室类,它具有打印机列表作为使用外部属性文件配置创建的依赖项。每当调用 Printer.getFilename 方法时,我想执行一个方面。如果我有打印机列表,它不会触发方面,但是当我有没有列表的单个打印机对象时它可以工作。
package com.example
public class Office {
private final List<Printer> printersList;
public Office(Printer printersList){
this.printersList = printersList;
}
public void printFiles(){
for(Printer printer: printersList)
printer.getFileName();
}
}
package com.example
public class Printer {
private deviceId;
public String getFileName(){
return "fileName";
}
}
@Configuration
public class ApplicationConfiguration{
@Bean
public Office office(){
List<Printer> printerList = new ArrayList<>();
// Adding to the list based on printer id based on some external property file configuration
printerList.add(new Printer());
printerList.add(new Printer());
return new Office(printerList);
}
}
@Aspect
@Component
public class PrinterFileNameAspect {
@Pointcut("execution(* com.example.Printer.getFileName())")
private void getFileNameJp() {}
@Around("getFileNameJp()")
public String returnFileName(ProceedingJoinPoint pjp) {
return "Modified File Name";
}
}
我发现 bean 列表没有在 Spring 容器中注册。因此我修改了配置类来注册bean
@Configuration
public class ApplicationConfiguration{
@Autowired
private GenericWebApplicationContext context;
@Bean
public Office office(){
List<Printer> printerList = new ArrayList<>();
// Adding to the list based on printer id
Printer colorPrinter = new Printer();
context.registerBean("colorPrinter", Printer.class, () -> colorPrinter);
printerList.add(colorPrinter);
Printer specialPrinter = new Printer();
context.registerBean("specialPrinter", Printer.class, () -> specialPrinter);
printerList.add(specialPrinter);
return new Office(printerList);
}
}
上述配置更改无济于事。我想我错过了spring aop的基础知识。我想用打印机列表实现spring aop,因为我无法更改列表生成逻辑(列表生成逻辑很复杂,必须是动态的)。