一、实现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. make编译报错:fatal error: filesystem: 没有那个文件或目录 #include <filesystem>

    报错: fatal error: filesystem: 没有那个文件或目录 #include(filesystem) 解决方法一: 修改头文件 #include <experimental/f ...

  2. 关于UE4对象静态/动态的销毁问题整理(AddToRoot、TWeakObjectPtr)

    1.非UObject对象 即非UObject常规C++对象,创建销毁不赘述.但可以用智能指针:从而不用关心销毁逻辑: TSharedPtr<ClassA> MyObj = MakeShar ...

  3. 线程中使用for循环的add或remove方法的两种方案

    简介 (Introduction): 背景 在使用线程中添加list的元素时,使用add或remove就会产生异常. 分析 该list每当删除/添加一个元素时,集合的size方法的值都会减小1,这将直 ...

  4. Hugging Face 与 Wiz Research 合作提高人工智能安全性

    我们很高兴地宣布,我们正在与 Wiz 合作,目标是提高我们平台和整个 AI/ML 生态系统的安全性. Wiz 研究人员 与 Hugging Face 就我们平台的安全性进行合作并分享了他们的发现. W ...

  5. Netflow/IPFIX 流量收集与分析

    目录 文章目录 目录 Netflow(网络数据流检测协议) IPFIX(网络流量监测) IPFIX 组网架构 IPFIX 应用场景 Usage-based Accounting(基于使用流量的计费) ...

  6. PHP-FPM 运行原理分析

    概述 PHP-FPM 是一种 Master / Worker 多进程运行模式,进程的数量可以通过 php-fpm.conf 进行具体的配置. Master 进程主要负责 CGI.PHP 环境的初始化. ...

  7. 性能优化陷阱之hash真的比strcmp快吗

    最近网上冲浪的时候看到有人分享了自己最近一次性能优化的经验.我向来对性能是比较敏感的,所以就点进去看了. 然而我越看越觉得蹊跷,但本着"性能问题和性能优化要靠性能测试做依据",我不 ...

  8. gossh nohup部署退出解决方法

    ssh 会话远程nohup ./node> node.out & 执行指令,会话退出以后也会导致服务并没有部署成功. 应该使用以下命令:nohup ./node > node.ou ...

  9. C#使用WebView2替代Electron

    C#想要实现Electron那样混合桌面程序可以用以下几个库.本文使用EdgeSharp NanUI​github.com/NetDimension/NanUI Photino​github.com/ ...

  10. windows下载安装ipopt求解器 可用于pyomo调用

    方案一:采用官方编译的应用程序 官方对windows下有已经编译好的应用程序,只需要下载下来,并将ipopt的应用程序所在文件夹路径添加到系统全局环境变量就可以了.这样在利用pyomo或者其他建模工具 ...