Java 如何在不使用bean或注释的情况下手动初始化Spring引导存储库?(科特林)
我想在Spring Boot中初始化Java 如何在不使用bean或注释的情况下手动初始化Spring引导存储库?(科特林),java,spring-boot,kotlin,Java,Spring Boot,Kotlin,我想在Spring Boot中初始化存储库对象,而不必使其成为bean或自动连接的属性 我只想在Kotlin中执行feedRepository=feedRepository()。为什么Spring Boot不允许我这么做?为什么它必须是自动连接的或是一个bean 这是我的密码: @Component class UriParser() { @Autowired lateinit var uriRepository: UriRepository @Autowired
存储库
对象,而不必使其成为bean或自动连接的
属性
我只想在Kotlin中执行feedRepository=feedRepository()
。为什么Spring Boot不允许我这么做?为什么它必须是自动连接的或是一个bean
这是我的密码:
@Component
class UriParser() {
@Autowired
lateinit var uriRepository: UriRepository
@Autowired
lateinit var hostRepository: HostRepository
@Autowired
lateinit var feedRepository: FeedRepository
fun parseUri(uri: String) : Feed {
val urlRepository = UriRepository()
val uri = URI(uri)
val uriRecord = uriRepository.save(Uri(scheme = uri.scheme, host = uri.host, port = uri.port))
hostRepository.save(Host(host = uri.host))
return feedRepository.save(Feed(uriId = uriRecord.id))
}
}
编辑:好的,这里有更好的上下文来解释为什么我不能自动连线。基本上,我是在静态函数中执行此操作的,因此我绝对无法访问bean或自动连接属性:
@SpringBootApplication
class Application
fun main(args: Array<String>) {
runApplication<Application>(*args)
KafkaScheduler().init()
}
但是,我不能将KafkaScheduler类作为静态方法中的bean进行自动连接,因此就我所知,我不能真正将其作为组件或自动连接任何存储库。没有人阻止您自己在spring托管组件中初始化对象 但是,这些对象:
- 不会由spring管理(例如,如果它们也有依赖项,则必须自己解决)
- 在这种情况下使用
没有意义,因为它只在SpringBean之间工作@Autowired
// not managed by spring
class A {
}
@Component
class B {
@Autowired
A a;
}
所以我相信你的目标是这样的:
@Component
class UriParser() {
// no autowired here, you manage everything by youself
// also possible from constructor
lateinit var uriRepository = UriRepository()
...
}
顺便说一句,我还没有学会Kotlin,所以语法可能是错误的。我想出来了。一个简单的
@PostConstruct
注释解决了我需要的所有问题。本质上,我只是将KafkaScheduler
标记为一个@组件
,自动连接其中所需的所有内容,唯一的区别是我将@PostConstruct
添加到init方法中,这样我就可以访问自动连接属性。然后,我可以在任何需要的地方自动连接存储库(在本例中,在使用UriParser
的QueueListener
中)
你能发布你看到的错误吗?是的,这是说uriRepository、feedRepository等还没有初始化。如果你不想要DI(依赖注入)或IOC(控制反转),那么就不要使用Spring。只需使用普通的旧Java。在您的例子中,您正在用非Spring控制的bean覆盖Spring控制的bean。根据您的UriRepository实现,这将不起作用。因为它是一个普通的java对象而不是bean。请考虑使用构造函数注入,如<代码>类URIPARSER(@Autowired-val-uriRepository…问题是我无法自动连接东西,因为我是从静态函数调用这些东西的,所以我无法访问任何bean或spring的框架魔法。我将编辑我的答案以获得更好的上下文。还请记住,如果您想要构建自己的类实例,在本例中是存储库,您将必须管理您自己的数据库会话、事务和连接。Spring无法帮助您。不幸的是,我不能只使用UriRepository构造函数,因为从技术上讲,它是Spring引导存储库的接口。
@Component
class UriParser() {
// no autowired here, you manage everything by youself
// also possible from constructor
lateinit var uriRepository = UriRepository()
...
}
@Component
class KafkaScheduler() {
@Autowired
lateinit var queueListener: QueueListener
@Autowired
lateinit var prefetchListener: PrefetchListener
@Autowired
lateinit var fetchListener: FetchListener
@PostConstruct
fun init() {
val threads = arrayOf(
{
queueListener.init()
},
{
prefetchListener.init()
},
{
fetchListener.init()
}
)
val service = Executors.newFixedThreadPool(threads.size)
for (thread in threads) {
service.submit(thread)
}
}
}