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
 * @Description: 通过beanFactory获取spring管理的bean对象工具类
 */
@Component
public class ApplicationContextUtil implements ApplicationContextAware {
    private static ApplicationContext context;

    // springboot加载完成后会把beanfactory作为参数传给次方法,然后我们可以把工厂赋值给context。
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }
    // 通过context获取bean
    public static Object getBean(String beanName) {
        return context.getBean(beanName);
    }
}

在工具类注入bean的三种方式

1. 需求/目的

比如:在进行使用HandlerInterceptorAdapter拦截器时,需要访问数据库来判断是否拦截请求,这时就需要在拦截器的判断类中注入Dao或Service对象来执行sql语句。而直接使用@Autowired无法进行注入。

2.使用环境

spring boot 2.0.3

3.方法一:获取ApplicationContext上下文

在applicationContext对象中可以获取到所有的bean

第一步:准备ApplicationContextAware的实现类,用于获取applicationContext对象

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import com.authstr.ff.utils.exception.Assert;
@Component
public class SpringUtils implements ApplicationContextAware {
    private static Log log = LogFactory.getLog(SpringUtils.class);
    private static ApplicationContext applicationContext;
    public   void setApplicationContext(ApplicationContext applicationContext) {
        SpringUtils.applicationContext = applicationContext;
    }
    private static ApplicationContext getContext() {
        return applicationContext;
    }
    public static Object getBean(String beanId) {
        return SpringUtils.getBean(Object.class, beanId);
    }
    public static <T> T getBean(Class<T> clazz, String beanId) throws ClassCastException {
        ApplicationContext context = SpringUtils.getContext();
        Assert.isTrue(StringUtils.hasText(beanId), "beanId must not null!",true);
        boolean a=context.containsBean(beanId);
        Assert.isTrue(context.containsBean(beanId), "beanId :[" + beanId + "] is not exist!",true);
        Object bean = null;
        bean = context.getBean(beanId);
        return (T)bean;
    }
}

这是已经写好的工具类,可以根据bean的id获取对应的bean

第二步: 对要获取的bean设置id

如:

@Component("basicDaoImpl")
public class BasicDaoImpl extends AbstractDao implements BasicDao

第三步: 在要使用的类中写一个方便调用的方法

public BasicDaoImpl getBasicDaoImpl (){
        return SpringUtils.getBean(BasicDaoImpl .class, "basicDaoImpl");
    }

4.方法二:将工具类的对象也添加为bean

第一步:当前类添加@Component注解

第二步:对要获取的对象使用@Autowired 注解

@Autowired
private BasicDaoImpl basicDaoImpl;

第三步:在创建该工具类的地方,这样定义

@Bean
  public AuthInterceptor authInterceptor(){
        return new AuthInterceptor();
    }

5.方法三:在spring Boot 启动时创建工具类自身的静态对象

在本质上,同方法二

第一步:当前类添加@Component注解

第二步:在工具类创建一个自身的静态对象

public static AuthInterceptor authInterceptor;

第三步:使用@PostConstruct注解,在springboot加载时执行该方法

  @PostConstruct
    public void init() {
        authInterceptor= this;
        AuthInterceptor .authInterceptor= this.authInterceptor;
    }

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

(0)

相关推荐

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

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

  • springboot 获取工具类bean过程详解

    这次的实践经验的起因在于,在开发中,我想在工具类中使用配置文件的变量值.通常使用@value注解,这个只能在spring中管理的bean总获取.之前我也很疑惑,为什么之前的开发人员会在SpringUtil类上加入@Component注解,今天又遇到这种情况,其原因完全理解了. @Component public class SpringUtil implements EnvironmentAware { private static Environment env; public static

  • SpringBoot普通类获取spring容器中bean的操作

    前言 在spring框架中,是无法在普通类中通过注解注入实例的,因为sping框架在启动的时候,就会将标明交给spring容器管理的类进行实例化,并梳理他们彼此的依赖关系,进行注入,没有交给spring容器管理的普通类,是不会进行注入的,即使你使用了注入的相关注解.这个时候,如果我们需要在普通类中获取spring容器中的实例,就需要一些特定的方法,这里将整理一下如何在springboot中实现这样的方法. 创建springboot工程demo 项目结构图示 项目结构说明 service包下为de

  • springboot 使用上下文获取bean

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

  • 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

  • SpringBoot集成Kafka 配置工具类的详细代码

    目录 1.单播模式,只有一个消费者组 2.广播模式,多个消费者组 spring-kafka 是基于 java版的 kafka client与spring的集成,提供了 KafkaTemplate,封装了各种方法,方便操作,它封装了apache的kafka-client,不需要再导入client依赖 <!-- kafka --> <dependency> <groupId>org.springframework.kafka</groupId> <arti

  • SpringBoot结合Redis配置工具类实现动态切换库

    我使用的版本是SpringBoot 2.6.4 可以实现注入不同的库连接或是动态切换库 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.4</version> </parent> <dependency> <

  • Springboot基础之RedisUtils工具类

    SpringBoot整合Redis 引入Redis依赖 <!-- redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 设置Redis的Template RedisConfig.java package cn

  • Springboot内置的工具类之CollectionUtils示例讲解

    前言 实际业务开发中,集合的判断和操作也是经常用到的,Spring也针对集合的判断和操作封装了一些方法,但是最令我惊讶的是,我在梳理这些内容的过程中发现了一些有趣的现象,我的第一反应是不敢相信,再想一想,没错,我是对的.所以强烈建议大家可以认真看完这篇文章,这一篇绝对有价值,因为有趣的是我我竟然发现了Spring的两个bug. org.springframework.util.CollectionUtils 集合的判断 boolean hasUniqueObject(Collection col

  • springboot封装JsonUtil,CookieUtil工具类代码实例

    这篇文章主要介绍了springboot封装JsonUtil,CookieUtil工具类过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JsonUtil public class JsonUtil { private static ObjectMapper objectMapper = new ObjectMapper(); public static String objectToString(Object object) throws

  • springboot实现后台上传图片(工具类)

    本文实例为大家分享了springboot实现后台上传图片的具体代码,供大家参考,具体内容如下 1.先配置启动类 继承WebMvcConfigurer 重写方法 @SpringBootApplication //@MapperScan("com.example.demo.Mapper") public class DemoApplication implements WebMvcConfigurer { public static void main(String[] args) { S

  • Springboot实现多线程注入bean的工具类操作

    场景: 使用springboot多线程,线程类无法自动注入需要的bean 解决方法: 通过工具类获取需要的bean 工具类代码: import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springfram

  • Spring通过工具类实现获取容器中的Bean

    目录 1. Aware 接口 2. BeanFactoryAware 3. TienChin 项目实践 1. Aware 接口 小伙伴们知道,Spring 容器最大的特点在于所有的 Bean 对于 Spring 容器的存在是没有意识的,因此我们常说理论上你可以无缝将 Spring 容器切换为其他容器(然而在现实世界中,我们其实没有这样的选择,除了 Spring 容器,难道还有更好用的?). 当然这只是一个理论,在实际开发中,我们往往要用到 Spring 容器为我们提供的诸多资源,例如想要获取到容

  • Java类获取Spring中bean的5种方式

    获取Spring中的bean有很多种方式,再次总结一下: 第一种:在初始化时保存ApplicationContext对象 ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("beanId"); 说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring. 第二种:通过Spring提供

随机推荐