Estoy usando uno de nuestros proyectos como una dependencia de otra. Una de las clases en el proyecto dependiente es la siguiente:
@Service
public class Dependency {
@Value("${xyz.value}")
private String xyz;
@Value("${abc.value}")
private String abc;
public Dependency() {
}
public Dependency(String xyz, String abc) {
this.xyz = xyz;
this.abc = abc;
}
}
Estoy tratando de crear una instancia de Dependency
en otro proyecto en el inicio de la siguiente manera:
@Configuration
@PropertySource(value = {
"classpath:appEnv.properties"
}, ignoreResourceNotFound = true)
public class Test {
@Bean(name = "dependencyBean")
public Dependent getDependent() {
return new Dependent("xyz", "abc");
}
}
Intentar acceder a la dependencyBean
creada de la siguiente
public class SomeClass {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
Dependent d = ctx.getBean("dependencyBean");
}
Me estoy haciendo la siguiente excepción
BeanCreationException: Error al crear el frijol con el nombre 'dependentBean': La inyección de dependencias autowired fracasó; la excepción jerarquizada es org.springframework.beans.factory.BeanCreationException: No se pudo Autowire campo: xyz java.lang.String privado;
¿Cómo puedo crear una instancia de la clase dependiente sin invocar postProcessPropertyValues
la que intenta resolver los campos con @Value
la anotación?
Usted, en primer lugar, necesita habilitar frijol con anulando;
spring.main.allow-bean-definition-overriding=true
y acaba de tener su grano de encargo tiene el nombre exacto como la @Service
clase anotada;
@Bean(name = "dependency")
public Dependency getDependent() {
return new Dependency("xyz", "abc");
}
De este modo se puede anular la @Service
anotada Dependency
con su grano de inicializado manualmente. Pero para lograr esto, primero hay que rechazar el encargo getDependent()
de frijol resultante para desencadenar @Value
anotaciones, para hacer eso, es necesario cambiar la Dependency
clase de @Value
método de inyección de constructor. Cuando es así, sólo que cuando la primavera automáticamente inyecta, las @Value
anotaciones se activan, cuando se llama de forma manual new Dependency("xyz", "abc")
, no lo harán.
@Service
public class Dependency {
private String xyz;
private String abc;
@Autowired
public Dependency(@Value("${xyz.value}") String xyz, @Value("${abc.value}") String abc) {
this.xyz = xyz;
this.abc = abc;
}
}
Con estos cambios, usted no tendrá ningún error con su grano de encargo autowired.