我没有看到工厂 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。
否则,您可以使用
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS, value=ConfigurableBeanFactory.SCOPE_PROTOTYPE)
您必须使用非默认代理模式,以便 spring 创建一个代理,该代理始终向您的单例返回一个新实例。
如果您使用的是 XML 配置,那么请这样做:
<bean id="x" class="X" scope="prototype">
<aop:scoped-proxy>
</bean>
玩得开心。
编辑:
当您通过 @Component 注释您的工厂时(我已在上面添加),在 #isSingleton 中返回 false 并确保您不返回您的 X 两次,您可以将带有 @Autowired 的工厂 bean 注入您的单例中。
否则我刚刚检查过
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, value="prototype")),但每次 X 都会创建一个新工厂涉及这可能不是你想要的。
如果您不想注入工厂本身,我会使用 Olivers 查找方法。