Java static方法中使用JavaBean的思考

您所在的位置:网站首页 静态方法可以调用静态方法 Java static方法中使用JavaBean的思考

Java static方法中使用JavaBean的思考

2024-07-09 02:58| 来源: 网络整理| 查看: 265

Java static方法中使用JavaBean的思考 写在前面在静态方法中调用@Autowired注入的对象的方法在static方法内部引入JavaBean对象引入JavaBean对象的一般方式(三种)获取ApplicationContext对象的方式在Static方法中使用ApplicationContext获取类

写在前面

首先,Java语言不支持在静态方法中使用非静态方法,主要原因在于静态方法是没有状态的,在引用非静态方法时会导致NonPointException(这种问题在编译期就会不通过);Java语言会直接限制这样使用。 但是很多时候我们在维护老的代码时,由于框架的一些限制不得不想办法突破这种限制,这时候通常会使用折中的方法,在类中定义一个静态的被引用类,然后用@PostConstruct注解一个init方法,在方法中将该被引用类赋值自动注入的实例,然后在静态方法中就可以使用定义的静态被引用类了。方式如下在静态方法中调用@Autowired注入的对象的方法 我在实际使用时发现这种方式确实可以使用,但是是有限制的,就是在该类的实例调用这个静态方法时可以获取,但当这个类是工具类时,也就是我们一般会使用类名直接调用静态方法时,这个方式就不能工作了,无论如何你注入的引用类都是null,这就没有办法了。那就只能在静态方法内部引入所使用的引用类了。 我们可以借助Spring ApplicationContext的getBean方式来获取引用类的实例。 一句话总结,前面的方式处理后static方法可以采用实例方法的方式调用,后面的方法处理后static方法可以使用类方法的方式调用。

在静态方法中调用@Autowired注入的对象的方法

这里网上有很多例子,我随便摘一个。

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.util.List; @Service // 这里必须要有spring bean的注解,没有可以添加@component public class DataTraceServiceImpl { @Autowired private DataTraceRepository dataTraceRepository; //自动注入引用类 private static DataTraceRepository dataTraceRepositoryStatic; // 创建静态引用类 @PostConstruct public void init() { // 构造完成之后将自动注入的引用类实例赋值给静态应用类 dataTraceRepositoryStatic = this.dataTraceRepository; } /** * 根据实体id查询实体的数据追溯 * @param entityId 实体Id */ public static List count(Integer entityId) { // 这里就这么调用 return dataTraceRepositoryStatic.findAllByEntityId(entityId); } }

这个方法能够使用在于应用类和被引用类都在spring的bean容器中,应用类在调用静态方法时也是采用的实例进行的调用。而当使用类名加静态方法的方式调用,这个方式就无法生效了。

在static方法内部引入JavaBean对象 引入JavaBean对象的一般方式(三种) Autowired自动注入的方式构造方法注入的方式使用ApplicationContext 获取Bean的方式

前两种方式都是在类的层面上进行获取,后一种方式可以在方法中调用。

获取ApplicationContext对象的方式

要想获取Bean还要先获取ApplicationContext对象,它的获取方式同样有三种:(有点不严谨,but anyway 这不是我们关注的重点)

Autowired自动注入的方式构造方法注入的方式实现spring提供的接口 ApplicationContextAware

前两种依旧不可用,那么就要用到第三种方式了

import org.apache.commons.lang3.Validate; import org.springframework.beans.factory.DisposableBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @Component public class SpringContextHolder implements ApplicationContextAware { private ApplicationContext applicationContext; public void show (){ System.out.println(applicationContext.getClass()); } /** * spring 在bean 初始化后会判断是不是ApplicationContextAware的子类,调用setApplicationContext()方法, 会将容器中ApplicationContext传入进去 */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } /** * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. */ @SuppressWarnings("unchecked") public static T getBean(String name) { assertContextInjected(); return (T) applicationContext.getBean(name); } /** * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. */ public static T getBean(Class requiredType) { assertContextInjected(); return applicationContext.getBean(requiredType); } /** * 检查ApplicationContext不为空. */ private static void assertContextInjected() { Validate.validState(applicationContext != null, "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder."); } } 在Static方法中使用ApplicationContext获取类 import java.util.List; public class DataTraceServiceImpl { /** * 根据实体id查询实体的数据追溯 * @param entityId 实体Id */ public static List count(Integer entityId) { DataTraceRepository service = SpringContextHolder.getBean(DataTraceRepository.class); return service.findAllByEntityId(entityId); } }

参考文章: 在静态方法中调用@Autowired注入的对象的方法 SpringBoot中获取ApplicationContext的三种方式



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3