一、实现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. su与sudo用法详解

    su与sudo用法详解 目录 su与sudo用法详解 1. su和sudo详解:切换用户身份 1.1 shell登录类型和环境配置文件 1.2 su进行身份切换 1.3 sudo命令详解 1.3.1 ...

  2. XML Schema(XSD)详解:定义 XML 文档结构合法性的完整指南

    XML Schema描述了 XML 文档的结构.XML Schema语言也称为 XML Schema Definition(XSD). <?xml version="1.0" ...

  3. Linux/Golang/glibC系统调用

    Linux/Golang/glibC系统调用 本文主要通过分析Linux环境下Golang的系统调用,以此阐明整个流程 有时候涉略过多,反而遭到质疑~,写点文章证明自己实力也好 Golang系统调用 ...

  4. debug技巧之使用Arthes调试

    一.前言 大家好啊,我是summo,今天给大家分享一下我平时是怎么调试代码的,不是权威也不是教学,就是简单分享一下,如果大家还有更好的调试方式也可以多多交流哦. 前面我介绍了本地调试和远程调试,今天再 ...

  5. springcloud整合stream解决项目升级的多个消息中间件的收发问题

    cloud stream (一)简介Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架.它可以基于 Spring Boot 来创建独立的.可用于生产的 Spring ...

  6. .NET集成DeveloperSharp实现http网络请求&与其它工具的比较

    爆了,爆了,DeveloperSharp系列近期又被制造业ERP.民航飞行App.建筑BIM.电力掌上营业厅.等多家大型采用,站在巨人的肩膀上你能走的更远. 支持.Net Core2.0及以上,支持. ...

  7. Python爬图片

    1 import requests 2 from lxml import etree 3 4 header = { 5 "user-agent": "Mozilla/5. ...

  8. bpmnjs

    在 bpmn.js 中,`bpmnModeler.get()` 方法用于获取不同的模块,你可以通过这些模块来访问和操作 BPMN 模型的不同部分.以下是一些常用的模块和对应的用途: 1. **Canv ...

  9. echarts做折线图

    先给大家看图 父组件      <el-container v-show="abscissa">         <lineEchart           :C ...

  10. Vue3等比例缩放图片组件

    本文由 ChatMoney团队出品 有些情况我们需要在各种刁钻的情况下都要保持图片比例不变,比如用户缩放窗口等改变布局的情况.实现原理就是通过容器的宽度和内边距在保持你想要的比例. 以下是基础功能的组 ...