web-dev-qa-db-ja.com

Spring:getメソッドの呼び出しごとにBeanの新しいインスタンスを作成します

次の状況があります:Connection managerには、毎回ConnectionServerのオブジェクトとDataBeanの新しいオブジェクトが必要です。そこで、これらのBeanを作成し、Springxmlで構成しました。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="dataBena" class="com.test.DataBean" scope="prototype"/>
    <bean id="servCon" class="com.test.ServerCon"/>
    <!--<bean id="test" class="com.test.Test"/>-->
     <context:component-scan base-package="com.test"/>
</beans>

prototypeにスコープDataBeanを追加しました

この後、Testという単純なutil/componentクラスを作成しました

@Component
public class Test {

    @Autowired
    private DataBean bean;
    @Autowired
    private ServerCon server;

    public DataBean getBean() {
        return bean.clone();
    }

    public ServerCon getServer() {
        return server;
    }

}

しかし、getBean()メソッドを呼び出すたびに、このBeanのクローンを作成しています。これは、私にとって問題です。 Spring構成からそれを行うことはできますかクローンメソッドを使用せずに?ありがとう。

16

あなたはSpringの ルックアップメソッド 機能を探しています。アイデアは、次のような抽象的なメソッドを提供することです。

@Component
public abstract class Test {
  public abstract DataBean getBean();
}

そして、実行時に実装する必要があることをSpringに伝えます。

<bean id="test" class="com.test.Test">
  <lookup-method name="getBean" bean="dataBean"/>
</bean>

これで、Test.getBeanを呼び出すたびに、実際にはSpringで生成されたメソッドが呼び出されます。このメソッドは、ApplicationContextDataBeanインスタンスを要求します。このBeanがprototypeスコープの場合、呼び出すたびに新しいインスタンスを取得します。

私はこの機能について書きました ここ

33