一、实现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的四种方式的更多相关文章

  1. HTTP获取信息的四种方式

    HTTP 从网络获取信息的四种方式 GET GET指代你在浏览器中输入网址,浏览网站时做的事.例如,我们使用 http://www.baidu.com 的时候,可以将GET想象成他说:"hi ...

  2. Spring获取bean的几种方式

    工作中需要对一个原本加载属性文件的工具类修改成对数据库的操作当然,ado层已经写好,但是需要从Spring中获取bean,然而,工具类并没有交给Spring来管理,所以需要通过方法获取所需要的bean ...

  3. spring的依赖注入的四种方式,数组与集合注入;引用注入;内部bean注入

    三种注入方式 第一种: 基于构造函数 hi.java (bean) package test_one; public class hi { private String name; public hi ...

  4. Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式

    转自:http://chinazhaokeke.blog.163.com/blog/static/109409055201092811354236  Spring获取ApplicationContex ...

  5. Spring获取bean的一种方式

    随便一百度,网上一大把,并且还不止一种.所以这里就只记录目前用的一种好了. 实现ApplicationContextAware接口 即可: import org.springframework.bea ...

  6. Spring中依赖注入的四种方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...

  7. 【websocket】spring boot 集成 websocket 的四种方式

    集成 websocket 的四种方案 1. 原生注解 pom.xml <dependency> <groupId>org.springframework.boot</gr ...

  8. Spring实战(三)Spring中装配Bean的三种方式---XML、JavaConfig、AutoWire

    创建应用对象之间协作关系的行为称为装配(wiring),这也是依赖注入的本质. Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,而开发者需要告诉Spring需要创建哪些 ...

  9. 使用spring手动获取Bean的时候,不能强转回它自己。

    这个问题好像有点长,描述一下: 就是通过类名的方式获取Bean后,得到一个Object对象,但是这个Object不能再强转回Bean了.抛出的异常时类型转换异常.  java.lang.ClassCa ...

  10. Spring通过构造方法注入的四种方式

    通过构造方法注入,就相当于给构造方法的参数传值 set注入的缺点是无法清晰表达哪些属性是必须的,哪些是可选 的,构造注入的优势是通过构造强制依赖关系,不可能实例化不 完全的或无法使用的bean. Me ...

随机推荐

  1. nim 5. 读写文件

    读文件 假设nim程序相同的文件夹下,有个people.txt文件,内容如下: Alice A. Bob B. Carol C. 读取这个文件的代码 import strutils let conte ...

  2. three.js介绍和学习资料说明

    1.three.js能做什么 Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多.使用最广泛的三维引擎.既然Threejs是一款WebGL ...

  3. Python基础篇(安装)

    Python简介 Python是Guido van Rossum发布于1991年的一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,是一种解释型的,弱类型的高级计算机语言.需要注意的是pyth ...

  4. handsontable有显示值与实际值的下拉框cobbobox扩展

    一.效果与使用 二.代码 /// <reference path="handsontable.full.min.js" /> //封闭在IIFE中 (Handsonta ...

  5. MLOps 学习之旅「GitHub 热点速览」

    又是 AI 神仙打架的一周,上周 OpenAI 发布了最新的 GPT-4o 模型,而谷歌也紧跟着开源了 Gemma 2 模型.随着 AI 大模型不断地变强,各大科技巨头正利用它们重塑自家的产品,这也让 ...

  6. 记录一次HTTPS无法访问的错误

    Https无法连接Nginx,日志报错 *2179 SSL_do_handshake() failed (SSL: error:1420918C:SSL routines:tls_early_post ...

  7. MyBatis数据源模块源码分析

    数据源对象是比较复杂的对象,其创建过程相对比较复杂,对于 MyBatis 创建数据源,具体来讲有如下难点: MyBatis 不但要能集成第三方的数据源组件,自身也提供了数据源的实现: 数据源的初始化参 ...

  8. IDEA使用——常用配置

    一. 设置鼠标悬停代码提示 二. 设置Ctrl+滚乱调整字体大小 三. 设置自动导包(不设置自动导包,我们也可以通过Alt+Enter进行手动导包) 四. 设置显示行号和方法间分隔符 五. 设置代码提 ...

  9. 网页CSS源码

    EntryTag { margin-top:20px; font-size:9pt; color:gray } .topicListFooter { text-align:right; margin- ...

  10. java中判断String类型为空和null的方法

    1.判断一个String类型的变量是否为空(即长度为0)或者为null 在Java中,判断一个String类型的变量是否为空(即长度为0)或者为null,通常需要使用两个条件语句来进行检查.这是因为n ...