我对AOP很陌生,慢慢地阅读和学习SpringAOP和AspectJ。
我遇到了一个意想不到的例子,一个对象不是作为bean创建的,而是由一个工厂创建的,它是作为bean创建的,它是用我的方面来代理的,而我只希望在SpringAOP中使用可应用的方面来代理由spring创建的对象。
spring如何能够知道代理由注册了spring的工厂创建的对象?这意味着spring如何知道我自己的工厂实际上是一个工厂,DogShelter.getAngryDog()返回的对象是一个需要用代理包装的新对象,而不是以前已经用方面代理包装过的现有AngryDog?
以下是代码:
目的:
public class AngryDog extends Dog {
@Override
public void play() {
System.out.println("AngryDog->play()");
bark();
bite();
}
@Override
public void bark() {
System.out.println("AngryDog->bark()");
}
@Override
public void bite() {
System.out.println("AngryDog->bite()");
}
}工厂:
public class DogShelter {
public AngryDog getAngryDog(){
return new AngryDog();
}
}方面:
@Aspect
public class BeforeAllDogMethodsAspect {
@Before("execution(* com.demos.dogs.*.*(..)))")
public void doAccessCheck() {
System.out.println("SpringAOP aspect called!");
}
}春季会议:
/** DogConfig spring configuration */
@EnableAspectJAutoProxy
@Configuration
public class DogConfig {
@Bean
public AngryDog dog() {
return new AngryDog();
}
@Bean
public DogShelter dogShelter(){
return new DogShelter();
}
@Bean
public BeforeAllDogMethodsAspect beforeAngryDogBitesExample(){
return new BeforeAllDogMethodsAspect();
}
}调用:
foo(){
System.out.println("----------------");
System.out.println("Getting a dog from locally created dog shelter. And playing with it");
DogShelter locallyCreatedDogShelter = new DogShelter();
AngryDog dogFromLocalShelter = locallyCreatedDogShelter.getAngryDog();
dogFromLocalShelter.play();
System.out.println("----------------");
System.out.println("Getting a dog from autowired dog shelter. And playing with it");
AngryDog dogFromAutoWiredDogShelter = autowiredDogShelter.getAngryDog();
dogFromAutoWiredDogShelter.play();
}产出:
----------------
Getting a dog from locally created dog shelter. And playing with it
AngryDog->play()
AngryDog->bark()
AngryDog->bite()
----------------
Getting a dog from autowired dog shelter. And playing with it
SpringAOP aspect called!
AngryDog->play()
AngryDog->bark()
AngryDog->bite()发布于 2015-10-18 21:53:33
应该在方面中显示方法名。否则,你不知道哪种方法被拦截。
关于您的问题:可能被截获的是getAngryDog()方法,而不是play()方法。
https://stackoverflow.com/questions/33203650
复制相似问题