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