@Lazy
Lazy注解会通过ProxyFactoty拿到一个被注解的代理对象,然后在使用使用的时被代理对象时,且这时才会创建被代理对象。
protected Object buildLazyResolutionProxy(final DependencyDescriptor descriptor, @Nullable final String beanName) {
BeanFactory beanFactory = this.getBeanFactory();
Assert.state(beanFactory instanceof DefaultListableBeanFactory, "BeanFactory needs to be a DefaultListableBeanFactory");
final DefaultListableBeanFactory dlbf = (DefaultListableBeanFactory)beanFactory;
TargetSource ts = new TargetSource() {
public Class<?> getTargetClass() {
return descriptor.getDependencyType();
}
public boolean isStatic() {
return false;
}
public Object getTarget() {
Set<String> autowiredBeanNames = beanName != null ? new LinkedHashSet(1) : null;
//获取被代理对象
Object target = dlbf.doResolveDependency(descriptor, beanName, autowiredBeanNames, (TypeConverter)null);
if (target == null) {
Class<?> type = this.getTargetClass();
if (Map.class == type) {
return Collections.emptyMap();
} else if (List.class == type) {
return Collections.emptyList();
} else if (Set.class != type && Collection.class != type) {
throw new NoSuchBeanDefinitionException(descriptor.getResolvableType(), "Optional dependency not present for lazy injection point");
} else {
return Collections.emptySet();
}
} else {
if (autowiredBeanNames != null) {
Iterator var3 = autowiredBeanNames.iterator();
while(var3.hasNext()) {
String autowiredBeanName = (String)var3.next();
if (dlbf.containsBean(autowiredBeanName)) {
dlbf.registerDependentBean(autowiredBeanName, beanName);
}
}
}
return target;
}
}
public void releaseTarget(Object target) {
}
};
//创建代理对象
ProxyFactory pf = new ProxyFactory();
pf.setTargetSource(ts);
Class<?> dependencyType = descriptor.getDependencyType();
if (dependencyType.isInterface()) {
pf.addInterface(dependencyType);
}
return pf.getProxy(dlbf.getBeanClassLoader());
}