1、官方给的注释是有机会返回一个对象
2、跟进代码,发现这里就是调用了BeanPost的前置后置方法
3、跟进applyBeanPostProcessorsBeforeInstantiation,主要的代理在这里,
4、继续跟进,发现只要返回的targetSource不为null则可以进行代理生成方法
5、跟进getCustomTargetSource,发现targetSource是从TargetSourceCreator对象中获取的,而TargetSourceCreator对象是从数组中遍历的
6、先进入getTargetSource,发现TargetSource是从createBeanFactoryBasedTargetSource获取的
7、查看createBeanFactoryBasedTargetSource方法,发现是一个抽象方法(钩子函数),那就是子类实现
到这里就可以知道需要resolveBeforeInstantiation是留给外面的一个扩展接口,可以自定义TargetSource来实现代理从而不走spring的实例创建方法,通过自定义类继承AbstractBeanFactoryBasedTargetSource,然后放入TargetSourceCreator数组
8、demo
先定义一个简单service
public interface UserService {
void userInfo();
}
@Service
public class UserServiceImpl implements UserService{
@Override
public void userInfo() {
System.out.println("打印了用户信息 UserServiceImpl1");
}
}
自定义targetSource
public class CustomTargetSource extends AbstractBeanFactoryBasedTargetSource {
private static final long serialVersionUID=1231212121L;
@Override
public Object getTarget() throws Exception {
return getBeanFactory().getBean(getTargetBeanName());
}
}
public class CustomTargetSourceCreator extends AbstractBeanFactoryBasedTargetSourceCreator {
@Override
protected AbstractBeanFactoryBasedTargetSource createBeanFactoryBasedTargetSource(Class<?> beanClass, String beanName) {
if (getBeanFactory() instanceof ConfigurableListableBeanFactory) {
if(beanClass.isAssignableFrom(UserServiceImpl.class)) {
return new CustomTargetSource();
}
}
return null;
}
}
@Component
public class SetCustomTargetSourceCreator implements PriorityOrdered, BeanFactoryAware, InitializingBean {
private BeanFactory beanFactory;
private boolean load=false;
@Override
public int getOrder() {
return 45;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
@Override
public void afterPropertiesSet() throws Exception {
if (!load){
AnnotationAwareAspectJAutoProxyCreator annotationAwareAspectJAutoProxyCreator = beanFactory.getBean(AnnotationAwareAspectJAutoProxyCreator.class);
CustomTargetSourceCreator customTargetSourceCreator = new CustomTargetSourceCreator();
customTargetSourceCreator.setBeanFactory(beanFactory);
annotationAwareAspectJAutoProxyCreator.setCustomTargetSourceCreators(customTargetSourceCreator);
load=!load;
}
}
}