java - beans - spring dependency injection
Spring bean con argumentos de constructor de tiempo de ejecución (2)
Quiero crear un bean Spring en la configuración de Spring Java con algunos argumentos de constructor pasados en tiempo de ejecución. He creado la siguiente configuración de Java, en la que hay un bean fixedLengthReport que espera algunos argumentos en el constructor.
@Configuration
public class AppConfig {
@Autowrire
Dao dao;
@Bean
@Scope(value = "prototype")
**//SourceSystem can change at runtime**
public FixedLengthReport fixedLengthReport(String sourceSystem) {
return new TdctFixedLengthReport(sourceSystem, dao);
}
}
Pero estoy recibiendo un error que sourceSystem no pudo conectar porque no se encontró ningún bean. ¿Cómo puedo crear bean con argumentos de constructor en tiempo de ejecución?
Estoy usando Spring 4.2
Puede utilizar un bean prototipo junto con un BeanFactory
.
@Configuration
public class AppConfig {
@Autowired
Dao dao;
@Bean
@Scope(value = "prototype")
public FixedLengthReport fixedLengthReport(String sourceSystem) {
return new TdctFixedLengthReport(sourceSystem, dao);
}
}
@Scope(value = "prototype")
significa que Spring no creará una instancia del bean en el inicio, sino que lo hará más tarde cuando lo solicite. Ahora, para personalizar una instancia del bean prototipo, debe hacer lo siguiente.
@Controller
public class ExampleController{
@Autowired
private BeanFactory beanFactory;
@RequestMapping("/")
public String exampleMethod(){
TdctFixedLengthReport report =
beanFactory.getBean(TdctFixedLengthReport.class, "sourceSystem");
}
}
Tenga en cuenta que debido a que su bean no puede ser instanciado en el inicio, no debe Autowire su bean directamente; De lo contrario, Spring intentará crear una instancia del frijol. Este uso causará un error.
@Controller
public class ExampleController{
//next declaration will cause ERROR
@Autowired
private TdctFixedLengthReport report;
}
Su código se ve bien, para obtener el prototipo con parámetros use el método BeanFactory # getBean (nombre de cadena, objeto ... args).
Mire a Spring Java Config: ¿cómo crear un @Bean de ámbito prototipo con argumentos de tiempo de ejecución? BeanFactory # getBean (nombre de cadena, objeto ... args) sería lo que está buscando.
Supongo que su IDEA (en mi caso IntelliJ IDEA versión 15) le da el error y no es un error de tiempo de ejecución / compilación.
En IntelliJ puede cambiar la configuración de las inspecciones de primavera.
- Ir a archivo -> configuración.
- Escriba las inspecciones en el cuadro de búsqueda.
- Vaya a Spring Core-> Code-> Autowire para clases de frijoles.
- Cambio de "Error" a "advertencia débil"