AspectJ компилирует время компиляции, генерирует исключение BeanInstantiationException для пружинных компонентов с конструктором только аргумента
У меня есть аспект аспекта в проекте Maven: мой аспект проекта
@Aspect
public class LoggingAspect {
@Autowired
public MessageSource messageSource
@Pointcut("within(@Log *)")
public void executionOfAnyMethodInLogAnnotationClass(){}
@Before(value= "executionOfAnyMethodInLoggableAnnotationClass")
public void logBefore(JointPoint jp){
Logger.log(Level.info,messageSource.getMessage("before.log.message"),new String[] {
jp.getTarget().getClass().getSimpleName(),
jp.getSignature().getName(),
Arrays.deepToString(jp.getArgs())
});
}
}
Я использовал аспект j-maven-плагин для плетения времени компиляции в Maven, как показано ниже
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>${aspectj-maven-plugin-version}</version>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
<configuration>
<complianceLevel>${maven.compiler.source}</complianceLevel>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<showWeaveInfo>true</showWeaveInfo>
<forceAjcCompile>true</forceAjcCompile>
<verbose>true</verbose>
<Xlint>warning</Xlint>
<aspectLibraries>
<aspectLibrary>
<groupId>com.mycompany-myproject</groupId>
<artifactId>my-aspect-project</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
</execution>
</executions>
</plugin>
Аспект работает, как и ожидалось, и совет вызывается всякий раз, когда метод или класс помечены как @Log
называется.
Я использую приложение весенней загрузки, и не используется xml.
Я определил bean-компонент в моем Appconfig, как показано ниже, чтобы сделать пружину для установки зависимостей для аспекта, и это работает.
@Bean()
public LoggingAspect loggingAspect() {
LoggingAspect loggerAspect = Aspects.aspectOf(LoggingAspect.class);
loggerAspect.messageSource = messageSource;//Autowired in same class
return loggerAspect;
}
Но, если класс помечен @Log
который имеет конструктор аргумента затем spring, при запуске сервера генерирует исключение BeanCreationException для @Log
аннотированный класс
@Log
public class TypeBuilder {
TypeBuilder(EnumType type, String value) { ... }
public void build(){ ... }
}
Исключение:
Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mycompany.TypeBuilder]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.mycompany.TypeBuilder.<init>()
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1101)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.mycompany.Application.main(Application.java:22)