Spring:为 get 方法的每次调用创建新的 Bean 实例

2022-09-03 00:09:06

我有下一个情况:应该每次都有一个对象和新对象,所以,我已经创建了这些bean并配置出来它spring xml。Connection managerConnectionServerDataBean

<?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>

并添加了范围prototypeDataBean

在此之后,我创建了名为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,这对我来说就是问题所在。我可以在没有使用克隆方法的情况下从弹簧配置中做到这一点吗?谢谢。


答案 1

您正在春季寻找查找方法功能。我们的想法是,你提供一个抽象的方法,如下所示:

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

并告诉Spring它应该在运行时实现它:

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

现在,每次调用时,您实际上都会调用Spring生成的方法。此方法将询问例如。如果此 Bean 是 -scope,则每次调用它时都会获得新实例。Test.getBeanApplicationContextDataBeanprototype

我在这里写了关于这个功能的文章


答案 2

推荐