不确定出了什么问题,但是AOP似乎没有在弹簧启动(v1.1.6)的设置中工作。
@Configuration
@ComponentScan
@EnableJpaRepositories
@EnableTransactionManagement
@EnableAutoConfiguration
@EnableCaching
@EnableLoadTimeWeaving
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在方面类
中@Aspect
public class MyAspect {
@AfterReturning(pointcut = "execution(private * com.myapp.service.MyService.test(..)) && args(str1,str2)", argNames = "str1,str2")
public void advice(String str1, String str2) throws IOException {
System.out.println("Advising after returning");
}
}
在需要建议的服务类中
@Service
public class MyService {
public void test(String str1, String str2) throws IOException {
System.out.println("Test method in service");
//rest of the implementation
}
}
我也有像这样的META-INF / aop.xml
<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<weaver>
<!-- only weave classes in our application-specific packages -->
<include within="com.myapp.*"/>
</weaver>
<aspects>
<!-- weave in just this aspect -->
<aspect name="com.myapp.aspect.MyAspect"/>
</aspects>
</aspectj>
当我使用-javaagent运行应用程序时:path / to / spring-instrument-4.1.0.RELEASE.jar
我在控制台上收到此消息
2014-09-05 08:42:12.500 INFO 65053 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
[AppClassLoader@58644d46] warning javax.* types are not being woven because the weaver option '-Xset:weaveJavaxPackages=true' has not been specified
2014-09-05 08:42:13.114 INFO 65053 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2014-09-05 08:42:13.156 INFO 65053 --- [ main] o.s.b.a.e.jmx.EndpointMBeanExporter : Registering beans for JMX exposure on startup
[AppClassLoader@58644d46] error can't determine implemented interfaces of missing type org.springframework.security.config.http.SessionCreationPolicy
when weaving type org.springframework.boot.actuate.autoconfigure.ManagementServerProperties$Security
when weaving classes
when weaving
[Xlint:cantFindType]
[AppClassLoader@58644d46] error can't determine implemented interfaces of missing type org.springframework.security.config.http.SessionCreationPolicy
when weaving type org.springframework.boot.actuate.autoconfigure.ManagementServerProperties$Security
when weaving classes
when weaving
[Xlint:cantFindType]
虽然建议没有任何结果。它不会开火。
我做错了吗?
答案 0 :(得分:1)
我遇到了同样的问题。在我的情况下,我不得不使用注释@Component注释我的方面类。
@Aspect
@Component
public class MyAspect {
...
}
以下链接有一个帮助我的弹簧启动AOP示例
答案 1 :(得分:1)
在代码中添加以下更改,它应该可以工作。不需要创建aop.xml。这些更改会将外观添加到容器中并进行编织。
阅读-Enable Spring AOP or AspectJ
@Configuration
@ComponentScan
@EnableJpaRepositories
@EnableTransactionManagement
@EnableAutoConfiguration
@EnableCaching
@EnableAspectJAutoProxy -- Use this instead of @EnableLoadTimeWeaving
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Aspect
@Component/@Configurable -- Both of them work
public class MyAspect {
...
}
答案 2 :(得分:0)
为了建议私人方法,您需要使用 特权 方面:
public privileged aspect MyAspect {
// ...
}
限制:注释样式不支持特权方面。
所以请使用原生语法,而不是@AspectJ样式。但是,在您这样做之前,请测试非特权,注释样式方面是否按预期使用公共方法工作,以排除编辑方面的其他原因。