解决在SpringBoot反射类中使用@Autowired不生效的问题




由于某些原因,需要使用java的反射机制来创建类

并且在类内使用@Autowired自动装载

但Spring的@Autowired注解,并不能对反射创建的类进行注入,

导致出现java.lang.reflect.InvocationTargetException: null

解决方案如下:

1.new一个自身类型的对象,这个对象不要加@Autowired注解,需要是公开(public)的

2.在需要反射的类中,创建init()函数,用@PostConstruct来注解

3.编写代码初始化第一步中的bean及内部的bean变量

代码: 
public class TestService {
  public void doTest() {
    Class cls = Class.forName("com.test.api.manager.SoftInterface");//包名+类名
    Method method = cls.getMethod("do9100", String.class);
    String str = (String) method.invoke(method, inputData);
  }
}

@Service
public class SoftInterface {
  @Autowired
  private UserDao userDao;
  
  public static SoftInterface soft;//这个不能加@Autowired
  
  @PostConstruct
  public void init() {
    soft = this;
    soft.userDao = userDao;//每一个都要这么处理
    //...
  }
  
  public static String do9100(String inputData) {
    System.out.println(inputData);
    //需要用实例化的bean来进行
    soft.userDao.save();
  }
}

发表评论

    微笑 大笑 拽 大哭 奸笑 流汗 喷血 生气 囧 不爽 晕 示爱 卖萌 吃惊 迷离 爱你 吓死了 呵呵

      已有4条评论

    1. avatar 林浩楠地板
      林浩楠到此一访2019-11-05 21:37 回复
      1. avatar双城男神
        回复了林浩楠:欢迎欢迎 2019-11-06 14:59 回复
    2. avatar repostone板凳
      非技术的路过。2019-10-19 16:37 回复
      1. avatar 萌娜沙发
        路过,踩一脚。 表情2019-09-17 16:31 回复