使用Spring需要澄清:<aop:scoped-proxy> </aop:scoped-proxy>

时间:2014-11-21 10:38:38

标签: java spring

我正在学习春天使用标签。我写了一个简单的编程。

    <bean id="book" class="com.test.scoped.Book" scope="prototype" >
    <property name="name" value="DefaultName"></property>
         <aop:scoped-proxy/> 
    </bean>

    <bean id="reader" class="com.test.scoped.Reader" >
        <property name="book" ref="book" />
    </bean>


public class Book {

    private String name;

    public String toString (){
        return this.name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}


class Reader {
    private Book book;

    public Book getBook() {
        return book;
    }

    public void setBook(Book book) {
        this.book = book;
    }

}


    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ApplicationContext ctx = new ClassPathXmlApplicationContext("ScopedProxy.xml");

        Book firstBook  = ((Reader)ctx.getBean("reader")).getBook();
        System.out.println("First Book : "+firstBook.getName());
        firstBook.setName("Edge of Eternity");
        System.out.println("First Book : "+firstBook.getName());

        Book secondBook = ((Reader)ctx.getBean("reader")).getBook();
        System.out.println("Second Book : "+secondBook.getName());
    }

}
  

当我运行Main class时,我得到以下结果:

First Book : DefaultName

First Book : DefaultName

Second Book : DefaultName
  

我的问题,为什么第一本书的名字没有设置,即使我已经设置了它:firstBook.setName(&#34; Edge of Eternity&#34;); 。当我删除aop:scoped-proxy时,名称设置正确。   为什么默认名称不会过度?

2 个答案:

答案 0 :(得分:1)

您不应该以您的方式使用范围代理bean。在开发-i.e.- webapps并将它们用作从单例bean引用时,Scoped-proxy bean非常有用。

看一下Spring文档[1]:&#34;你不需要使用&lt; aop:scoped-proxy /&gt;与作为单身人士或原型作用的豆子一起使用#34;

[1] http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-scopes-other-injection

答案 1 :(得分:0)

如果您的主要目标是为default value设置name,那么您需要做的只是

<bean id="book" class="eu.europa.ema.esubmission.psur.Book" scope="prototype" >
    <property name="name" value="DefaultName"></property>
</bean>

然后,如果愿意,您可以覆盖属性name

然后关于与aop:scoped-proxy bean以外的beans完全无关的scope=session

如果你想将Session scope bean作为依赖注入其他beans,那么只有你应该使用scoped-proxy声明。由于您的Book bean被定义为prototype,因此不需要它。