SpringBoot如何使用ApplicationContext获取bean对象

目录
  • 使用ApplicationContext获取bean对象
  • SpringBoot Bean注入的深入研究
    • 下面代码可正常运行
    • 下面代码不能正常运行
    • 比较
    • 解决方案
    • 应用

使用ApplicationContext获取bean对象

编写一个ApplicationContextFactory工厂类

public class ApplicationContextFactory{
 private static ApplicationContext applicationContext = null;
 public static void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  applicationContext = applicationContext;
 }
 public static ApplicationContext getApplicationContext(){
  return applicationContext;
 }
}

在SpringBoot的启动类中设置ApplicationContext

public class Application {
 public static void main(String[] args) {
  ConfigurableApplicationContext app = SpringApplication.run(Application.class, args);
  ApplicationContextFactory.setApplicationContext(app);
 }
}

通过ApplicationContextFactory获取SpringApplication从而获取bean对象

ApplicationContext applicationContext=ApplicationContextFactory.getApplicationContext();
Clazz clazz = applicationContext.getBean(Clazz.class);

SpringBoot Bean注入的深入研究

下面代码可正常运行

DemoService

@Service
public class DemoService {
    public void save(){
        System.out.println("DemoService save");
    }
}

CommonClass

@Component
public class CommonClass {
    @Resource
    private DemoService demoService;
    public void fun(){
        System.out.println("fun");
        demoService.save();
    }
}

Controller

@Resource
private CommonClass commonClass;
@ResponseBody
@GetMapping("/fun")
public void fun(){
    commonClass.fun();
}

下面代码不能正常运行

DemoService

@Service
public class DemoService {
    public void save(){
        System.out.println("DemoService save");
    }
}

CommonClass

public class CommonClass {
    @Resource
    private DemoService demoService;
    public void fun(){
        System.out.println("fun");
        demoService.save();
    }
}

Controller

@ResponseBody
@GetMapping("/fun")
public void fun(){
    CommonClass commonClass = new CommonClass();
    commonClass.fun();
}

比较

比较两个代码发现后者与前者的区别:因后者的CommonClass 没有使用@Component标注,所以在Controller中不能才用注入方式生成CommonClass对象,而是才用new的方式生成了该对象。

这样一来,CommonClass 对象是手工创建,所以在它内部注入DemoService 对象的代码就错误了。

解决方案

新建工具类

@Component
public class ApplicationContextUtil implements ApplicationContextAware {
    private static  ApplicationContext act;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        act = applicationContext;
    }
    /**
     * 根据bean的名字获取工厂中对应的bean对象
     * @param beanName
     * @return
     */
    public static Object getBean(String beanName){
        return act.getBean(beanName);
    }
}

:实际测试发现上面代码中的static不能省略

DemoService

@Service
public class DemoService {
    public void save(){
        System.out.println("DemoService save");
    }
}

CommonClass

public class CommonClass {
    @Resource
    private DemoService demoService;
    public void fun(){
    DemoService demoService = (DemoService) ApplicationContextUtil.getBean("demoService");
        System.out.println("fun");
        demoService.save();
    }
}

此处不再采用注入的方式获取DemoService对象,而是通过工具类的方式

Controller

@ResponseBody
@GetMapping("/fun")
public void fun(){
    CommonClass commonClass = new CommonClass();
    commonClass.fun();
}

再次运行程序,一切正常

应用

在SpringBoot整合Shiro的案例中,自定义Realm时,需要使用Service的对象。因为自定义的Realm类不能使用@Component之类的注解注释,所以使用本案例介绍的方法是正确的解决方案。尽管在1.6.0的shiro-all中下面代码可以正确运行:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot获取ApplicationContext的3种方式

    ApplicationContext是什么? 简单来说就是Spring中的容器,可以用来获取容器中的各种bean组件,注册监听事件,加载资源文件等功能. Application Context获取的几种方式 1 直接使用Autowired注入 @Component public class Book1 { @Autowired private ApplicationContext applicationContext; public void show (){ System.out.printl

  • springboot 使用上下文获取bean

    问题 在使用springboot开发项目过程中,有些时候可能出现说会有在spring容器加载前就需要注入bean的类,这个时候如果直接使用@Autowire注解,则会出现控制针异常! 解决办法 如下: 创建一个springContextUtil类 package cn.eangaie.appcloud.util; import org.springframework.context.ApplicationContext; public class SpringContextUtil { priv

  • Spring在代码中获取bean的几种方式详解

    方法如下 方法一:通过读取XML文件反射生成对象 方法二:通过Spring提供的utils类获取ApplicationContext对象 方法三:继承自抽象类ApplicationObjectSupport 方法四:继承自抽象类WebApplicationObjectSupport 方法五:实现接口ApplicationContextAware 方法六:通过Spring提供的ContextLoader 获取spring中bean的方式总结: 方法一:通过读取XML文件反射生成对象 Applica

  • spring中通过ApplicationContext getBean获取注入对象的方法实例

    用SpringContextUtil实现ApplicationContextAware package util; import java.util.Locale; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; pub

  • Spring通过ApplicationContext主动获取bean的方法讲解

    问题1: 有个异步线程Runnable里面需要用到dao,无法通过AutoWired和compoment注解传递进来. 于是希望通过Spring context主动去获取bean. 问题2: getBean(name)获取失败. 解决: 默认的dao的name=类名(首字母小写) 例如: 接口名称:TemplateDao 则getName("templateDao")即可 通用的SpringContextUtil获取Bean 1.实现ApplicationContextAware接口

  • SpringBoot如何使用ApplicationContext获取bean对象

    目录 使用ApplicationContext获取bean对象 SpringBoot Bean注入的深入研究 下面代码可正常运行 下面代码不能正常运行 比较 解决方案 应用 使用ApplicationContext获取bean对象 编写一个ApplicationContextFactory工厂类 public class ApplicationContextFactory{ private static ApplicationContext applicationContext = null;

  • SpringBoot实现任意位置获取HttpServletRequest对象

    目录 任意位置获取HttpServletRequest对象 方法一 方法二 HttpServletRequest只能读取一次的解决 任意位置获取HttpServletRequest对象 方法一 //获取RequestAttributes RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); //从获取RequestAttributes中获取HttpServletRequest的信息 H

  • Springboot 如何获取上下文对象

    目录 Springboot上下文对象获取 或者更简单的写法: spring boot获取上下文 随时取出被spring管理的bean对象 方法一: 方式二: Springboot上下文对象获取 package it.benjamin.aspirinweb.mem; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.sp

  • Springboot如何通过自定义工具类获取bean

    目录 Springboot 自定义工具类获取bean 在工具类注入bean的三种方式 1. 需求/目的 2.使用环境 3.方法一:获取ApplicationContext上下文 4.方法二:将工具类的对象也添加为bean 5.方法三:在spring Boot 启动时创建工具类自身的静态对象 Springboot 自定义工具类获取bean /** * Created with IntelliJ IDEA. * * @Auther: zp * @Date: 2021/03/26/13:32 * @D

  • Java 如何从spring容器中获取注入的bean对象

    1.使用场景 控制层调用业务层时,控制层需要拿到业务层在spring容器中注入的对象 2.代码实现 import org.apache.struts2.ServletActionContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.suppo

  • Spring实现Aware接口自定义获取bean的两种方式

    在使用spring编程时,常常会遇到想根据bean的名称来获取相应的bean对象,这时候,就可以通过实现BeanFactoryAware来满足需求,代码很简单: @Servicepublic class BeanFactoryHelper implements BeanFactoryAware { private static BeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory

  • spring获取bean的源码解析

    介绍 前面一章说了AbstractApplicationContext中的refresh方法中的invokeBeanFactoryPostProcessors.主要是调用BeanFactoryPostProcessor.其中也有获取bean的过程,就是beanFactory.getBean的方法.这一章就说下getBean这个方法.由于spring中获取bean的方法比较复杂,涉及到的流程也非常多,这一章就先说下整个大体的流程.其中的细节会在后面也会慢慢说. 源码 直接看源码吧 @Overrid

  • Spring通过配置文件管理Bean对象

    目录 一.Bean对象 二.存储Bean对象 1. 添加配置xml文件 2. 创建上下文 三.获取Bean对象 提示:以下是本篇文章正文内容,Java系列学习将会持续更新 一.Bean对象 Bean是Spring框架在运行时管理的对象, 是需要放置在Spring容器中进行管理的. Spring容器: BeanFactory接口(bean工厂)——> ApplicationContext接口(应用上下文)实现Spring容器的方法:基于xml文件.基于注解,我们接下来演示通过修改xml配置文件的方

  • Spring五大类注解读取存储Bean对象的方法

    目录 前情提要 配置spring-config文件 类注解和方法注解 @Controller(控制器存储) @Service(服务存储) @Configuration(配置存储) @Repository(仓库存储) @Component(组件存储) 5大类注解联系 Spring给Bean命名规则 方法注解@Bean 重命名Bean 获取Bean对象(对象装配) 属性注入 构造方法注入 Setter注入 三种注入方式对比 注入同一类型多个Bean对象 前情提要 我们上节内容学习了如何创建\注册\读

  • 详解SpringBoot静态方法获取bean的三种方式

    目录 方式一  注解@PostConstruct 方式二  启动类ApplicationContext 方式三 手动注入ApplicationContext 方式一  注解@PostConstruct import com.example.javautilsproject.service.AutoMethodDemoService; import org.springframework.beans.factory.annotation.Autowired; import org.springfr

随机推荐