Session or request scope variable in Spring

I would like to have a variable with scope in Spring. In Guice, this is very simple:

@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();
    }
}

How can I do something like this in Spring?

Keep in mind that this is java.lang.Integer, not some bean user, it cannot be proxied.

+3
source share
2 answers

In your case, you do not need a session area. You just need an instance of the specialized oneton provider

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();
            }
        };
    }
}

And enter it

@Inject
private CustomProvider<Integer> factory;

I missed that you want the same value for the session. See Emerson answer for this.


In general, for a beans session:

In a class, @Configurationyou can provide a method @Beanthat has a session scope.

@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" />
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();
0

All Articles