¿Cómo usar anotaciones de primavera como @Autowired en kotlin?

81

¿Es posible hacer algo como seguir en Kotlin?

@Autowired
internal var mongoTemplate: MongoTemplate

@Autowired
internal var solrClient: SolrClient
eendroroy
fuente
3
¿Has probado? Y para ser un poco más constructivo ... hay una plantilla Spring Boot completa , la respuesta es sin duda "sí".
mabi
@mabi gracias por el enlace del tutorial :)
eendroroy

Respuestas:

182

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 vary tienen poca sobrecarga de tiempo de ejecución. Y para probar la clase con el constructor, no necesita reflexión.

Enlaces:

  1. Documentación sobre lateinit
  2. Documentación sobre constructores
  3. Desarrollando aplicaciones Spring Boot con Kotlin
Ruslan
fuente
¿Puedo usar el @Autowiredparámetro con el constructor primario?
Asif Mushtaq
Claro, utilizo el constructor principal para inyecciones en el segundo y tercer ejemplo.
Ruslan
¿Puedes agregar también el autowiredpor setter?
Asif Mushtaq
@IRus, has usado valores privados en tu ejemplo, pero yo diría que el 80% de todos los ejemplos que encontré en Internet vienen sin el modificador "privado" cuando se trata de Kotlin. Eso se consideraría olor a código en Java. ¿Cuál es la razón de eso? ¿Lo sabes? Incluso creo que merece una pregunta aparte.
yuranos
@ yuranos87 Imagínese que inyecta desarrollador YourBeande FooBean, en caso de que YourBeanlas dependencias serán públicas (modificador por defecto en Kotlin) desarrollador puede utilizar YourBeandependencias en FooBean( yourBean.mongoTemplate). Pero esto no debería permitirse, porque las YourBeandependencias no son su contrato público, son solo detalles de implementación (en la mayoría de los casos). En su lugar, FooBeandebería definir sus propias dependencias en su propio constructor.
Ruslan
6

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) {
  // ...
}
Mike Buhot
fuente
4

También puede conectar automáticamente las dependencias a través del constructor. Recuerde anotar sus dependencias con @Configuration, @Component, @Serviceetc.

import org.springframework.stereotype.Component

@Component
class Foo (private val dependency: MyDependency) {
    //...
}
Señor tortuga
fuente
0

como eso

@Component class Girl( @Autowired var outfit: Outfit)
Nankai
fuente