¿Qué hice mal? ¿Cómo resuelvo el problema?
Aquí :
Map<String,String> someMap = (Map<String,String>)getApplicationContext().getBean("someMap");
Utiliza un método heredado que generalmente no queremos usar, ya que devuelve Object
:
Object getBean(String name) throws BeansException;
El método a favor para obtener (para singleton) / crear (para prototipo) un bean de una fábrica de beans es:
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Utilizándolo como:
Map<String,String> someMap = app.getBean(Map.class,"someMap");
se compilará pero aún con una advertencia de conversión no verificada, ya que todos los Map
objetos no son necesariamente Map<String, String>
objetos.
Pero <T> T getBean(String name, Class<T> requiredType) throws BeansException;
no es suficiente en las clases genéricas de bean, como las colecciones genéricas, ya que eso requiere especificar más de una clase como parámetro: el tipo de colección y sus tipos genéricos.
En este tipo de escenario y, en general, un mejor enfoque es no usar BeanFactory
métodos directamente , sino dejar que el marco inyecte el bean.
La declaración de frijol:
@Configuration
public class MyConfiguration{
@Bean
public Map<String, String> someMap() {
Map<String, String> someMap = new HashMap();
someMap.put("some_key", "some value");
someMap.put("some_key_2", "some value");
return someMap;
}
}
La inyección de frijol:
@Autowired
@Qualifier("someMap")
Map<String, String> someMap;