我沒有看到工廠bean的問題,我會做它像這樣:
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
@Component
public class X {
public static class XFactory implements FactoryBean<X> {
@Override
public X getObject() throws Exception {
return new X();
}
@Override
public Class<?> getObjectType() {
return X.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
}
,並注入該工廠bean。
否則,您可以範圍的X豆與
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS, value=ConfigurableBeanFactory.SCOPE_PROTOTYPE)
你必須讓春天創建一個代理,它總是返回一個新的實例,以你的單身使用非默認的代理模式。
如果你在XML配置要比做像這樣:
<bean id="x" class="X" scope="prototype">
<aop:scoped-proxy>
</bean>
有樂趣。
編輯:
當你通過註釋@Component貴廠(我上面添加的話),在#isSingleton返回false,並確保你不回你X的兩倍,你可以注入工廠bean與@Autowired到你的單身人士。
否則我剛剛檢查
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;
@Component
@Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class X {
}
它按預期工作。
編輯2:
如果你不想注入工廠bean,但只是想你注入可以原型範圍貴廠的依賴(@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS,值=「原型」 )),但每次涉及X時都會創建一個新工廠,這可能不是您想要的。
如果你不想讓工廠本身注入我會跟奧利弗查找方法去。
我在我自己的代碼中使用這種技術;它工作得很好。唯一不利的一面是包含它的類是抽象的,這減少了您的IDE可能提供的用於填充其他接口中聲明的方法的支持量。 –