У меня есть приложение весенней загрузки с парой классов, классом конфигурации и аспектом, как показано ниже. Приведенный ниже пример иллюстрирует проблему, с которой я столкнулся.
У меня есть офисный класс, в котором есть список принтеров в качестве зависимости, созданной с использованием конфигурации внешнего файла свойств. Я хотел бы выполнять аспект всякий раз, когда вызывается метод Printer.getFilename. Это не запускает аспект Если у меня есть список принтеров, но он работает, когда у меня есть один объект Printer без списка.
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";
}
}
Я обнаружил, что список beans не зарегистрирован в контейнере 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 со списком принтеров, так как я не могу изменить logi генерации списка c (logi генерации списка c сложный и должен быть динамическим c).