这次工作中遇到一个问题, 在工具类里面引入bean实例。
我们都知道, 工具类的方法都要写成静态的,也就是要加static,故引入的bean实例也要是静态的,才能在方法中使用。我们都知道,如果不是静态的,直接通过@Autowired 注解可以实现注入,但是静态方法不行,这样获得的是null。
下面说一下2种在工具类中注入bean实例的方法。
以往,我们使用spring的时候获取applicationcontext都是通过ClassPathXmlApplicationContext通过加载application.xml 来获取。
现在,我们使用springboot项目,不再有application.xml ,所以下面介绍一下springboot获取applicationcontext的方法。
一、通过SpringBeanUtils工具类。
首先,让我们看一下springboot 的启动类
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
然后我们看看run方法的返回值是
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) { return run(new Class<?>[] { primarySource }, args);}
可以看到是ConfigurableApplicationContext 再来看看这个类
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {
}
我们可以看到他继承了ApplicationContext这个类
这样我们就获得applicationContext
ApplicationContext applicationContext = SpringApplication.run(Application.class, args);
然后我们写一个SpringBeanUtils工具类
@Component
public class SpringBeanUtils {
private static ApplicationContext context;
public static void setContext(ApplicationContext applicationContext) { SpringBeanUtils.context = applicationContext; }
//通过name获取 Bean.
public static Object getBean(String name) { return context.getBean(name); }
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz) { return context.getBean(clazz); }
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) { return context.getBean(name, clazz); }}
然后在springboot启动类Application中把刚获得的applicationcontext通过SpringBeanUtils 的set方法注入。
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(Application.class, args); SpringBeanUtils.setContext(applicationContext);
}
最后,我们在我们的util工具类里面通过getBean注入就可以了
public class SelectUtils { private static CommodityService commodityService = (CommodityService) SpringBeanUtils.getBean("commodityService");
}
二、通过 @Autoware 注解注入非静态实例,然后用构造方法把注入的实例赋值给静态属性。
1.首先需要注意的是,当前工具类上面要加@Component注解
2.通过@Autoware注入实例
@Autowiredprivate CommodityService commodityServiceTemp;
3.声明静态属性
private static CommodityService commodityService;
4.构造方法赋值
public SelectUtils(CommodityService commodityService) {SelectUtils.commodityServiceTemp = commodityService;}
注:构造方法可以换成
① setter 注入(@Autowired是必须的)
@Autowired
public void setCommodityService(CommodityService commodityServiceTemp) { SelectUtils.commodityService = commodityServiceTemp;}
② @PostConstruct 注解注入
@PostConstruct
public void init(){commodityServiceTemp =commodityService;}
以上就是注入静态bean实例的方法。
注: