【问题标题】:AOP aspects in a multi-module Maven project多模块 Maven 项目中的 AOP 方面
【发布时间】:2016-08-20 15:07:23
【问题描述】:

我有一个多模块 Maven 项目,并在我的一个模块中配置了 Spring AOP。不幸的是,AOP 只适用于它所在的项目。这是我的 Maven 配置:

pom.xml

<parent>
    <artifactId>spring-boot-starter-parent</artifactId>
    <groupId>org.springframework.boot</groupId>
    <version>1.3.6.RELEASE</version>
</parent>

<modules>
    <module>rabbitmq</module>
    <module>rss_parser</module>
</modules>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

第一个模块(我的 AOP 配置所在的位置):

 <groupId>com.rss.rabbitmq</groupId>
<artifactId>rabbitmq</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>rabbitmq</name>

<parent>
    <groupId>gpw.radar.rss</groupId>
    <artifactId>parent-module</artifactId>
    <version>1.0</version>
</parent>

<properties>
    <java.version>1.8</java.version>
    <rss.parser.version>1.0-SNAPSHOT</rss.parser.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.rss.parser</groupId>
        <artifactId>rss-parser</artifactId>
        <version>${rss.parser.version}</version>
    </dependency>
</dependencies>

第二个模块(AOP 不起作用的地方):

<groupId>com.rss.parser</groupId>
<artifactId>rss-parser</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>rss_parser</name>
<url>http://maven.apache.org</url>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <junit.version>4.12</junit.version>
    <rometools.version>1.7.0</rometools.version>
    <jackson-datatype-jsr310.version>2.6.1</jackson-datatype-jsr310.version>
    <jackson-databind.version>2.6.6</jackson-databind.version>
</properties>

<parent>
    <groupId>gpw.radar.rss</groupId>
    <artifactId>parent-module</artifactId>
    <version>1.0</version>
</parent>

<dependencies>
    <dependency>
        <groupId>com.rometools</groupId>
        <artifactId>rome-fetcher</artifactId>
        <version>${rometools.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>${jackson-datatype-jsr310.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson-databind.version}</version>
    </dependency>
</dependencies>

最后是我在第一个模块中的 Spring AOP 配置:

@Pointcut("within(com.rss.rabbitmq.cron..*) || within(com.rss.rabbitmq.sender..*) || within(com.rss.parser..*)")
public void loggingPointcut() {
}

而我在这方面使用的是切入点:

@Around("loggingPointcut()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
    // <<implementation>>
}

经过一番挖掘,我知道如果我在类路径中有 myproject /jar 它应该可以正常工作,但在我的情况下它不起作用。第一个模块的 AOP,因此对于 "within(com.rss.rabbitmq.cron..*) || within(com.rss.rabbitmq.sender..*)",可以正常工作,但对于第二个项目则不能。

我还试图更改包名称,因为前几部分是相同的,我认为这可能会导致问题,但事实并非如此。

【问题讨论】:

    标签: java spring spring-boot aop spring-aop


    【解决方案1】:

    最后我发现问题出在哪里。来自 spring aop 文档:

    如果你只需要通知 Spring 上的操作执行 bean,那么 Spring AOP 是正确的选择。如果您需要建议 不受 Spring 容器管理的对象(例如域对象 通常),那么您将需要使用 AspectJ。

    由于我的第二个模块根本没有使用弹簧,我应该使用 AspetJ 而不是弹簧方面。

    【讨论】:

    • 没错。您应该使用AspectJ Maven Plugin 来编译和编织您的方面。该插件可以选择将其他模块的方面包含到您的普通 Java 模块中。
    【解决方案2】:

    父依赖没有正确继承,使用dependencyManagement。

    documentation here中解释的更清楚

    父 - pom.xml

    <parent>
      <artifactId>spring-boot-starter-parent</artifactId>
      <groupId>org.springframework.boot</groupId>
      <version>1.3.6.RELEASE</version>
    </parent>
    
    <modules>
      <module>rabbitmq</module>
      <module>rss_parser</module>
    </modules>
    
    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
      </dependencies>
    </dependencyManagement>
    
    <build>
      <pluginManagement>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </plugin>
        </plugins>
      </pluginManagement>
    </build>
    

    第一个模块 - pom.xml

    <groupId>com.rss.rabbitmq</groupId>
    <artifactId>rabbitmq</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>rabbitmq</name>
    
    <parent>
      <groupId>gpw.radar.rss</groupId>
      <artifactId>parent-module</artifactId>
      <version>1.0</version>
    </parent>
    
    <properties>
      <java.version>1.8</java.version>
      <rss.parser.version>1.0-SNAPSHOT</rss.parser.version>
    </properties>
    
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
      </dependency>
      <dependency>
        <groupId>com.rss.parser</groupId>
        <artifactId>rss-parser</artifactId>
        <version>${rss.parser.version}</version>
      </dependency>
    </dependencies>
    

    第二个模块 - pom.xml

    <groupId>com.rss.parser</groupId>
    <artifactId>rss-parser</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>rss_parser</name>
    <url>http://maven.apache.org</url>
    
    <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
      <junit.version>4.12</junit.version>
      <rometools.version>1.7.0</rometools.version>
      <jackson-datatype-jsr310.version>2.6.1</jackson-datatype-jsr310.version>
      <jackson-databind.version>2.6.6</jackson-databind.version>
    </properties>
    
    <parent>
      <groupId>gpw.radar.rss</groupId>
      <artifactId>parent-module</artifactId>
      <version>1.0</version>
    </parent>
    
    <dependencies>
      <dependency>
        <groupId>com.rometools</groupId>
        <artifactId>rome-fetcher</artifactId>
        <version>${rometools.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>${jackson-datatype-jsr310.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson-databind.version}</version>
      </dependency>
    </dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    

    【讨论】:

    • 它没有用。可能我错过了一些 spring aop 概念。我为模块1和模块2分别制作了项目。对于 module2 我做了 mvn install 然后我为 module1 运行 mvn package 但仍然 aop 对 modul2 不起作用。
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    相关资源
    最近更新 更多