2017-10-28 89 views
0

我需要实现内部类的拦截器,外部类是由Spring如何拦截在Spring托管bean中定义的内部非弹簧类的方法执行?

@Component 
@Scope("prototype") 
public class Outer { 

    protected class Inner { 

     protected void methodToIntercept() { 
     } 

    } 

} 

Outer.Inner.class管理可能有孩子的(匿名为好)。重写methodToIntercept()应该被拦截以及

文档是非常简单的: https://docs.spring.io/spring/docs/3.2.0.RELEASE/spring-framework-reference/htmlsingle/#aop-aj-ltw

根据我的文档配置方式如下的一切:

项目结构

-src 
--main 
---java 
----temp 
-----Config.java 
-----MyAspect.java 
-----Outer.java 
-----SpringBean.java 
--test 
---resources 
----META-INF 
-----aop.xml 

aop.xml文件

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 
<aspectj> 
    <weaver> 
     <include within="temp.*"/> 
    </weaver> 
    <aspects> 
     <aspect name="temp.MyAspect"/> 
    </aspects> 
</aspectj> 

Config.java

@Configuration 
@EnableLoadTimeWeaving 
@ComponentScan("temp") 
@Lazy 
public class Config { 
} 

Outer.java

@Component 
@Scope("prototype") 
public class Outer { 

    @Component 
    public static class Inner { 

     public void methodToIntercept() { 
     } 

    } 

} 

MyAspect.java

@Aspect 
@Component 
public class MyAspect { 

    @Autowired 
    private SpringBean springBean; 

    @Around("execution(* temp.Outer.Inner.methodToIntercept())") 
    public Object interceptor(ProceedingJoinPoint joinPoint) throws Throwable { 
     System.out.println("success"); 
     return joinPoint.proceed(); 
    } 

} 

依赖

<dependencies> 
     <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt --> 
     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjrt</artifactId> 
      <version>1.7.3</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>4.3.12.RELEASE</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aop</artifactId> 
      <version>4.3.12.RELEASE</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/aspectj/aspectjweaver --> 
     <dependency> 
      <groupId>aspectj</groupId> 
      <artifactId>aspectjweaver</artifactId> 
      <version>1.7.3</version> 
     </dependency> 
     <!-- https://mvnrepository.com/artifact/org.springframework/spring-instrument --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-instrument</artifactId> 
      <version>4.3.12.RELEASE</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aspects</artifactId> 
      <version>4.3.12.RELEASE</version> 
     </dependency> 

    </dependencies> 

,因为我希望它不工作不幸的是

它应该与这样的配置?我错过了什么?

谢谢

回答

0

尝试创建自定义注释并注释该方法。

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface ServiceLoggable { 
} 

@Around将这个样子

@Around("execution(* *(..)) && @annotation(com.company.core.log.ServiceLoggable)") 
    public Object logServiceMethods(ProceedingJoinPoint jp) throws Throwable { 
     ...  
    }