我在IDEA中设置了一个新的Spring App(不是spring boot),并手动下载Aspectjweaver, 编写以下代码练习aop。
根配置类为:
@Configuration
/*@EnableAspectJAutoProxy*/
@ComponentScan
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext();
ctx.register(Main.class);
ctx.refresh();
Performance performance=ctx.getBean(WoodStock.class);
//System.out.println(ctx.getBean(Audience.class));
performance.performance();
}
}
,项目布局为:
+com.dawn.www
-Main.java
+aspect
-Audience.java
+music
-Performance.java
-WoodStock.java
我希望Audience
是WoodStock
的一个方面(在春天看到它的作用)
@Aspect
@Component
public class Audience {
@Before("execution(* com.dawn.www.music.Performance.performance(..))")
public void silenceCellPhones(){
System.out.println("-----------Silencing cell phones");
}
}
Performance
是一个简单的界面,由WoodStock
public interface Performance {
void performance();
}
@Component
public class WoodStock implements Performance{
@Override
public void performance() {
System.out.println("WoodStock Performance start,singer singing+++++");
}
}
@ComponentScan
应该找到在应用程序上下文中定义的WoodStock
bean,但是当我运行它时:
No qualifying bean of type 'com.dawn.www.music.WoodStock' available
但是当我注释掉@EnableAspectJAutoProxy
时,可以从
应用程序上下文?这是为什么?
答案 0 :(得分:0)
@Test
public void scrape() throws Exception {
boolean exceptionHappend = false;
try {
SessionTimoutClassWithGettersSettersresult =
testScraper("/scrape/timeoutsession.html", "https://cantShow.html");
} catch (SessionTimeoutException e) {
exceptionHappend = true;
}
assertTrue(exceptionHappend);
details(result, "imgs/error.png","Your session has timed out. You will need to log back in to continue shopping.");
}
不使用CGLIB时,Spring Aop仅支持接口级代理,因此不要使用类,请使用接口。
答案 1 :(得分:0)
建议
在ctx.getBean(WoodStock.class)中使用'proxyTargetClass = true'
或
在ctx.getBean(Performance.class)中使用'proxyTargetClass = false'