injection dependency beans bean annotation and java spring spring-bean

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"