起源: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 */@Componentpublic 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 */@SpringBootApplicationpublic class Application {    public static ConfigurableApplicationContext ac;    public static void main(String[] args) {       ac = SpringApplication.run(Application.class, args);    } }

调用形式

/** * @author: clx * @version: 1.1.0 */@RestControllerpublic 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 */@Componentpublic 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;    }}

调用形式

/** * 形式三 */@Testpublic 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开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!