Spring如何自动装配会话作用域的bean?

3

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

@Service
public class SomeServiceImpl implements SomeService {

    private final UserSessionDetails userSessionDetails;

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

我的另一个问题是:在Service层使用session对象是否是良好的实践?或者我可以在Controller和Service层自由地使用这些对象?
2个回答

2
我想知道Spring如何实现这个功能? SomeServiceImpl是单例的,所以应该在启动时组装。组装一个bean意味着将所有必需的依赖项注入其中。尽管有些候选者的范围与单例范围不同,它们仍然必须提供。对于这样的bean,Spring创建代理。代理基本上是一个毫无意义的包装器,直到某个上下文出现为止。
如果我使用final关键字并使用构造函数注入,Spring仍然能够自动装配对象。
Spring支持基于构造函数的注入。它检查签名并查找要注入的候选项;字段的修饰符并不重要。
在Service层中使用session对象是好的做法吗?或者我可以在Controller和Service层中自由地使用这些对象吗?
只要服务是面向Web且涉及会话,您就可以自由地将会话作用域的bean注入其中。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接