乐趣区

关于java: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 开发手册(嵩山版)》最新公布,速速下载!

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

退出移动版