2017-03-22 10 views
0

最近、非常に単純なアプリケーションでSpringのAOP機能を試していましたが、メソッドの後に実行する必要があることを意味するpropriet時にメソッドを実行することに悩まされていますSpring AOP aop:早期実行後

私のコードでは、両方のメソッドが定義され、メインメソッドの前に実行されました。もちろんそれは普通ですが、後者では普通ではありません。

予想される出力は次のようになります。

HERE IS THE AOP BEFORE 

From App ran 5k 

HERE IS THE AOP After 

私の現在の出力は次のようになります。

HERE IS THE AOP BEFORE 

HERE IS THE AOP After 

From App ran 5k 

任意のアイデアなぜですか?

package main.java.springDemo; 

import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class App { 
public static void main(String[] args) { 

    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 

    Coach trackCoach = context.getBean("myTrackCoach", Coach.class); 

    System.out.println(" From App " + trackCoach.getDailyWorkout()); 


} 
} 

TrackerCoach.java

package main.java.springDemo; 

public class TrackCoach implements Coach { 
@Override 
public String getDailyWorkout() { 
    return "Go and run 5k"; 
} 
} 

SayAOP.java

package main.java.springDemo; 


public class SayAOP { 

    public void shoutAOPBefore() { 

    System.out.println("HERE IS THE AOP BEFORE"); 
} 

public void shoutAOPAfter(){ 

    System.out.println("HERE IS THE AOP After"); 
} 

} 
:アプリケーションと呼ばれる

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>springDemo</groupId> 
<artifactId>FirstSpringDemo</artifactId> 
<version>1.0-SNAPSHOT</version> 
<packaging>jar</packaging> 
<name>FirstSpringDemo</name> 
<url>http://maven.apache.org</url> 
<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 
<build> 
    <sourceDirectory>src</sourceDirectory> 
    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 
<dependencies> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.3.1.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aop</artifactId> 
     <version>4.3.1.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>4.3.1.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>4.3.1.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
    </dependency> 
    <dependency> 
     <groupId>cglib</groupId> 
     <artifactId>cglib</artifactId> 
     <version>2.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId> 
     <version>1.6.11</version> 
    </dependency> 
</dependencies> 
</project> 

私のメインクラス、:

のpom.xml trackCoach.getDailyWorkout()をするSystem.out.printlnパラメータとして呼ばれる

Coach.java

package main.java.springDemo; 

public interface Coach { 
    String getDailyWorkout(); 

} 

applicationContext.xmlを

<?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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> 

<!-- Define your beans here --> 


<aop:config> 

    <aop:aspect id="aop" ref="SayAOP"> 

     <aop:pointcut id="pid" expression="execution(* main.java.springDemo.Coach.getDailyWorkout(..))"/> 

     <aop:before pointcut-ref="pid" method="shoutAOPBefore"/> 
     <aop:after pointcut-ref="pid" method="shoutAOPAfter"/> 
    </aop:aspect> 

</aop:config> 

<bean id="myTrackCoach" 
     class="main.java.springDemo.TrackCoach"> 

</bean> 

<bean id="SayAOP" 
     class="main.java.springDemo.SayAOP"> 
</bean> 

</beans> 

答えて

2

厥ので、そうする前に最初に呼び出され、その後trackCoach.getDailyWorkout()をafter、System.outが最後になります。 たとえば、次のように試してみてください。

public class TrackCoach implements Coach { 
    @Override 
    public String getDailyWorkout() { 
     System.out.println("Go and run 5k"); 
     return "Go and run 5k"; 
    } 
} 

あなたは何が起こるか見るでしょう。

+1

ありがとうWojtek、それは問題でした!私は受け入れたが、私はあなたが15名の評判に達するまで、あなたが答えることを傾けることはできません、申し訳ありません! – Z3d4s

関連する問題