我目前正在使用会话对象。在服务层中,我正在自动装配会话作用域的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层中使用这些对象?
答案 0 :(得分:1)
我想知道Spring如何做到这一点?
SomeServiceImpl
是单例,因此应在启动时进行组装。组装一个bean意味着注入所有必需的依赖关系。尽管某些候选者的范围可能不同于单例范围,但仍必须提供它们。对于此类bean,Spring会创建代理。代理基本上是无意义的包装,直到出现某些上下文为止。
如果我使用final关键字并使用构造函数注入,Spring仍然可以自动连接对象。
Spring支持基于构造函数的注入。它检查签名并查找要注入的候选人;字段的修饰符无关紧要。
在Service层中使用会话对象是一种好习惯吗?还是我可以自由地在Controller和Service层中使用这些对象?
只要该服务是面向Web的并且与会话有关,您就可以向其中注入会话范围的bean。
答案 1 :(得分:0)
您正在通过构造函数自动装配,因此在这种情况下,单词final
的使用不会改变任何内容。通过将UserSessionDetails
注释为会话作用域的bean,并将其注入SomeServiceImpl
spring中,将生成一个代理。您服务中的任何调用都将被委派到UserSessionDetails
bean中。