Co zrobiłem źle? Jak rozwiązać problem?
Tutaj:
Map<String,String> someMap = (Map<String,String>)getApplicationContext().getBean("someMap");
Używasz starszej metody, której zazwyczaj nie chcemy używać, ponieważ zwraca Object
:
Object getBean(String name) throws BeansException;
Metodą preferowania uzyskania (dla singletona) / utworzenia (dla prototypu) fasoli z fabryki fasoli jest:
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Używając go, takiego jak:
Map<String,String> someMap = app.getBean(Map.class,"someMap");
będzie się kompilować, ale nadal z nie zaznaczonym ostrzeżeniem o konwersji, ponieważ wszystkie Map
obiekty niekoniecznie są Map<String, String>
obiektami.
Ale <T> T getBean(String name, Class<T> requiredType) throws BeansException;
to nie wystarczy w klasach ogólnych komponentu bean, takich jak kolekcje ogólne, ponieważ wymaga to podania więcej niż jednej klasy jako parametru: typu kolekcji i jej ogólnych typów.
W tego rodzaju scenariuszu i ogólnie lepszym podejściem nie jest stosowanie BeanFactory
metod bezpośrednich , ale umożliwienie ramce wstrzyknięcia fasoli.
Deklaracja fasoli:
@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;
}
}
Wstrzyknięcie fasoli:
@Autowired
@Qualifier("someMap")
Map<String, String> someMap;