SpringBoot静态方法获取 bean的三种方式

注意: 调用者要被spring管理

方式一 

注解@PostConstruct

 
  1. import com.example.javautilsproject.service.AutoMethodDemoService;

  2. import org.springframework.beans.factory.annotation.Autowired;

  3. import org.springframework.stereotype.Component;

  4.  
  5. import javax.annotation.PostConstruct;

  6.  
  7. /**

  8. * springboot静态方法获取 bean 的三种方式(一)

  9. * @author: clx

  10. * @date: 2019/7/23

  11. * @version: 1.1.0

  12. */

  13. @Component

  14. public class StaticMethodGetBean_1 {

  15.  
  16. @Autowired

  17. private AutoMethodDemoService autoMethodDemoService;

  18.  
  19. @Autowired

  20. private static AutoMethodDemoService staticAutoMethodDemoService;

  21.  
  22. @PostConstruct

  23. public void init() {

  24. staticAutoMethodDemoService = autoMethodDemoService;

  25. }

  26.  
  27. public static String getAuthorizer() {

  28. return staticAutoMethodDemoService.test();

  29. }

  30. }

注解@PostConstruct说明

PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用 PostConstruct 注释的方法也必须被调用。只有一个方法可以用此注释进行注释。

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

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

 

方式二

实现方式:在springboot的启动类中,定义static变量ApplicationContext,利用容器的getBean方法获得依赖对象

 
  1.  
  2. import org.springframework.boot.SpringApplication;

  3. import org.springframework.boot.autoconfigure.SpringBootApplication;

  4. import org.springframework.context.ConfigurableApplicationContext;

  5. /**

  6. * @author: clx

  7. * @date: 2019/7/23

  8. * @version: 1.1.0

  9. */

  10. @SpringBootApplication

  11. public class Application {

  12. public static ConfigurableApplicationContext ac;

  13. public static void main(String[] args) {

  14. Application.ac = SpringApplication.run(Application.class, args);

  15. }

  16.  
  17. }

调用方式

 
  1.  
  2. /**

  3. * @author: clx

  4. * @date: 2019/7/23

  5. * @version: 1.1.0

  6. */

  7. @RestController

  8. public class TestController {

  9. /**

  10. * 方式二

  11. */

  12. @GetMapping("test2")

  13. public void method_2() {

  14. AutoMethodDemoService methodDemoService = Application.ac.getBean(AutoMethodDemoService.class);

  15. String test2 = methodDemoService.test2();

  16. System.out.println(test2);

  17. }

  18. }

方式三

手动注入ApplicationContext

 
  1.  
  2. import org.springframework.beans.BeansException;

  3. import org.springframework.context.ApplicationContext;

  4. import org.springframework.context.ApplicationContextAware;

  5. import org.springframework.stereotype.Component;

  6.  
  7.  
  8. /**

  9. * springboot静态方法获取 bean 的三种方式(三)

  10. * @author: clx

  11. * @date: 2019/7/23

  12. * @version: 1.1.0

  13. */

  14. @Component

  15. public class StaticMethodGetBean_3<T> implements ApplicationContextAware {

  16. private static ApplicationContext applicationContext;

  17. @Override

  18. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

  19. StaticMethodGetBean_3.applicationContext = applicationContext;

  20. }

  21.  
  22. public static <T> T getBean(Class<T> clazz) {

  23. return applicationContext != null?applicationContext.getBean(clazz):null;

  24. }

  25. }

调用方式

 
  1.  
  2. /**

  3. * 方式三

  4. */

  5. @Test

  6. public void method_3() {

  7. AutoMethodDemoService autoMethodDemoService = StaticMethodGetBean_3.getBean(AutoMethodDemoService.class);

  8. String test3 = autoMethodDemoService.test3();

  9. System.out.println(test3);

  10. }

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值