gpt4 book ai didi

java - @Service 中的@Autowired?

转载 作者:搜寻专家 更新时间:2023-10-31 08:14:59 25 4
gpt4 key购买 nike

我无法让@Autowired 在@Service 注释的类中工作, Autowiring 变量始终为空。让我解释一下:

@Service
public class Searcher extends Thread implements ISearcher {
@Autowired
protected ISessionProvider sessionProvider; <-- always null
...
public Searcher() {
sessionProvider.doSomeStuff();
}

此处的sessionProvider始终为null。

奇怪的是,@Controller 中的同一个 Autowiring 确实有效:

@Controller
@RequestMapping("/search")
@Secured({ "ROLE_USER" })
public class SearchController extends BaseController {
@Autowired
protected ISessionProvider sessionProvider; <-- does work
@Autowired
protected ISearcher searcher;

最后一行抛出异常,因为 Searcher 的构造函数(实现 ISearcher)试图访问 sessionProvider,它是 null。

我不确定我可能做错了什么,看起来 spring 没有 Autowiring Searcher 中的 ISessionProvider。

可能是 spring 首先在 SearchController 中 Autowiring Searcher,但它应该首先在 Searcher 中 Autowiring SessionProvider,然后在 SearchController 中 Autowiring Searcher。如果没有有效的 SessionProvider,则无法自动连接搜索器。困惑我的大脑;-)

有人可以提供帮助吗?

[编辑]

  • component-scan 包括我的服务、 Controller 和所有刚刚检查过的东西。
  • 我之前的界面确实不太好(老习惯)
  • 不确定这是否是一个“重复”问题,主要是因为我没有对"new"做任何事情,我让 spring 完成所有艰苦的工作,但我会看得更清楚。

最佳答案

Spring会先创建bean实例,然后注入(inject)bean。您正在尝试在创建当前 bean 时访问注入(inject)的 bean,因此该 bean 将为 null。这是默认行为。

如果您想要/需要在创建 bean 后执行任何逻辑,请使用 @PostConstruct 装饰方法,该方法在创建 bean 并注入(inject)所有依赖项后调用。这是一个示例:

@Service
public class Searcher extends Thread implements ISearcher {

@Autowired
protected ISessionProvider sessionProvider;

public Searcher() {
//nothing should be here...
}

@PostConstruct
public void init() {
sessionProvider.doSomeStuff();
}
}

关于java - @Service 中的@Autowired?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23520008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com