java - resource - spring injection
@Autowired vs @Required on setter (2)
Tengo curiosidad por saber cuál es la diferencia entre un código como este:
class MyClass {
@Autowired
MyService myService;
}
y código como este:
class MyClass {
MyService myService;
@Required
public void setMyService(MyService val) {
this.myService = val;
}
}
@Autowired
anotación @Autowired
se utiliza cuando se desea activar automáticamente un bean. @Autowired
no se limita al configurador. Se puede utilizar con un constructor y un campo también. Si usa la anotación @Autowired
en un campo, ese campo se conectará automáticamente con el bean que tenga el tipo de datos coincidente.
@Required
verificación si una propiedad en particular se ha establecido o no. Si un campo se ha anotado con la anotación @Required
y ese campo no está establecido, obtendrá org.springframework.beans.factory.BeanInitializationException
.
Referir:
Uso recomendado de la anotación @Required de Spring
Edición: como lo señala ''kryger'': el campo anotado con @Autowired
también es @Required
(a menos que explícitamente establezca su parámetro requerido en falso). p.ej:
@Autowired(required=false)
private ObjectType objectType;
Para un campo que ha sido anotado @Autowired
, si el bean con el tipo de datos coincidente no está disponible, se lanza org.springframework.beans.factory.BeanCreationException
.
@Autowired
no es lo mismo que @Required
.
La @Required
-Rnotation está especializada para decirle a Spring que esta propiedad debe ser inyectada por la información que figura en el archivo de configuración XML y no a través de anotaciones. Y eso no importa cuando usas @Autowire
-Annotation.
El @Autowire
-Annotation (como en su ejemplo de código), le dice a ApplicationContext (también conocido como Spring-IoC-Containter) que inyecte la dependencia deseada. (No importa cómo, si es mediante el uso de anotaciones o el archivo XML de ApplicationContext).
El @Required
-Annotation , le dice a ApplicationContext que esta propiedad debe mencionarse en el archivo XML (El archivo XML del ApplicationContext), pero la Anotación por sí sola no le indica que inyecte la dependencia. Por lo tanto, se utiliza para verificar si está en el archivo de configuración XML, pero no para inyectar una dependencia. La inyección se realiza porque la propiedad se menciona en el archivo XML.
Entonces, al final, indica que la inyección se debe realizar debido a una configuración en el archivo XML. Pero nuevamente: la anotación no indica que la dependencia se debe inyectar, sino que se debe mencionar en el archivo XML, que permite la inyección de la dependencia.
Al mencionar la propiedad en un archivo XML me refiero a una configuración de este tipo, por ejemplo:
<bean id="MyClass" class="com.myclasses.common.MyClass">
<property name="someProperty" value="ValueThatHasToBeInjected" />
</bean>
Entonces, ¿por qué debería usarlo sobre @ Anotación automática?
Debe usarlo cuando la dependencia en el archivo de configuración XML debe inyectar la dependencia.
¿Puedes darme un ejemplo?
Bueno, ya hay un muy buen ejemplo en este sitio web. donde esto también se explica.