Spring如何自动连接会话作用域的bean?

时间:2019-01-08 11:00:03

标签: java spring spring-mvc autowired session-scope

我目前正在使用会话对象。在服务层中,我正在自动装配会话作用域的bean。而且我想知道Spring如何做到这一点?更有趣的是,即使我使用final关键字并使用构造函数注入,Spring仍然可以自动装配对象。

@Service
public class SomeServiceImpl implements SomeService {

    private final UserSessionDetails userSessionDetails;

    @Autowired
    public SomeServiceImpl(final UserSessionDetails userSessionDetails) {
        this.userSessionDetails = userSessionDetails;
    }
}

我的另一个问题是;在Service层中使用会话对象是一种好习惯吗?还是我可以自由地在Controller和Service层中使用这些对象?

2 个答案:

答案 0 :(得分:1)

  

我想知道Spring如何做到这一点?

SomeServiceImpl是单例,因此应在启动时进行组装。组装一个bean意味着注入所有必需的依赖关系。尽管某些候选者的范围可能不同于单例范围,但仍必须提供它们。对于此类bean,Spring会创建代理。代理基本上是无意义的包装,直到出现某些上下文为止。

  

如果我使用final关键字并使用构造函数注入,Spring仍然可以自动连接对象。

Spring支持基于构造函数的注入。它检查签名并查找要注入的候选人;字段的修饰符无关紧要。

  

在Service层中使用会话对象是一种好习惯吗?还是我可以自由地在Controller和Service层中使用这些对象?

只要该服务是面向Web的并且与会话有关,您就可以向其中注入会话范围的bean。

答案 1 :(得分:0)

您正在通过构造函数自动装配,因此在这种情况下,单词final的使用不会改变任何内容。通过将UserSessionDetails注释为会话作用域的bean,并将其注入SomeServiceImpl spring中,将生成一个代理。您服务中的任何调用都将被委派到UserSessionDetails bean中。