¿Es posible hacer algo como seguir en Kotlin?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
¿Es posible hacer algo como seguir en Kotlin?
@Autowired
internal var mongoTemplate: MongoTemplate
@Autowired
internal var solrClient: SolrClient
Respuestas:
El enfoque recomendado para hacer la inyección de dependencia en Spring es la inyección del constructor:
@Component
class YourBean(
private val mongoTemplate: MongoTemplate,
private val solrClient: SolrClient
) {
// code
}
Antes de Spring 4.3, el constructor debe anotarse explícitamente con Autowired
:
@Component
class YourBean @Autowired constructor(
private val mongoTemplate: MongoTemplate,
private val solrClient: SolrClient
) {
// code
}
En casos raros, es posible que desee utilizar la inyección de campo, y puede hacerlo con la ayuda de lateinit
:
@Component
class YourBean {
@Autowired
private lateinit var mongoTemplate: MongoTemplate
@Autowired
private lateinit var solrClient: SolrClient
}
La inyección del constructor comprueba todas las dependencias en el momento de la creación del bean y todos los campos inyectados son val
, por otro lado, los campos inyectados tardíos pueden ser únicos var
y tienen poca sobrecarga de tiempo de ejecución. Y para probar la clase con el constructor, no necesita reflexión.
Enlaces:
@Autowired
parámetro con el constructor primario?
autowired
por setter?
YourBean
de FooBean
, en caso de que YourBean
las dependencias serán públicas (modificador por defecto en Kotlin) desarrollador puede utilizar YourBean
dependencias en FooBean
( yourBean.mongoTemplate
). Pero esto no debería permitirse, porque las YourBean
dependencias no son su contrato público, son solo detalles de implementación (en la mayoría de los casos). En su lugar, FooBean
debería definir sus propias dependencias en su propio constructor.
Sí, las anotaciones de Java son compatibles con Kotlin principalmente como en Java. Un problema es que las anotaciones en el constructor principal requieren la palabra clave explícita 'constructor':
De https://kotlinlang.org/docs/reference/annotations.html
Si necesita anotar el constructor principal de una clase, debe agregar la palabra clave constructor a la declaración del constructor y agregar las anotaciones antes:
class Foo @Inject constructor(dependency: MyDependency) {
// ...
}
También puede conectar automáticamente las dependencias a través del constructor. Recuerde anotar sus dependencias con @Configuration, @Component, @Service
etc.
import org.springframework.stereotype.Component
@Component
class Foo (private val dependency: MyDependency) {
//...
}