Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不使用bean或注释的情况下手动初始化Spring引导存储库?(科特林)_Java_Spring Boot_Kotlin - Fatal编程技术网

Java 如何在不使用bean或注释的情况下手动初始化Spring引导存储库?(科特林)

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

我想在Spring Boot中初始化
存储库
对象,而不必使其成为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管理(例如,如果它们也有依赖项,则必须自己解决)
  • 在这种情况下使用
    @Autowired
    没有意义,因为它只在SpringBean之间工作
例如,这是错误的,因为类A不是由spring管理的:


// 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)
        }
    }
}