我正在学习春天使用标签。我写了一个简单的编程。
<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时,名称设置正确。 为什么默认名称不会过度?
答案 0 :(得分:1)
您不应该以您的方式使用范围代理bean。在开发-i.e.- webapps并将它们用作从单例bean引用时,Scoped-proxy bean非常有用。
看一下Spring文档[1]:&#34;你不需要使用&lt; aop:scoped-proxy /&gt;与作为单身人士或原型作用的豆子一起使用#34;
答案 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
,因此不需要它。