我想在Spring中有一个范围变量。在Guice,这很简单:
@Singleton
class MyBean
{
@Inject @Named("session-scoped")
private Provider<Integer> someString;
void doSomething()
{
// returns a random number for a current session.
// Each user session should generate new number,
// but one session should keep the same number.
Integer n1 = someString.get();
Integer n2 = someString.get();
assert n1 == n2;
}
}
...
class MyModule extends AbstractModule
{
@Override
protected void configure()
{
...
}
@Provides
@SessionScoped
@Named("session-scoped") Integer someString()
{
return new Random().nextInt();
}
}
我怎么能在Spring做类似的事情?
请记住,它是java.lang.Integer,而不是某些用户bean,它不能被代理。
答案 0 :(得分:0)
在您的情况下,您不需要会话范围。您只需要一个单独的自定义提供程序实例
interface CustomProvider<E> {
public E get();
}
@Configuration
class TestConfig {
@Bean
public CustomProvider<Integer> factory() {
return new CustomProvider<Integer>() {
@Override
public Integer get() throws BeansException {
return new Random().nextInt();
}
};
}
}
注入它
@Inject
private CustomProvider<Integer> factory;
我错过了你想要会话的相同价值。 See Emerson's answer for that.
通常用于会话范围的bean:
在@Configuration
课程中,您可以提供具有会话范围的@Bean
方法。
@Bean
@Scope(value = WebApplicationContext.SCOPE_SESSION /* or simply "session" */)
public SomeBean someBean() {
return new SomeBean();
}
您也可以在@Scope
带注释的班级上使用@Component
注释。
在XML
中<bean id="someBean" class="com.example.SomeBean" scope="session" />
答案 1 :(得分:0)
@Component
@Scope("session")
public class IntegerProvider implements Provider<Integer> {
private Integer value = new Random().nextInt();
public Integer get() {
return this.value;
}
}
...
@Autowired
private Provider<Integer> integerProvider;
...
assert this.integerProvider.get().equals(this.integerProvider.get();