SpringBoot 普通类调用Bean对象的一种方式推荐

 更新时间:2021年11月16日 09:59:02   作者:morro_c137  
这篇文章主要介绍了SpringBoot 普通类调用Bean对象的一种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringBoot 普通类调用Bean对象

有时我们有一些特殊的需要,可能要在一个不被Spring管理的普通类中去调用Spring管理的bean对象的一些方法,比如一般SpringMVC工程在controller中通过

@Autowired
private TestService testService;

注入TestService 接口就可以调用此接口实现类的实现的方法。

但在一般类中显然不可以这么做,注入的 TestService 将会报空指针异常,你无法拿到这个bean,在一般的ssm工程中我们可以通过xml配置把普通类设置成一个bean对象,那么 TestService 就有效了, 或者使用 ApplicationContext 直接读取xml配置中的bean也可以拿到 TestService。`

Spring Boot 已经摒弃了各种繁琐的xml配置,当然就不再使用xml配置的方式,之前在网上看到一种很简便的方式,但现在又找不到链接了,这里做下记录。

在普通类中定义 ApplicationContext 静态变量和set方法

    private static ApplicationContext applicationContext;//启动类set入,调用下面set方法
    public static void setApplicationContext(ApplicationContext context) {
        applicationContext = context;
    }

在启动类中,启动时事实已经生成 ConfigurableApplicationContext 对象, ConfigurableApplicationContext 是 ApplicationContext 接口的实现,这里直接传到普通类的 setApplicationContext 方法就行了

@SpringBootApplication
@ServletComponentScan
public class WxApplication implements EmbeddedServletContainerCustomizer{
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(WxApplication.class, args);
        TestClass.setApplicationContext(applicationContext);
    }
}

由于是静态变量,类加载时 applicationContext 已经存在,就可获取到 TestService 了,唯一不好就是静态变量在服务器启动后将一直存在

public class TestClass {
    private static ApplicationContext applicationContext;//启动类set入,调用下面set方法
    public static void setApplicationContext(ApplicationContext context) {
        // TODO Auto-generated method stub
        applicationContext = context;
    }
    public void getBeanTest(){
        TestService testService  = (TestService)applicationContext.getBean(TestService.class);
    }
}

补充:

在普通 Spring 工程在启动的时候都会通过 org.springframework.web.context.ContextLoaderListener 监听器从加载系统资源并管理bean, Spring 提供的 WebApplicationContextUtils 工具类能在请求时获取到运行时工程的bean,如果看源码就可以知道监听器执行时与 WebApplicationContextUtils 类的关联

//封装一下,类的class和请求request为必要参数
public static <T> T getBean(Class<? extends Object> cla,HttpServletRequest request){
        if(request == null){
            return null;
        }
        return (T)WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext()).getBean(cla);//getBean参数可为bean类的.class或直接是bean的Id
    }
//这样获取bean
TestService testService= (TestService)getBean(TestService.class, request);

SpringBoot 中bean的使用

通常定义bean的方式有三种,注解、xml文件中定义等

但是在采用注解形式定义bean的时候,如果我们没有为bean指定名字,那么spring本身也会为bean指定一个默认的名字,名字命名规则如下:

1、如果类的前两个字母都是大写的话,那么bean的名称就是类的名称。比如类的名称是BEan,那么bean的名称就是BEan.

2、如果类名只是首字母大写,那么bean的名称,就会成为首字母小写的。比如类的名称是Bean,那么bean的名称就是bean

Springboot中bean的使用

很多时候,我们在开发spring boot等相关的spring的web项目时候,使用bean的方式有几种:

1、通过autowired字段来引入bean,这样可以使用bean

2、在程序中,通过spring的ApplicationContext获取某一个bean来做操作

  • @Autowired
  • Bean bean;

针对于第一种,我们形式比较常见,通常autowired这种方式引用bean后,直接通过对象名bean就可以调用对应的方法了

针对于第二种,一般就是直接通过bean名称调用了

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot 如何添加容器启动的初始化逻辑的操作方法

    SpringBoot 如何添加容器启动的初始化逻辑的操作方法

    这篇文章主要介绍了SpringBoot 如何添加容器启动的初始化逻辑,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • spring cloud consul注册的服务报错critical的解决

    spring cloud consul注册的服务报错critical的解决

    这篇文章主要介绍了spring cloud consul注册的服务报错critical的解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Spring配置使用之Bean生命周期详解

    Spring配置使用之Bean生命周期详解

    这篇文章主要介绍了Spring配置使用之Bean生命周期详解,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java 二叉树遍历特别篇之Morris遍历

    Java 二叉树遍历特别篇之Morris遍历

    二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问依次且仅被访问一次。四种遍历方式分别为:先序遍历、中序遍历、后序遍历、层序遍历
    2021-11-11
  • 从一道面试题看你对java的理解程度

    从一道面试题看你对java的理解程度

    这篇文章主要给大家介绍了关于如何从一道面试题看你对java的理解程度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧
    2018-09-09
  • Kafka简单客户端编程实例

    Kafka简单客户端编程实例

    这篇文章主要为大家详细介绍了Kafka简单客户端编程实例,利用Kafka的API进行客户端编程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Intellij IDEA 2018配置Java运行环境的方法步骤

    Intellij IDEA 2018配置Java运行环境的方法步骤

    这篇文章主要介绍了Intellij IDEA 2018配置Java运行环境的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java非递归实现之二叉树的前中后序遍历详解

    java非递归实现之二叉树的前中后序遍历详解

    树的遍历顺序大体分为三种:前序遍历(先根遍历、先序遍历),中序遍历(中根遍历),后序遍历(后根遍历),本文将给大家详细的介绍,对大家的学习或工作具有一定的参考借鉴价值
    2021-09-09
  • 详解JAVA常用的时间操作【实用】

    详解JAVA常用的时间操作【实用】

    本文主要介绍了JAVA一些常用的时间操作,很实用,相信大家在开发项目时会用到,下面就跟小编一起来看下吧
    2016-12-12
  • Netty框架实现TCP/IP通信的完美过程

    Netty框架实现TCP/IP通信的完美过程

    这篇文章主要介绍了Netty框架实现TCP/IP通信,这里使用的是Springboot+Netty框架,使用maven搭建项目,需要的朋友可以参考下
    2021-07-07

最新评论