Java + Spring + Maven — реализация AspectJ вместо SpringAOP

Приложение Java + Spring + Maven:

Может ли кто-нибудь предоставить мне ссылку или посоветовать чистую реализацию AspectJ без Spring AOP на основе прокси?

Мое приложение основано исключительно на Spring + Maven. В настоящее время я реализовал аспекты с Spring AOP, которые не решают мои проблемы.

Если я попытаюсь получить доступ к private method2() из public method1() в том же class A, это не поддерживается.

Я хотел бы знать: 1) Как написать аспект с pointcut, который поддерживает вызовы внутриклассовых методов? 2) Как настроить это в моем текущем проекте Spring, maven с переплетением времени загрузки AspectJ? 3) как настроить плагин AspectJ Maven для плетения во время компиляции на сервере Tomcat + eclipse.

@Controller
class A {
    public void method1() {
        method2("foo");
    }

    private String method2(String text) {
        return text;
    }
}

Ожидаемый результат:

log.entering(method1)
log.entering(method2)
print abc
log.exiting(method2)
log.exiting(method1)

person Chuck    schedule 28.10.2014    source источник
comment
Не понятно что не работает. Добавьте больше деталей к своему вопросу (например, аспекты).   -  person Aleksandr M    schedule 28.10.2014
comment
Я отредактировал вопрос, чтобы сделать его несколько понятным. Понятно, что Spring AOP не работает с вызовами методов внутри класса, независимо от того, является ли целевой метод общедоступным или закрытым, потому что они не маршрутизируются через динамический прокси. Пока так и есть. Верно и то, что нативный AspectJ решит вашу проблему. Но что вы хотите знать? Как написать аспект с pointcut и советом? Или как настроить Spring для использования плетения AspectJ во время загрузки? Или как настроить плагин AspectJ Maven для плетения во время компиляции? Пожалуйста, обновите вопрос.   -  person kriegaex    schedule 29.10.2014
comment
Я хотел бы знать: 1) Как написать аспект с pointcut, который поддерживает вызовы внутриклассовых методов? 2) Как настроить это в моем текущем проекте Spring, maven с переплетением времени загрузки AspectJ? 3) как настроить плагин AspectJ Maven для плетения во время компиляции на сервере Tomcat + eclipse.   -  person Chuck    schedule 29.10.2014


Ответы (2)


Я рекомендую вам создать фиктивный проект с помощью Spring Roo (чтобы вы могли видеть, как выглядят файлы Maven pom.xml и Spring applicationContext.xml) и загрузить версию Eclipse Spring STS, в которой правильно настроен AspectJ.

person Adam Gent    schedule 29.10.2014

Вы можете использовать проект Maven и AspectJ вместе, преобразовав проект Maven в проект AspectJ, щелкнув правой кнопкой мыши - Конфигурация - Преобразовать в проект AspectJ. Оттуда вы можете создать класс Aspect без аннотации или класс Java Aspect с использованием аннотации.

Что касается результата, который вы хотите, вы можете использовать метод Around, как показано ниже:

    @Around("execution ( * A.method1(..))")
    public void captureMethodOne(ProceedingJoinPoint joinPoint) throws Throwable{
    System.out.println("log.entering(method1)");
    joinPoint.proceed();
    System.out.println("log.exiting(method1)");
    }

Также не забудьте ввести в pom.xml плагины aspectj и aspectj maven, например

<properties>
    <maven.compiler.plugin.version>3.5.1</maven.compiler.plugin.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.7</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.8</version>
    </dependency>
</dependencies>


<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.8</version>
            <configuration>
                <complianceLevel>1.8</complianceLevel>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.plugin.version}</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

    </plugins>
</build>

Надеюсь, поможет. PS Сначала проверьте учебник AspectJ, много в Интернете.

person Ihsan Haikal    schedule 29.03.2016