2 回答
TA贡献1848条经验 获得超10个赞
异常说明了一切 - attribute1 bean 是在应用程序初始化期间创建的(通过会话作用域 bean),但没有与请求绑定的线程。您还应该代理您的 attribute1 bean,因为您将其注入到单例(属性 2 服务。)
TA贡献1853条经验 获得超9个赞
基于 Alexander.Furer 给出的见解。我创建了自己的作用域,并管理它来调用 bean 提供者,以便在Attribute1方法的每次访问中都拥有新鲜的 bean。
为此,我扩展了以下范围:
// Register scope as "runtime"
public class RuntimeScope implements Scope {
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
return objectFactory.getObject();
}
...
}
新Attribute1服务:
@Service
public class Attribute1Service {
@Resource
private BeanSession beanSession;
public void setDefaultValue() {
Configuration configuration = beanSession.getRootState();
configuration.getAttribute1().setValue("VALUE 1");
}
@Bean
@Scope(value = "runtime", proxyMode = ScopedProxyMode.TARGET_CLASS)
public Attribute1 attribute1() {
Configuration configuration = beanSession.getRootState();
return configuration.getAttribute1();
}
}
消费者Attribute2服务:
@Service
public class Attribute2Service {
@Resource
private BeanSession beanSession;
@Resource
private Processor processor;
@Resource
private Attribute1 attribute1;
public void defineAttribute2() {
Configuration configuration = beanSession.getRootState();
String value = processor.getValue(configuration, attribute1.getValue()); // Will call Attribute1 service to require the fresh bean
configuration.getAttribute2().setValue(value);
}
public void defineAttribute3() {
Configuration configuration = beanSession.getRootState();
String value = processor.getValue(configuration, attribute1.getValue()); // Will call Attribute1 service to require the fresh bean
configuration.getAttribute3().setValue(value);
}
}
我没有看到的问题是 Attribute1 应该是处理 bean 实例化的代理。因此,通过创建我自己的范围,我可以保证访问 attribute1(由Attribute2Servicewith生成attribute1.getValue())方法将创建一个新的 bean(由 提供Attribute1Service)。
添加回答
举报