• Spring Boot 获取 bean 的 3 种方式!还有谁不会??


    来源:blog.csdn.net/showchi/article/details/97005720

    注意:调用者要被spring管理

    方式一

    注解@PostConstruct

    import com.example.javautilsproject.service.AutoMethodDemoService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
     
    import javax.annotation.PostConstruct;
     
    /**
     * springboot静态方法获取 bean 的三种方式(一)
     * @author: clx
     * @version: 1.1.0
     */
    @Component
    public class StaticMethodGetBean_1 {
     
        @Autowired
        private AutoMethodDemoService autoMethodDemoService;
     
        @Autowired
        private static AutoMethodDemoService staticAutoMethodDemoService;
     
        @PostConstruct
        public void init() {
            staticAutoMethodDemoService = autoMethodDemoService;
        }
     
        public static String getAuthorizer() {
            return staticAutoMethodDemoService.test();
        }
    }
    

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

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

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

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

    方式二

    启动类ApplicationContext

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

    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);
    }
    

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

    近期热文推荐:

    1.1,000+ 道 Java面试题及答案整理(2021最新版)

    2.别在再满屏的 if/ else 了,试试策略模式,真香!!

    3.卧槽!Java 中的 xx ≠ null 是什么新语法?

    4.Spring Boot 2.5 重磅发布,黑暗模式太炸了!

    5.《Java开发手册(嵩山版)》最新发布,速速下载!

    觉得不错,别忘了随手点赞+转发哦!

  • 相关阅读:
    Appium 服务命令行参数
    DC 输入 输出 时钟 PVT设置
    .synopsys_dc.setup编写
    Excel VBA编程常用语句300句
    C# 泛型单例工厂
    C# Winform与JS交互
    SQL分析“聚集索引、非聚集索引”区别
    C# ClassHelper动态创建程序集和类, 添加/删除类属性
    从30个角度对比 PostgreSQL 和 MySQL
    C# 常用类和命名空间
  • 原文地址:https://www.cnblogs.com/javastack/p/15434645.html
Copyright © 2020-2023  润新知