De este proyecto, el proyecto encontró que cargan la clase, algunos lugares utilizan @Autowired, algunos lugares utilizan @Resource
En la Internet para recopilar datos sobre la
común
@Resource @Autowired y se puede utilizar como una propiedad de inyección modificado, cuando la clase de implementación interfaz de un solo, el mismo efecto de modificación dos anotaciones pueden ser sustituidos entre sí, no afecta.
diferentes puntos
Java es @Resource propias anotaciones, @ de recursos tiene dos atributos son más importantes, los puntos de ese nombre y tipo; Primavera @Resource nombre de anotación se resolverán en el nombre del atributo de frijol, y el atributo tipo se resuelve con el tipo de grano. Así que si se utiliza el atributo nombre se utiliza la estrategia de inyección Byname automática, y se utiliza cuando se utiliza la estrategia de inyección automática de atributos byType tipo. Si no se asigna ni nombre de atributo de tipo, el caso estrategia de inyección automática Byname mediante el uso de la reflexión.
@Autowired es anotaciones primavera spring2.5 versión se introduce, Autowired única inyección de acuerdo al tipo, no para que coincida con el nombre. Si se trata de la inyección de tipo no puede distinguir objetos que necesitan depender de @Qualifier o notas @Primary modificados juntos.
Escribe Liezi
Nueva clase HumanService.java
com.komiles.study.service empaquetar; / * * * @Author [email protected] * @date 23/03/2020 11:46 * / público interfaz HumanService { / * * *跑马拉松 * @return * / Cadena runMarathon (); }
ManServiceImpl.java clase de implementación
com.komiles.study.service.impl empaquetar; com.komiles.study.service.HumanService importación; org.springframework.stereotype.Component importación; org.springframework.stereotype.Service importación; / * * * @Author [email protected] * @date 03/23/2020 11:48 * / @Service pública clase implementos ManServiceImpl HumanService { / * * *跑马拉松 * / @ Override pública Cadena runMarathon () { retorno " Un hombre maratón " ; } }
nueva HumanController.java
com.komiles.study.controller empaquetar; com.komiles.study.service.HumanService importación; com.komiles.study.service.impl.ManServiceImpl importación; javax.annotation.Resource importación; org.springframework.beans.factory.annotation.Autowired importación; org.springframework.beans.factory.annotation.Qualifier importación; org.springframework.web.bind.annotation.GetMapping importación; org.springframework.web.bind.annotation.RequestMapping importación; org.springframework.web.bind.annotation.RestController importación; / * * * @Author [email protected] * @date 23/03/2020 11:49 * / @RestController @RequestMapping ( " / humana " ) público de clase HumanController { @Autowired privada HumanService humanService; @GetMapping ( " / run " ) pública Cadena runMarathon () { volver humanService.runMarathon (); } }
Ejecutar el programa
contenido de la salida: el hombre maratón
El controlador en el @Autowired en @Resource normalmente puede acceder.
Si escribo más clases de implementación de lo que sucederá?
Crear un WomanServiceImpl.java
com.komiles.study.service.impl empaquetar; com.komiles.study.service.HumanService importación; org.springframework.context.annotation.Primary importación; org.springframework.stereotype.Component importación; org.springframework.stereotype.Service importación; / * * * @Author [email protected] * @date 2020-03-23 12:01 * / @Service pública de clase WomanServiceImpl implementos HumanService { / * * *跑马拉松 * / @ Override pública Cadena runMarathon () { retorno " Una mujer se ejecuta maratón " ; } }
Ejecutar el programa, encontramos un error, porque hay dos clases de implementación, para encontrar que el programa no sabe
¿Cómo hacerlo?
Hay dos maneras
La primera, en la clase de implementación de la clase del nombre, el nombre en el momento de la introducción de introducción directa.
Por ejemplo: la prima en la clase ManServiceImpl.java, @ Servicio. @Service (valor = "manService") o @Component (valor = "manService")
com.komiles.study.service.impl empaquetar; com.komiles.study.service.HumanService importación; org.springframework.stereotype.Component importación; org.springframework.stereotype.Service importación; / * * * @Author [email protected] * @date 2020-03-23 11:48 * / @Service (valor = " manService " ) // @Component (value = "") manService pública de clase implementos ManServiceImpl HumanService { / * * *跑马拉松 * / @ Override pública cadena runMarathon () { retorno " maratón Un hombre de ejecución "; } }
Cuando se utiliza en la clase del controlador, sino también la necesidad de desarrollar cuáles son sus nombres.
Si utiliza @Resource necesidad de añadir @Resource (name = "manService")
Si utiliza @Autowired necesidad de utilizar @Qualifier (valor = "manService")
com.komiles.study.controller empaquetar; com.komiles.study.service.HumanService importación; com.komiles.study.service.impl.ManServiceImpl importación; javax.annotation.Resource importación; org.springframework.beans.factory.annotation.Autowired importación; org.springframework.beans.factory.annotation.Qualifier importación; org.springframework.web.bind.annotation.GetMapping importación; org.springframework.web.bind.annotation.RequestMapping importación; org.springframework.web.bind.annotation.RestController importación; / * * * @Author [email protected] * @date 23/03/2020 11:49 * / @RestController @RequestMapping ( " / humana " ) público de clase HumanController { @Autowired @Qualifier (valor = " manService " ) // @Resource (name = "manService") privada HumanService humanService; @GetMapping ( " / run " ) pública Cadena runMarathon () { volver humanService.runMarathon (); } }
Si desea hacer referencia a una clase de prioridad determinado, puede utilizar @Primary en la clase de implementación.
Código Artículo: https://github.com/KoMiles/springboot/blob/master/src/main/java/com/komiles/study/controller/HumanController.java