Spring Boot 获取 bean 的 3 种方式,我看还有谁不会?

文章介绍了在SpringBoot应用中,使用@PostConstruct注解进行初始化操作的规则,以及两种获取bean的方法:通过启动类的ApplicationContext静态变量和实现ApplicationContextAware接口手动注入。这些方法都在实际开发中常用,且已通过测试验证可行。

方式一

注解@PostConstruct

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

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

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

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

方式二

启动类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);
}

以上三种方式楼主都测试过可以为完美使用。

### Spring Boot获取 Bean 的方法 在 Spring Boot 应用程序中,有多种方式可以获取Spring IoC 容器管理的 Bean。以下是几种常见的方法及其适用场景: #### 1. 使用 `@Autowired` 注解自动装配 这是最常用的方式之一,适用于大多数情况下需要依赖注入的地方。通过 `@Autowired` 注解可以直接将所需的 Bean 自动注入到目标类中。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class MyService { @Autowired private AnotherService anotherService; public void doSomething() { anotherService.performAction(); } } ``` 这种方式简单直观,适合于组件之间的协作开发[^1]。 --- #### 2. 使用 `ApplicationContext` 获取 Bean 如果某些地方无法直接使用依赖注入(例如静态方法),可以通过 `ApplicationContext` 来手动获取 Bean 实例。 ```java import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class ApplicationContextProvider implements ApplicationContextAware { private static ApplicationContext context; @Override public void setApplicationContext(ApplicationContext applicationContext) { context = applicationContext; } public static Object getBean(String beanName) { return context.getBean(beanName); } } // 调用示例 MyService myServiceInstance = (MyService) ApplicationContextProvider.getBean("myService"); ``` 这种方法利用了一个全局可用的工具类来访问 Spring 容器中的 Bean[^2]。 --- #### 3. 使用 `SpringContextHolder` 或类似的工具类 为了简化对静态上下文中 Bean 的访问,许多项目会定义类似于 `SpringContextHolder` 的辅助类。这种模式通常用于非 Spring 管理的对象或者静态环境中。 ```java import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class SpringContextHolder implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext ctx) throws BeansException { applicationContext = ctx; } public static <T> T getBean(Class<T> clazz) { return applicationContext.getBean(clazz); } } // 调用示例 MyService myServiceInstance = SpringContextHolder.getBean(MyService.class); ``` 此方法提供了一种更优雅的方式来处理静态环境下的 Bean 访问需求[^3]。 --- #### 4. 在普通 Java 类中动态获取 Bean 对于一些特殊场景(比如工具类或第三方库扩展),可能需要在一个普通的 Java 类中获取 Spring 管理的 Bean。此时可以借助前面提到的 `ApplicationContext` 工具类或其他自定义机制完成操作。 ```java public class NonSpringManagedClass { public void performTask() { MyService service = (MyService) ApplicationContextProvider.getBean("myService"); service.doSomething(); } } ``` 上述代码展示了如何在未被 Spring 管理的类中调用容器内的服务实例[^4]。 --- #### 总结 以上介绍了四种主要的 Spring Boot 获取 Bean 的方法,每种都有其特定的应用范围和优缺点。开发者应根据实际业务逻辑选择最适合的技术方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值