Spring手动获取bean的四种方式
一、实现BeanFactoryPostProcessor接口
@Component
public class SpringUtil implements BeanFactoryPostProcessor {
private static ConfigurableListableBeanFactory beanFactory;
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
/**
* 通过name获取 Bean对象
* @param name
* @return Object 一个以所给名字注册的bean实例
*/
public static <T> T getBean(String name) {
return (T) beanFactory.getBean(name);
}
/**
* 通过class获取Bean对象
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz){
return beanFactory.getBean(clazz);
}
/**
* 如果BeanFactory包含一个与所给名称匹配的bean对象,则返回true
* @param name
* @return
*/
public static boolean containsBean(String name){
return beanFactory.containsBean(name);
}
/**
* 判断bean对象是一个singleton还是一个prototype
* @param name
* @return
* @throws NoSuchBeanDefinitionException
*/
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException{
return beanFactory.isSingleton(name);
}
/**
* 通过 name获取 bean 的类型
* @param name
* @return
* @throws NoSuchBeanDefinitionException
*/
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException{
return beanFactory.getType(name);
}
/**
* 通过 name 获取 bean定义的别名
* @param name
* @return
*/
public static String[] getAliases(String name){
return beanFactory.getAliases(name);
}
}
二、实现ApplicationContextAware接口
@Component
public class BeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
BeanUtil.applicationContext = applicationContext;
}
/**
* 获取applicationContext
*
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean对象
*
* @param name
* @return
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
/**
* 通过class获取Bean对象
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
/**
* 通过name和Class返回指定的Bean对象
*
* @param name
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
/**
* 获取当前的环境配置
* @return
*/
public static String[] getActiveProfiles(){
return getApplicationContext().getEnvironment().getActiveProfiles();
}
}
三、注解 @PostConstruct 初始化时获取
@Component
public class BeanStatic {
@Autowired
private TestService testService;
@Autowired
private static TestService staticTestService;
/**
* 用于在依赖关系注入完成之后需要执行的方法上
* 执行任何初始化操作
*/
@PostConstruct
public void init() {
// 初始化时把testService对象赋值给当前类定义的静态变量
staticTestService = testService;
}
// 在当前类调用业务接口
public static String getTest() {
return staticTestService.test();
}
}
四、通过启动类ApplicationContext获取
@SpringBootApplication
public class WebApplication {
public static ConfigurableApplicationContext applicationContext;
public static void main(String[] args) {
System.out.println("正在启动。。。");
applicationContext = SpringApplication.run(WebApplication.class, args);
System.out.println("启动成功");
}
}
调用方式
@RestController
@RequestMapping("/bean")
@Api(tags = "手动获取Bean对象测试")
public class BeanController {
@GetMapping("test1")
@ApiOperation("方式一")
@ApiOperationSupport(order = 1)
public IResult test1()
{
TestService testService = SpringUtil.getBean(TestService.class);
String result = testService.test();
return IResult.success(result);
}
@GetMapping("test2")
@ApiOperation("方式二")
@ApiOperationSupport(order = 2)
public IResult test2()
{
TestService testService = BeanUtil.getBean(TestService.class);
String result = testService.test();
return IResult.success(result);
}
@GetMapping("test3")
@ApiOperation("方式三")
@ApiOperationSupport(order = 3)
public IResult test3()
{
String result = BeanStatic.getTest();
return IResult.success(result);
}
@GetMapping("test4")
@ApiOperation("方式四")
@ApiOperationSupport(order = 4)
public IResult test4()
{
TestService testService = WebApplication.applicationContext.getBean(TestService.class);
String result = testService.test();
return IResult.success(result);
}
}
Spring手动获取bean的四种方式的更多相关文章
- HTTP获取信息的四种方式
HTTP 从网络获取信息的四种方式 GET GET指代你在浏览器中输入网址,浏览网站时做的事.例如,我们使用 http://www.baidu.com 的时候,可以将GET想象成他说:"hi ...
- Spring获取bean的几种方式
工作中需要对一个原本加载属性文件的工具类修改成对数据库的操作当然,ado层已经写好,但是需要从Spring中获取bean,然而,工具类并没有交给Spring来管理,所以需要通过方法获取所需要的bean ...
- spring的依赖注入的四种方式,数组与集合注入;引用注入;内部bean注入
三种注入方式 第一种: 基于构造函数 hi.java (bean) package test_one; public class hi { private String name; public hi ...
- Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式
转自:http://chinazhaokeke.blog.163.com/blog/static/109409055201092811354236 Spring获取ApplicationContex ...
- Spring获取bean的一种方式
随便一百度,网上一大把,并且还不止一种.所以这里就只记录目前用的一种好了. 实现ApplicationContextAware接口 即可: import org.springframework.bea ...
- Spring中依赖注入的四种方式
在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入 这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...
- 【websocket】spring boot 集成 websocket 的四种方式
集成 websocket 的四种方案 1. 原生注解 pom.xml <dependency> <groupId>org.springframework.boot</gr ...
- Spring实战(三)Spring中装配Bean的三种方式---XML、JavaConfig、AutoWire
创建应用对象之间协作关系的行为称为装配(wiring),这也是依赖注入的本质. Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,而开发者需要告诉Spring需要创建哪些 ...
- 使用spring手动获取Bean的时候,不能强转回它自己。
这个问题好像有点长,描述一下: 就是通过类名的方式获取Bean后,得到一个Object对象,但是这个Object不能再强转回Bean了.抛出的异常时类型转换异常. java.lang.ClassCa ...
- Spring通过构造方法注入的四种方式
通过构造方法注入,就相当于给构造方法的参数传值 set注入的缺点是无法清晰表达哪些属性是必须的,哪些是可选 的,构造注入的优势是通过构造强制依赖关系,不可能实例化不 完全的或无法使用的bean. Me ...
随机推荐
- uniapp中使用极光推送
1.注册极光账号 2.注册几个主流手机厂商的开发者账号(注册手机厂商,可以保证app进程不在的时候走厂商通道推送消息) 3.配置uniapp极光插件 https://ext.dcloud.net.cn ...
- leaflet 实现地图上标记的发散闪烁动画
先看效果 js文件:blinkmarker.js L.blinkMarker = function (point, property) { // 使用js标签,便于操作,这个temDivEle的作用是 ...
- NET9 AspnetCore将整合OpenAPI的文档生成功能而无需三方库
OpenAPI 规范是用于描述 HTTP API 的标准.该标准允许开发人员定义 API 的形状,这些 API 可以插入到客户端生成器.服务器生成器.测试工具.文档等中.尽管该标准具有普遍性和普遍性, ...
- 部署springboot+vue项目文档(若依ruoyi项目部署步骤)
摘自:https://blog.csdn.net/Dreamboy_w/article/details/104389797 部署springboot+vue项目文档(若依ruoyi项目部署步骤)一:部 ...
- 【C#】操作word 【Aspose.Words】
上图是要填充的word模板,就是一个接口说明文档.那个像书名号括起来的东西就是要替换的,这个东西并不是键盘输入的书名号,它是文档部件的一种,要插入这个东西需要: 打开模板word文件,用office打 ...
- golang errgroup 的超时检测
errgroup 的超时检测通常是一种事后得到结果的方式. errgroup本身并不直接支持超时控制,而是依赖于与之关联的context.Context来实现超时和取消功能. 当context超时时, ...
- flutter 打包web应用指定上下文
使用flutter build web命令打包的应用不包含上下文,只能部署在根目录.如何指定上下文,部署在子目录下呢? 有两种办法: 1.修改web/index.html文件 修改 <base ...
- navicat安装和破解
navicat16.0 下载地址: https://download.navicat.com.cn/download/navicat160_premium_cs_x64.exe 破解教程&破解 ...
- python安装OCR识别库
(1)安装过程 参考的这个博客:https://blog.csdn.net/lanxianghua/article/details/100516187?depth_1-utm_source=distr ...
- Kafka--Rebalance重平衡
Rebalance总览 Rebalance触发条件 (1)消费组成员发生变更,有新消费者加入或者离开,或者有消费者崩溃 (2)消费者组订阅的主题数量发生变更 (3)消费组订阅主题的分区数发生变更 避免 ...