たとえば、次のようなことができます。
@Named
public class Foo{
public void blah(){
MyClass myClass = getBean(MyClass.class);
}
private <T> T getBean(Class<T> type) {
return context.getBean(Introspector.decapitalize(type.getSimpleName()), type);
}
}
@Inject
ただし、またはを使用する場合、これは機能しません@Autowire
。
自動配線時に厳密なクラス マッチングを強制するには、 のデフォルトを に置き換えることができますが、AutowireCandidateResolver
NUBDE問題を解決できる、または解決できるため、良い考えとは思えません。BeanFactory
BeanFactoryPostprocessor
@Resource
@Qualify
例: (未テスト)
public class StrictClassAutowireCandidateResolver implements AutowireCandidateResolver {
@Override
public boolean isAutowireCandidate(BeanDefinitionHolder bdHolder, DependencyDescriptor descriptor) {
if (!bdHolder.getBeanDefinition().isAutowireCandidate()) {
return false;
}
if (descriptor == null) {
return true;
}
String className = null;
if (descriptor.getField() != null) {
className = descriptor.getField().getType().getName();
}
else if (descriptor.getMethodParameter() != null) {
className = descriptor.getMethodParameter().getParameterType().getName();
}
Class<?> clazz = null;
try {
clazz = Class.forName(className);
}
catch (Exception e) {
return false;
}
if (clazz.isInterface() || Modifier.isAbstract(clazz.getModifiers())) {
// have no chances to be strict, let BeanFactory to find implementations.
return true;
}
return bdHolder.getBeanDefinition().getBeanClassName().equals(className);
}
@Override
public Object getSuggestedValue(DependencyDescriptor descriptor) {
return null;
}
}