2017-03-22 1 views
0

나는 아주 간단한 응용 프로그램에서 Spring의 AOP 기능을 최근에 시험해 보았고, propriet 시간에 메서드를 실행하는 데 막혔다. 즉, 메서드에서 정의 된 메서드가 메서드 다음에 실행되어야 함을 의미한다.Spring AOP aop : 일찍 실행 한 후

내 코드에서 정의 된 두 메소드 모두 main 메소드보다 먼저 실행되었습니다. 물론 그것은 정상적인 것이지만 후자의 것은 아닙니다.

예상 출력은 다음과 같아야합니다

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가 매개 변수로서 호출 16,

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