首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpringAOP: spring如何能够代理工厂创建的对象?

SpringAOP: spring如何能够代理工厂创建的对象?
EN

Stack Overflow用户
提问于 2015-10-18 21:48:36
回答 1查看 243关注 0票数 3

我对AOP很陌生,慢慢地阅读和学习SpringAOP和AspectJ。

我遇到了一个意想不到的例子,一个对象不是作为bean创建的,而是由一个工厂创建的,它是作为bean创建的,它是用我的方面来代理的,而我只希望在SpringAOP中使用可应用的方面来代理由spring创建的对象。

spring如何能够知道代理由注册了spring的工厂创建的对象?这意味着spring如何知道我自己的工厂实际上是一个工厂,DogShelter.getAngryDog()返回的对象是一个需要用代理包装的新对象,而不是以前已经用方面代理包装过的现有AngryDog

以下是代码:

目的:

代码语言:javascript
复制
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()");
    }
}

工厂:

代码语言:javascript
复制
public class DogShelter {
    public AngryDog getAngryDog(){
        return new AngryDog();
    }
}

方面:

代码语言:javascript
复制
@Aspect
public class BeforeAllDogMethodsAspect {

    @Before("execution(* com.demos.dogs.*.*(..)))")
    public void doAccessCheck() {
        System.out.println("SpringAOP aspect called!");
    }

}

春季会议:

代码语言:javascript
复制
/** 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();
    }
}

调用:

代码语言:javascript
复制
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();
}

产出:

代码语言:javascript
复制
 ----------------
 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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-18 21:53:33

应该在方面中显示方法名。否则,你不知道哪种方法被拦截。

关于您的问题:可能被截获的是getAngryDog()方法,而不是play()方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33203650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档