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.
¿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':
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:
También puede conectar automáticamente las dependencias a través del constructor. Recuerde anotar sus dependencias con @Configuration, @Component, @Serviceetc.
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 únicosvar
y tienen poca sobrecarga de tiempo de ejecución. Y para probar la clase con el constructor, no necesita reflexión.Enlaces:
fuente
@Autowired
parámetro con el constructor primario?autowired
por setter?YourBean
deFooBean
, en caso de queYourBean
las dependencias serán públicas (modificador por defecto en Kotlin) desarrollador puede utilizarYourBean
dependencias enFooBean
(yourBean.mongoTemplate
). Pero esto no debería permitirse, porque lasYourBean
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
class Foo @Inject constructor(dependency: MyDependency) { // ... }
fuente
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) { //... }
fuente
como eso
@Component class Girl( @Autowired var outfit: Outfit)
fuente