2014-11-21 66 views
0

我在春天学习标签的使用。我写了一个简单的编。使用Spring需要说明:<aop:scoped-proxy />

<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()); 
    } 

} 

当我运行主类,我得到如下结果:

First Book : DefaultName 

First Book : DefaultName 

Second Book : DefaultName 

我的问题,为什么是firstBook即使我已经将它设置没有设置的名称:firstBook .setName(“永恒的边缘”); 。当我删除aop:scoped-proxy时,名称设置正确。 为什么默认名称不会超写?

回答

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,它与scope=session豆以外的beans完全无关。

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