---

2015/10/25

layout: post
title: "Spring协调作用域不同步的bean"
category: Reading Notes

tags: ["读书", "Spring"]

{% include JB/setup %}

协调作用域不同步的Bean

<bean id="steelAxe" class="..." scope="prototype"/>

<bean id="chinese" class="...">
    <lookup-method name="getAxe" bean="steelAxe"/>
</bean>

chinese是singleton;steelAxe是prototype

程序多次引用chinese的时候,实际引用的是同一个实例

这样会造成steelAxe也每次都是同一个实例,违反了其prototype的scope

解决方法

public class SteelAxe implements Axe
{
    public SteelAxe()
    {
        System.out.println("Spring实例化依赖Bean:SteelAxe实例...");
    }

    public String chop()
    {
        return "钢斧砍柴!";
    }
}

public abstract class Chinese implements Person
{
    public Chinese()
    {
        System.out.println("Spring实例化主调bean:Chinese实例...");
    }

    // 交由Spring来实现
    public abstract Axe getAxe();

    public void useAxe()
    {
        System.out.println("正在使用 " + getAxe() + "砍柴!");
        System.out.println(getAxe().chop());
    }
}

实际上,Spring实现getAxe()的逻辑是:

public Axe getAxe()
{
    return ctx.getBean("steelAxe");
}

运行结果:

  • Spring实例化主调bean:Chinese实例...
  • Spring实例化依赖Bean:SteelAxe实例...