Spring中的会话或请求范围变量

时间:2014-02-08 22:19:13

标签: java spring web-applications guice

我想在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,它不能被代理。

2 个答案:

答案 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();