Как вручную инициализировать репозиторий Spring Boot без использования bean-компонентов или аннотаций? (Kotlin) - PullRequest
0 голосов
/ 20 февраля 2020

Я хочу инициализировать объект repository в Spring Boot без необходимости превращать его в bean-компонент или свойство Autowired.

Я просто хочу сделать feedRepository = FeedRepository() в Kotlin. Почему 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))
    }
}

Редактировать: хорошо, так что вот лучший контекст о том, почему я не могу автоматически связать вещи. По сути, я делаю это в функции stati c, поэтому у меня нет абсолютно никакого доступа к bean-компонентам или свойствам автопроводки:

@SpringBootApplication
class Application

fun main(args: Array<String>) {
    runApplication<Application>(*args)
     KafkaScheduler().init()
}

Планировщик Kafka в основном выполняет несколько потоков, которые все слушают темы kafka:

class KafkaScheduler() {
    // this doesn't work....
    @Autowired
    lateinit var feedRepository: FeedRepository

    fun init() {
        val threads = arrayOf(
            {
                QueueListener().init()
            },
            {
                PrefetchListener().init()
            },
            {
                FetchListener().init()
            }
        )

        val service = Executors.newFixedThreadPool(threads.size)

        for (thread in threads) {
            service.submit(thread)
        }
    }
}

однако я не могу автоматически связать класс KafkaScheduler как bean-компонент в методе stati c, поэтому я не могу сделать так, чтобы компонент или автоиндустрировали какие-либо репозитории, насколько мне известно.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Ну, я понял это. Простая аннотация @PostConstruct решает все, что мне нужно для этого. По сути, я просто помечаю KafkaScheduler как @Component, автоматически связывая все, что мне нужно, с той лишь разницей, что я добавил @PostConstruct к методу init, чтобы у меня был доступ к свойствам автопроводки. Затем я могу автоматически подключать репозитории везде, где они мне нужны (в данном случае в пределах QueueListener, который использует UriParser)

@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)
        }
    }
}
0 голосов
/ 20 февраля 2020

Никто не мешает вам самостоятельно инициализировать объекты в управляемом пружине компоненте.

Однако эти объекты:

  • не будут управляться пружиной (например, если они также имеют зависимости, которые вам придется разрешать самостоятельно)
  • В этом случае не имеет смысла использовать @Autowired, потому что он работает только между бобами.

Например , это неправильно, потому что класс A не управляется весной:


// 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, поэтому синтаксис может быть неправильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...