#java #spring #annotations #aop #aspectj
#java #spring #аннотации #aop #aspectj
Вопрос:
Я создал аспект, но, похоже, он не работает, я ничего не вижу в журнале, также в журнале нет сообщений об ошибках или чего-либо еще, что помогло бы мне.
Spring автоматически подключает репозиторий к другому компоненту, который работает так, что сканирование компонентов работает. Аспект находится внутри сканируемого пакета. У меня есть aspectj в пути к классу.
Аспект:
@Aspect
@Component
public class LoggingAspect {
private static Logger logger = Logger.getLogger(LoggingAspect.class);
@Before("execution(* nl.bar.repository.*.*(..))")
public void logIt(JoinPoint joinPoint) {
logger.debug("WE'RE LOGGING IT!!!!");
}
}
Компонент Spring:
package nl.bar.repository
@Component
public class BarRepository {
public List<Bar> findBar() {
....
}
}
ApplicationContext:
<context:annotation-config />
<context:component-scan base-package="nl.bar" />
<aop:aspectj-autoproxy/>
Maven:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
Ответ №1:
Вы, должно быть, не учитываете некоторые из ваших зависимостей Maven, потому что без spring-context
код не должен компилироваться. Добавляя spring-context
, код работает как есть.
Вот мое предположение относительно того, что не так: уровень ведения журнала для вашего пакета / класса aspect не установлен на debug.
Вот моя версия и некоторые успешные результаты, практически без изменений:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
applicationContext.xml
Файл остается неизменным, как и Java, за исключением того, что мой класс репозитория просто:
@Component("repo")
public class BarRepository implements Repo {
public String findBar() {
return "Hello!";
}
}
Проверка работоспособности main
следующим образом:
public static void main(String[] args) {
LOG.debug("Initializing context...");
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
LOG.debug("Retrieving bean...");
Repo repo = (Repo) context.getBean("repo");
LOG.debug("Calling bean...");
System.out.println(repo.findBar());
}
Я получаю следующий вывод с org.springframework.aop
регистрацией в DEBUG
и моим классом aspect в INFO
:
DEBUG nl.main.Main - Initializing context...
INFO org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1125127: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1125127]; startup date [Sat Nov 12 16:39:45 EST 2011]; root of context hierarchy
INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
INFO org.springframework.context.support.ClassPathXmlApplicationContext - Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@1125127]: org.springframework.beans.factory.support.DefaultListableBeanFactory@89cc5e
INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@89cc5e: defining beans [org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,repo,loggingAspect,org.springframework.aop.config.internalAutoProxyCreator]; root of factory hierarchy
DEBUG org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory - Found AspectJ method: public void nl.bar.aspects.LoggingAspect.logIt(org.aspectj.lang.JoinPoint)
DEBUG org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator - Creating implicit proxy for bean 'repo' with 0 common interceptors and 2 specific interceptors
DEBUG org.springframework.aop.framework.JdkDynamicAopProxy - Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [nl.bar.repository.BarRepository@1dec1dd]
DEBUG nl.main.Main - Retrieving bean...
DEBUG nl.main.Main - Calling bean...
INFO nl.bar.aspects.LoggingAspect - WE'RE LOGGING IT!!!!
Hello!
Держу пари, что это либо проблема на уровне журнала, либо это не компиляция, как вы думаете, потому что она должна работать так, как написано.