spring的resolveBeforeInstantiation()方法作用

986 阅读1分钟

1、官方给的注释是有机会返回一个对象

image.png

2、跟进代码,发现这里就是调用了BeanPost的前置后置方法

image.png

3、跟进applyBeanPostProcessorsBeforeInstantiation,主要的代理在这里,

image.png

4、继续跟进,发现只要返回的targetSource不为null则可以进行代理生成方法

image.png

5、跟进getCustomTargetSource,发现targetSource是从TargetSourceCreator对象中获取的,而TargetSourceCreator对象是从数组中遍历的

image.png

6、先进入getTargetSource,发现TargetSource是从createBeanFactoryBasedTargetSource获取的

image.png

7、查看createBeanFactoryBasedTargetSource方法,发现是一个抽象方法(钩子函数),那就是子类实现

image.png

到这里就可以知道需要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;
      }
   }
}