有很多小伙伴在创建工具类的时候有可能会用到Spring容器中的某些类,但是在工具类中却是静态变量,那么如何把Spring容器中的bean注入到工具类中呢?
我们知道,jvm在加载某个类的时候,ClassLoader#loadClass方法不会初始化该类(更不会实例化该类),而@Autowared注解是通过构造方法或set方法注入的,该被加载的类并没有实例化也就不会执行构造方法或者set方法,所以也就不可能为静态变量绑定值,这时再使用这个变量就会出现空指针了。
思路一: 既然类加载的时候没有实例化对象,那么我们把工具类交给Spring容器管理,让Spring容器帮我们创建对象,并通过set方法给静态变量赋值。这里要注意set方法不能使用static修饰了。
当然也可以通过构造方法注入,总之原理一样,就是交给Spring容器管理,实例化对象,在实例化对象的时候将Spring中的bean注入进去。
思路二: 如果不想实例化对象,或者工具类的包没有被Spring扫描无法使用注解等,此时我们可以通过其他能获取Spring容器bean的工具类为你的工具类赋值,可以找找你的项目中有没有实现ApplicationContextAware接口的Spring工具类,通过Spring工具类获取bean,然后直接赋值即可。
当然也不是必须要实现ApplicationContextAware接口,不同的项目可能会实现Spring生命周期中的其他接口,其他部分接口也会提供Spring上下文对象的,找到这个上下文对象即可。
两种方法各有优劣,总体来说第二种使用更优雅,不用实例化对象,在开发中根据实际情况选择吧!