解决在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条评论