2

AOP を使用してプロジェクトにログインしたいと考えています。クラスのメソッドがその内部で同じクラスの別のメソッドを呼び出していた場合、プロキシの方法が原因でその呼び出しで AOP が機能しないという問題に直面しています。それに対抗するために、aspectj maven プラグインを使用してコンパイル時の織り方を試みています。私の最上位プロジェクト pom は次のようになります。

<dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.1</version>
        </dependency>
 </dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.7</version>
            <configuration>
                <complianceLevel>1.7</complianceLevel>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

私は 6 つのサブ プロジェクトを持っていますが、そのうちの 1 つだけで AOP ベースのログを作成したいと考えています。そのプロジェクトの pom は次のようになります。

<dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.1.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.1</version>
    </dependency>

<build>
    <plugins>           
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
        </plugin>           
    </plugins>
</build>

これで問題は解決すると思いますが、まだプロキシベースのメソッド呼び出しを行っています。他に何をする必要がありますか?

編集: Spring context.xml ファイル:

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

<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

<!--  Allow proxys -->
<!-- <aop:aspectj-autoproxy />  -->

<context:component-scan base-package="com.relevant.package" ></context:component-scan>
   </beans:beans>

LoggingAspect.java

@Named
@Aspect
public class LoggingAspect {

@Before("execution(public * com.relevant.package.*.process(..))")
public void beforeProcessAdvice() {
    System.out.println("AOP");
    System.out.println("Before");

    }

@Before("execution(public * com.relevant.package.*.internalMethod(..))")
public void beforeProcessAdvice() {
    System.out.println("Internal");
    System.out.println("Method");

    }
}

ターゲット ファイルには、次のようなプロセス メソッドがあります。

process() {
internalMethod();
}

autoproxy 部分にコメントしたので、プロキシを使用しないと言っています。ただし、ログは表示されません (プロセス メソッドが呼び出されたときも、internalMethod が呼び出されたときも)。autoproxy がオンの場合、process メソッドのログは表示されますが、internalMethod のログは表示されません。これは理解できます。

4

1 に答える 1