in support/guice/src/main/java/org/apache/shiro/guice/BeanTypeListener.java [91:125]
public <I> void hear(TypeLiteral<I> type, final TypeEncounter<I> encounter) {
PropertyDescriptor[] propertyDescriptors = beanUtilsBean.getPropertyUtils().getPropertyDescriptors(type.getRawType());
final Map<PropertyDescriptor, Key<?>> propertyDependencies
= new HashMap<PropertyDescriptor, Key<?>>(propertyDescriptors.length);
final Provider<Injector> injectorProvider = encounter.getProvider(Injector.class);
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
if (propertyDescriptor.getWriteMethod() != null
&& Modifier.isPublic(propertyDescriptor.getWriteMethod().getModifiers())) {
Type propertyType = propertyDescriptor.getWriteMethod().getGenericParameterTypes()[0];
propertyDependencies.put(propertyDescriptor, createDependencyKey(propertyDescriptor, propertyType));
}
}
encounter.register(new MembersInjector<I>() {
public void injectMembers(I instance) {
for (Map.Entry<PropertyDescriptor, Key<?>> dependency : propertyDependencies.entrySet()) {
try {
final Injector injector = injectorProvider.get();
Object value = injector.getInstance(getMappedKey(injector, dependency.getValue()));
dependency.getKey().getWriteMethod().invoke(instance, value);
} catch (ConfigurationException e) {
// This is ok, it simply means that we can't fulfill this dependency.
// Is there a better way to do this?
} catch (InvocationTargetException e) {
throw new RuntimeException("Couldn't set property " + dependency.getKey().getDisplayName(), e);
} catch (IllegalAccessException e) {
throw new RuntimeException("We shouldn't have ever reached this point,"
+ " we don't try to inject to non-accessible methods.", e);
}
}
}
});
}