2016-11-04 2 views
0

Я пытаюсь использовать интеграцию Spring/AspectJ без везения. Весенняя версия 3.2.17 (да, немного старая, я знаю).Spring AspectJ Интеграция не работает

Вот моя соответствующая конфигурация:

pom.xml:

<!-- Spring dependencies, including spring-aspects --> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>1.7.4</version> 
    </dependency> 

    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId> 
     <version>1.7.4</version> 
    </dependency> 

applicationContext.xml:

<context:annotation-config/> 
<aop:aspectj-autoproxy /> 
<bean id="loggingAspect" class="com.jason.app.web.util.logging.LoggingAspect" />  

LoggingAspect.java (соответствующий класс):

@Aspect 
public class LoggingAspect { 

    private Logger log = LoggerFactory.getLogger(LoggingAspect.class); 


    /** 
    * Advice for before logging 
    * @param joinPoint 
    */ 
    @Before("execution(* com.jason.app.web.process..*(..))") 
    private void beforeAdvice(JoinPoint joinPoint) { 

     final String outputFormat = "intercept: executing method %s(%s)"; 
     final String method =joinPoint.getSignature().getName(); 

     List<?> argumentList = Collections.unmodifiableList(Arrays.asList(joinPoint.getArgs())); 
     final String formattedArguments = argumentList.stream().map(s -> s.toString()).collect(Collectors.joining(", ")); 

     log.debug(String.format(outputFormat, method, formattedArguments)); 

    } 
} 

Я наливаю nline tutorials, не повезло. Может ли кто-нибудь указать, что я сделал неправильно?

Джейсон

+0

Закрытие этого, потому что модераторы убедили себя, что я хотел использовать Spring-AOP, когда я пытался обсудить интеграцию Spring с AspectJ из-за ограничений Spring-AOP. Спасибо за штуку. – Jason

ответ

1

вы могли бы добавить еще одну зависимость

<dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aop</artifactId> 
      <version>${spring.version}</version> 
</dependency> 

попробовать, изменить разрез пункт

@Before("execution(* com.jason.app.web.process..*.*(..))") 

(означает совет будет применяться ко всем государственным методам, определенным в службе пакет или подпакет: com.jason.app.web.process)

+0

Все еще ничего. Должен ли я включить компиляцию во времени или использовать плагин aspectj maven? Моя проблема заключается в том, что у меня есть требование регистрировать запись и результаты всех вызовов метода, независимо от спецификатора доступа. Таким образом, Spring AOP не будет работать, поскольку он основан на прокси-сервере и может использовать только общедоступные методы. – Jason

+1

@ Джейсон, им нужно идти на чистый аспект. как вы сказали, весна может только перехватывать общественные методы check http://stackoverflow.com/q/23327336/410677 – kuhajeyan

+1

Вот почему я говорил AspectJ, а не Spring AOP. – Jason

0

изменить e Xpression к
@Before("execution(public * your.package.YourClass.yourMethod(..))")

2

Конфигурация Spring тег <aop:aspectj-autoproxy /> позволит проксите на основе АОП инфраструктуру Spring, которая относится только к весне бобы, и он делает это с помощью прокси-серверов со всеми ограничениями этого решения по сравнению с чистой AspectJ один.

Теперь, если вы хотите использовать AspectJ вместо Spring AOP, вам нужно будет выбрать между ткачеством во время компиляции или ткачеством во время загрузки. Если вы идете с ткачеством во время компиляции, вам нужно добавить aspectj-maven-plugin в свою сборку. Если вы выберете время загрузки, вам нужно запустить JVM с аргументом vm -javaagent:path/to/aspectjweaver.jar, как описано в AspectJ Documentation.

Если вам нужно сделать свой аспект пост-обработанным весной (автоуведомление и т. Д.), Вам нужно перечислить его в конфигурации Spring. Аспекты - это одиночные экземпляры, созданные за пределами Spring, поэтому вам нужно указать статический заводский метод aspectOf(), чтобы получить единственный экземпляр аспекта j, созданный средой выполнения AspectJ.

<bean id="loggingAspect" 
    class="com.jason.app.web.util.logging.LoggingAspect" 
    factory-method="aspectOf" 
/> 

или аннотированный путь:

@Configuration 
public class AspectConfig { 
    @Bean 
    public LoggingAspect loggingAspect() { 
     return LoggingAspect.aspectOf(); 
    } 
} 

Не забудьте удалить <aop:aspectj-autoproxy />, если вы не планируете использовать Spring AOP в дополнение к AspectJ. И почему вы решили сделать это, когда AspectJ будет намного мощнее?

+0

СПАСИБО. Похоже, что большинство уроков Spring/AspectJ оставили это. Spring AOP не удовлетворит мои потребности, так как мне нужно регистрировать вход и вывод всех методов, а не только публичных. – Jason

Смежные вопросы