关于Spring Boot获取bean的3种方式

作者:link可 时间:2023-07-08 11:52:15 

在使用spring框架中我们都知道,某个类如果使用了@Service、@Autowire 这种依赖注入的方式引用了其他对象,在另外一个类中,只有通过spring的IOC容重中获取这个类的实例时,那些被依赖的对象才能正确被初始化,否则那些被依赖的对象都是null。 

所以就有一个问题,在普通类中如何获取spring ioc容器中的bean(spring托管的bean)。

我们都知道,在spring中ApplicationContext这个上下文对象是获取bean的基础。

在spring boot中,我们可以通过下面的三种方式来获取Bean。

方式一 注解@PostConstruct

关于Spring Boot获取bean的3种方式

PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。

支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用 PostConstruct 注释的方法也必须被调用。只有一个方法可以用此注释进行注释。

应用 PostConstruct 注释的方法必须遵守以下所有标准:

该方法不得有任何参数,除非是在 EJB * (interceptor) 的情况下,根据 EJB 规范的定义,在这种情况下它将带有一个 InvocationContext 对象 ;
该方法的返回类型必须为 void;
该方法不得抛出已检查异常;
应用 PostConstruct 的方法可以是 public、protected、package private 或 private;
除了应用程序客户端之外,该方法不能是 static;
该方法可以是 final;
如果该方法抛出未检查异常,那么不得将类放入服务中,除非是能够处理异常并可从中恢复的 EJB。

方式二 启动类ApplicationContext

实现方式:在springboot的启动类中,定义static变量ApplicationContext,利用容器的getBean方法获得依赖对象。推荐一个 Spring Boot 基础教程及实战示例:https://github.com/javastacks/javastack

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
/**
* @author: clx
* @version: 1.1.0
*/
@SpringBootApplication
public class Application {
   public static ConfigurableApplicationContext ac;
   public static void main(String[] args) {
      ac = SpringApplication.run(Application.class, args);
   }

}

调用方式

/**
* @author: clx
* @version: 1.1.0
*/
@RestController
public class TestController {
   /**
    * 方式二
    */
   @GetMapping("test2")
   public void method_2() {
       AutoMethodDemoService methodDemoService = Application.ac.getBean(AutoMethodDemoService.class);
       String test2 = methodDemoService.test2();
       System.out.println(test2);
   }
}

方式三 手动注入ApplicationContext

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
* springboot静态方法获取 bean 的三种方式(三)
* @author: clx
* @version: 1.1.0
*/
@Component
public class StaticMethodGetBean_3<T> implements ApplicationContextAware {
   private static ApplicationContext applicationContext;
   @Override
   public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
       StaticMethodGetBean_3.applicationContext = applicationContext;
   }

public static <T> T  getBean(Class<T> clazz) {
       return applicationContext != null?applicationContext.getBean(clazz):null;
   }
}

调用方式

/**
* 方式三
*/
@Test
public void method_3() {
   AutoMethodDemoService autoMethodDemoService = StaticMethodGetBean_3.getBean(AutoMethodDemoService.class);
   String test3 = autoMethodDemoService.test3();
   System.out.println(test3);
}

来源:https://blog.csdn.net/weixin_54585403/article/details/123526693

标签:SpringBoot,获取,bean
0
投稿

猜你喜欢

  • Java中Mybatis-Plus使用方式介绍

    2021-11-14 05:49:56
  • Java 数组交集的实现代码

    2022-01-19 09:09:38
  • SpringBoot自动配置实现流程详细分析

    2023-06-23 13:35:45
  • Java数据结构学习之栈和队列

    2022-02-21 11:32:45
  • Android WebView使用的技巧与一些坑

    2022-10-18 12:57:23
  • OpenCV Java实现人脸识别和裁剪功能

    2022-08-21 01:47:23
  • Android自定义SwipeRefreshLayout高仿微信朋友圈下拉刷新

    2023-01-06 08:51:34
  • Android自定义View实现九宫格图形解锁(Kotlin版)

    2022-04-09 11:10:50
  • Windows下安装ElasticSearch的方法(图文)

    2023-11-25 13:35:35
  • Eclipse+Webservice简单开发实例

    2023-04-10 08:55:29
  • Java11 发布前抓紧掌握这些新特性

    2022-02-08 13:20:58
  • C#实现Excel转PDF时设置内容适应页面宽度

    2022-09-15 19:23:26
  • Spring整合SpringMVC与Mybatis(SSM)实现完整登录功能流程详解

    2022-07-15 10:19:25
  • 最详细的文件上传下载实例详解(推荐)

    2021-12-12 08:18:13
  • 详解App保活实现原理

    2022-01-20 17:59:10
  • 详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

    2023-06-28 04:07:44
  • java设置session过期时间的实现方法

    2022-02-18 20:25:29
  • SpringBoot整合mybatis-plus进阶详细教程

    2023-11-27 05:13:12
  • java中JVM中如何存取数据和相关信息详解

    2023-08-10 03:49:46
  • java 集合----Map、Collection

    2022-11-09 03:39:01
  • asp之家 软件编程 m.aspxhome.com