首页 > 其他分享 >【SpringBoot】静态方法获取 bean的

【SpringBoot】静态方法获取 bean的

时间:2024-09-11 20:24:27浏览次数:9  
标签:静态方法 SpringBoot spring enabled bean context 工具 public

背景:

使用 springboot,要从spring容器里面取到一个bean,那是很容易的。
但从静态方法里面取出一个bean,有什么方法呢?

比如:
场景1:要写一个工具类,可以提供静态方法去获取一个bean。
场景2:要写一个工具类,可以提供静态方法去获取一个bean,并且这个工具类不能给spring管理(因为常规操作,交给 spirng管理,就得对包进行扫描,一些公共模块,被多处依赖,被迫添加依赖,总感觉不太好。)
场景3:有一个类,想交给spirng进行管理,但它在公共模块,并不想加注解,也不想加包扫描,如果做这样的修改后,其它用到这个类的地方,会有些影响。该怎样做呢

场景1:要写一个工具类,可以提供静态方法去获取一个bean。

方法比较多,
比如:写一个工具类去实现ApplicationContextAware接口,并把这个工具类交给Spring管理,通过这个工具类中的静态方法从spirng容器里面,通过beanName把 bean 捞出来,

@Component
public class ApplicationContextUtil implements ApplicationContextAware {
    private static ApplicationContext context;

    private ApplicationContextUtil() {
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextUtil.setContext(applicationContext);
    }

    public static <T> T getBean(Class<T> t) {
        return context.getBean(t);
    }

    public static Object getBean(String name) {
        return context.getBean(name);
    }

    public static void setContext(ApplicationContext context) {
        ApplicationContextUtil.context = context;
    }
}

使用的时候
XXBean xx = ApplicationContextUtil.getBean(XXBean.class);

这种方式,需要把工具类交给Spring管理,然后,使用的地方就不受该限制了,随便哪里可以从spring容器里面找到对应的 bean。

但这个方法就是有个管理,一个工具类,它受到的限制应该越少越好,比如说,不想在工具类上面添加 @Component,并且工具类的路径,也要被扫描,这个工具类才能真正能用起来。

场景2:要写一个工具类,可以提供静态方法去获取一个bean,并且这个工具类不能给spring管理

有没有不交结spirng管理,却可以使用呢?
方法有,自身不想被spring管理,却又想用 spring 容器里面的内容,咋整呢,
来到场景2

想从spirng容器里面拿bean, 重点就在于 spring管理的上下文,就是 context, 如果把 context 拿到后,其实也就好办了。
方法如下:

还是那个工具类,但不需要再加 @Component 这个注解,把它干掉,也不用实现 ApplicationContextAware 了,就一个很普通的工具类,然后它有一个属性 context, 对应spring 里面的 ConfigurableApplicationContext

public class ApplicationContextUtils {

    public static ApplicationContext context;

    public static void setContext(ApplicationContext applicationContext) {
        context = applicationContext;
    }

    public static <T> T getBean(String beanName, Class<T> requiredType) {
        try{
            return context.getBean(beanName, requiredType);
        } catch (Exception e){
            log.error("get bean error, {}", e.getMessage());
            return null;
        }
    }
}

然后在启动方法里面,把 ConfigurableApplicationContext set 进去,比如

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);
        ApplicationContextUtils.setContext(context);
    }

这样,拿到了 context, 也就可以为所欲为了。
嗯。获取 spirng 容器 bean 的大概如此。。。

场景3:有一个类,想交给spirng进行管理,但它在公共模块,并不想加注解,也不想加包扫描

还有一个问题三,
现在有一个普通的类,想把它加到 spirng 管理, 但又不能对这个类进行任何的修改,就好像是一个第三方的类,想把它加到 Spring 管理。

比如:

import org.springframework.web.client.RestTemplate;

public class DemoApplication {
    // ......

    // 这个 RestTemplate 就是一个普通的类,想把它将给 spring 管理,就可以用这种方法
    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

再比如

@Configuration
public class DemoDataAutoConfig {

    @Value("${data.enabled: false}")
    private boolean enabled;

    @Bean
    public DataConfig dataConfig() {
        return new DataConfig(enabled);
    }

}


// DataConfig 就是一个极度普通的类
public class DataConfig {

    private boolean enabled;

    // Getter 和 Setter
    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public DataConfig(boolean enabled) {
        this.enabled = enabled;
    }
}

DataConfig 是一个普通类,不能/不想对它做改造,不想去扫描这个包路径,那 @Bean 就是一个很不错的方法了。

以上,做下笔记。

标签:静态方法,SpringBoot,spring,enabled,bean,context,工具,public
From: https://www.cnblogs.com/aaacarrot/p/18408919

相关文章

  • 基于数据可视化大屏+SpringBoot的校园篮球信息与购物平台设计和实现(源码+论文+部署讲
    博主介绍:✌全网粉丝50W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、P......
  • 【F173】基于Springboot+vue实现的智慧校园管理系统
    主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。收藏点赞不迷路,关注作者有好处项目描述如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产......
  • springboot个性化大学生线上聊天交友系统
    基于springboot+vue实现的个性化大学生线上聊天交友系统 (源码+L文+ppt)4-017           4系统设计  4.1软件功能模块设计  个性化大学生线上聊天交友分为两个模块,分别是管理员功能模块和用户功能模块。主要功能模块包括:首页、用户、省、市、爱好、......
  • 基于springboot实现的出租车拼车系统
    基于springboot实现的出租车拼车系统(文末源码+lun文+ppt)本系统解决了出租车拼车管理事务中的主要问题,包括以下多个功能模块:用户、司机、实名认证、拼车订单、拼单信息、拼单申请、确认信息、评分信息、取消信息等管理。  本系统采用了JAVA语言、springboot框架,采用了B/S......
  • 基于springboot+vue乒乓球预约管理系统
    基于springboot+vue+mysql实现的乒乓球预约管理系统(源码+数据库+部署视频)###主要技术SpringBoot、LayUI、Vue、MySQL###系统角色用户、管理员###系统功能前台:首页、乒乓球场、公告信息、留言反馈、个人中心后台:个人中心、用户管理、乒乓球场管理、场地类型管理......
  • 如何构建第一个springboot工程
    如何构建第一个springboot工程SpringBoot简单介绍spring框架是轻量级的,但它的配置却是重量级的所以就在原有spring框架的基础上,通过注解的方式进一步简化spring框架的使用,并基于spring框架开发了全新的springboot框架,需要说明的是:springboot不是替代spring的解决......
  • 基于springboot+vue乒乓球预约管理系统
    基于springboot+vue+mysql实现的乒乓球预约管理系统(源码+数据库+部署视频)###主要技术SpringBoot、LayUI、Vue、MySQL###系统角色用户、管理员###系统功能前台:首页、乒乓球场、公告信息、留言反馈、个人中心后台:个人中心、用户管理、乒乓球场管理、场地类型管理......
  • 基于springboot+vue实现的在线商城系统
    系统主要功能:(1)商品管理模块:实现了商品的基本信息录入、图片上传、状态管理等相关功能。(2)商品分类模块:实现了分类的增删改查、分类层级管理、商品分类的关联等功能。(3)订单管理模块:实现了订单的查询、创建、删除、退货等功能。(4)用户管理模块:实现了用户的注册、登录、密码找......
  • 基于Springboot+vue校园求职招聘系统设计
    ......
  • springboot001基于SpringBoot的在线拍卖系统
    ......