Spring AOP не работает в веб-приложении на Tomcat 8 - PullRequest
0 голосов
/ 30 апреля 2018

Я хочу использовать Spring AOP для некоторых вещей в моем приложении. Я уже использовал AOP в отдельном приложении, и оно работало, но теперь с веб-приложением на коте оно не работает.

У меня есть приложение-ядро и приложение-веб-проект, где в основном проекте происходит вся логика, а веб-проект содержит только веб-материалы.

Сначала я попытался добавить свой класс LoggingAspect в свой основной проект, так как это не сработало, но теперь я переместил его в веб-проект, но там он не работает.

Вот мое applicationContext.xml, которое находится в папке: / application-web / src / main / webapp

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd">

        <!-- Add AspectJ autoproxy support for AOP -->
        <aop:aspectj-autoproxy/>


        <!-- Step 3: Add support for component scanning -->
        <context:component-scan base-package="my.foobar"/>

        <!-- Step 4: Add support for conversion, formatting and validation support -->
        <mvc:annotation-driven/>

        <!-- Step 5: Define Spring MVC view resolver -->
        <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/view/" />
            <property name="suffix" value=".jsp" />
        </bean>
    </beans>

И это мой класс LoggingAspect, который сейчас находится здесь: application-web / src / main / my.foobar.web / aspect / LoggingAspect

    @Aspect
    @Order(1)
    public class LoggingAspect {
        private static final LogHandler LOG = LogHandler.getLogger(LoggingAspect.class);

        @Pointcut("execution(* my.foobar.*.*.*(..))")
        private void completePackage(){}

        @Pointcut("execution(* my.foobar.*.*.get*(..))")
        private void getterMethods(){}

        @Pointcut("execution(* my.foobar.*.*.set*(..))")
        private void setterMethods(){}

        @Pointcut("completePackage() && !(getterMethods() || setterMethods())")
        private void allMethodsExceptGetterAndSetter(){}

        @Around("completePackage()")
        private Object aroundMethod(ProceedingJoinPoint theProceedingJointPoint) throws Throwable{
            LOG.info("around method");
            String method = theProceedingJointPoint.getSignature().getName();
            Object[] arguments = theProceedingJointPoint.getArgs();

            LOG.info("method call: {0}", method);                
            for(Object arg: arguments){
                LOG.info("argument[{0}]", arg);
            }

            Object result = theProceedingJointPoint.proceed();
            return result;
        }

    }

Я также добавил класс в свой веб-проект приложения

@Configurable
@EnableAspectJAutoProxy
@ComponentScan("my.foobar")
public class ApplicationWebAppConfig {

}

Я ожидаю, что каждый вызываемый метод будет регистрироваться, но этого не происходит.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Аль Фаба писал (а):

Кажется, я понял свою проблему. Я думал, что смогу использовать только spring-aop как отдельную функцию в своем приложении. Я добавлял несколько страниц JSP и использовал для этого первый раз spring-mvc, и во время этого я увидел spring-aop и подумал, почему бы не использовать это для некоторых дополнительных измерений моих методов. Мой пример автономного приложения работал очень хорошо, поэтому я попытался адаптировать его к своему существующему приложению. Но здесь начинается проблема, методы , которые я хочу измерить, не связаны с пружиной , так как отправлено с kriegaex здесь это не рабочий.

Да, Spring использует динамические прокси-серверы (по умолчанию прокси-серверы JDK для классов, реализующих интерфейсы, прокси-серверы CGLIB для классов, не реализующих интерфейсы), и эти прокси-серверы работают только с компонентами Spring, потому что Spring связывает прокси-серверы только при подключении приложения. Однако AspectJ вплетается непосредственно в байт-код исходного класса и может применяться также и к классам, отличным от Spring, если они еще не загружены при активации AspectJ (например, классы JRE).

Мое решение немного разочаровывает. Я остановил свою ветвь функций на этом этапе, потому что в настоящее время она требует больших усилий для ее решения, поскольку я читаю и вы отвечаете, что мне нужно переключиться на AspectJ через LTW.

Что ж, если ваше приложение уже работает, если вы все сделаете правильно, вам потребуется всего несколько минут, чтобы изменить конфигурацию с Spring AOP на AspectJ, как описано в руководстве по Spring . Я призываю вас попробовать, это действительно не так сложно. Удачи.

0 голосов
/ 01 мая 2018

Кажется, я понял свою проблему. Я думал, что смогу использовать только spring-aop как отдельную функцию в своем приложении. Я добавлял несколько страниц JSP и использовал для этого первый раз spring-mvc, и во время этого я увидел spring-aop и подумал, почему бы не использовать это для некоторых дополнительных измерений моих методов. Мой пример автономного приложения работал очень хорошо, поэтому я попытался адаптировать его к своему существующему приложению. Но здесь начинается проблема, методы, которые я хочу измерить, не связаны с пружиной, так как они опубликованы здесь на @kriegaex здесь Spring AOP для компонента без пружины это не работает

...