【150期】面试官:Spring Boot 静态获取 bean 的三种方式,你知道哪些?
点击上方“Java精选”,选择“设为星标”
别问别人为什么,多问自己凭什么!
下方留言必回,有问必答!
每天 08:35 更新文章,每天进步一点点...
方式一
注解@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 注释的方法也必须被调用。只有一个方法可以用此注释进行注释。推荐:Java进阶学习资料。
应用 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);
}
以上三种方式楼主都测试过可以为完美使用。
作者:chilx
https://blog.csdn.net/showchi/article/details/97005720
本文为CSDN博主「chilx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
精品资料,超赞福利!
3000+ 道面试题在线刷,最新、最全 Java 面试题!
【141期】JDK8 Stream 操作 collectingAndThen:根据对象的属性去重
【142期】List 中 remove() 方法的“陷阱”,被坑惨了!
【143期】面试官问:说一说 Spring 和 Spring Boot 核心的 3 大区别?
【144期】拼多多面试官问:假设使用 Redis, 如何统计独立用户访问量?
【145期】面试官:Java 数组中 new Object[5] 语句是否创建了 5 个对象?
【146期】面试官问:说一说 RabbitMQ 的几种工作模式和优化建议?
【147期】面试官问:说一说 Lombok 中的 @Builder 作用和用法!
【148期】面试官问:select......for update 会锁表还是锁行?
【149期】还在用 Elasticsearch ?事实证明 ClickHouse 更强大!