前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Spring 获取bean的八种方式

Spring 获取bean的八种方式

作者头像
小石头
发布于 2022-12-21 08:09:16
发布于 2022-12-21 08:09:16
89000
代码可运行
举报
文章被收录于专栏:小石头小石头
运行总次数:0
代码可运行

1、在初始化时保存ApplicationContext对象

适用于Spring框架的独立应用程序,须要程序通过配置文件初始化Spring。

applicationContext.xml配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="test" class="com.sxtx.bean.Test">
</bean>

</beans>

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void test() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    //ApplicationContext applicationContext = new FileSystemXmlApplicationContext("applicationContext.xml"); 
    Test test= (Test) applicationContext.getBean("test");
    System.out.println(test);
}

2、通过Spring提供的工具类获取ApplicationContext对象

适合于Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象。然后在通过它获取须要的类实例。以下两个工具方式的差别是,前者在获取失败时抛出异常。后者返回null。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc); 
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc); 
ac1.getBean("beanId"); 
ac2.getBean("beanId");  

3、实现接口ApplicationContextAware(推荐)

实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,扫描到该类,就会通过该方法将ApplicationContext对象注入。然后在代码中就可以获取spring容器bean了。

例如:

User bean = SpringUtils.getBean(“user”);

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class SpringUtils implements ApplicationContextAware {
 
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringUtils.applicationContext = applicationContext;
    }
 
    public static <T> T getBean(String beanName) {
        if(applicationContext.containsBean(beanName)){
            return (T) applicationContext.getBean(beanName);
        }else{
            return null;
        }
    }
 
    public static <T> Map<String, T> getBeansOfType(Class<T> baseType){
        return applicationContext.getBeansOfType(baseType);
    }
}

4、继承自抽象类ApplicationObjectSupport

调用父类的getApplicationContext()方法,获取Spring容器对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
public class SpringContextHelper extends ApplicationObjectSupport {

    public Object getBean(String beanName) {
        return getApplicationContext().getBean(beanName);
    }
}

5、继承自抽象类WebApplicationObjectSupport

调用getWebApplicationContext()获取WebApplicationContext

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
public class SpringContextHelper extends WebApplicationObjectSupport {

    public Object getBean(String beanName) {
        return getApplicationContext().getBean(beanName);
    }
}

6、使用BeanFactory直接获取(不推荐)

使用BeanFactory从工厂中直接获取Bean实例,但是XmlBeanFactory类已经废弃,因此不建议使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void test() {
    BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
    Test test= (Test) beanFactory.getBean("test");
    System.out.println(test);
}

7、使用ContextLoader提供的getCurrentWebApplicationContext方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void test() {
    MockServletContext sc = new MockServletContext("");
    sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, "/applicationContext.xml");
    ServletContextListener listener = new ContextLoaderListener();
    ServletContextEvent event = new ServletContextEvent(sc);
    listener.contextInitialized(event);
    
    WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
    Test test= (Test) wac.getBean("test");
    System.out.println(test);
}

8、实现接口BeanFactoryPostProcessor

spring工具类 方便在非spring管理环境中获取bean

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public final class SpringUtilsS implements BeanFactoryPostProcessor
{
    /** Spring应用上下文环境 */
    private static ConfigurableListableBeanFactory beanFactory;

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
    {
        SpringUtilsS.beanFactory = beanFactory;
    }

    /**
     * 获取对象
     *
     * @param name
     * @return Object 一个以所给名字注册的bean的实例
     * @throws BeansException
     *
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException
    {
        return (T) beanFactory.getBean(name);
    }

    /**
     * 获取类型为requiredType的对象
     *
     * @param clz
     * @return
     * @throws BeansException
     *
     */
    public static <T> T getBean(Class<T> clz) throws BeansException
    {
        T result = (T) beanFactory.getBean(clz);
        return result;
    }

    /**
     * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
     *
     * @param name
     * @return boolean
     */
    public static boolean containsBean(String name)
    {
        return beanFactory.containsBean(name);
    }

    /**
     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
     *
     * @param name
     * @return boolean
     * @throws NoSuchBeanDefinitionException
     *
     */
    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException
    {
        return beanFactory.isSingleton(name);
    }

    /**
     * @param name
     * @return Class 注册对象的类型
     * @throws NoSuchBeanDefinitionException
     *
     */
    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException
    {
        return beanFactory.getType(name);
    }

    /**
     * 如果给定的bean名字在bean定义中有别名,则返回这些别名
     *
     * @param name
     * @return
     * @throws NoSuchBeanDefinitionException
     *
     */
    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException
    {
        return beanFactory.getAliases(name);
    }

    /**
     * 获取aop代理对象
     * 
     * @param invoker
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T getAopProxy(T invoker)
    {
        return (T) AopContext.currentProxy();
    }
}

扩展

BeanFactoryApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContextBeanFactory的子接口。

BeanFactory

(1)、是Spring里面最底层的接口(最原始的接口),包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。

(2)、采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。这样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。

(3)BeanFactory通常以编程的方式被创建。

(4)BeanFactoryApplicationContext都支持BeanPostProcessorBeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。

(5) 占用内存小。

ApplicationContext

1、ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:

  • 继承MessageSource,因此支持国际化。
  • 统一的资源文件访问方式。
  • 提供在监听器中注册bean的事件。
  • 同时加载多个配置文件。
  • 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层。

2、ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入。ApplicationContext启动后预载入所有的单实例Bean,通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。

3、ApplicationContext 占用内存空间大,当程序的配置bean特别多时,程序启动慢。

4、ApplicationContext 能以编程式方式创建,还能能以声明的方式创建,如使用ContextLoader

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring获取Bean的9种方式
随着SpringBoot的普及,Spring的使用也越来越广,在某些场景下,我们无法通过注解或配置的形式直接获取到某个Bean。比如,在某一些工具类、设计模式实现中需要使用到Spring容器管理的Bean,此时就需要直接获取到对应的Bean。
程序新视界
2023/01/14
2.3K0
面试官:Spring中获取Bean有几种方式?
5、使用Spring提供的工具类WebApplicationContextUtils
田维常
2022/11/25
9730
面试官:Spring中获取Bean有几种方式?
Spring 容器中获取 Bean 实例的主要方式
使用BeanFactory从工厂中直接获取Bean实例,但是XmlBeanFactory类已经废弃,因此不建议使用,测试代码如下:
BUG弄潮儿
2022/12/05
6060
Java工具集-Spring工具(获取Spring容器中的Bean对象)
引入依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>5.1.9.RELEASE</version> </dependency> 代码示例 package *; import org.springframework.beans.BeansEx
cwl_java
2019/10/26
1.5K0
Spring在代码中获取bean的几种方式
说明:这样的方式适用于Spring框架的独立应用程序,须要程序通过配置文件初始化Spring。
yaphetsfang
2020/07/30
4.1K0
工具类如何获取到 Spring 容器中的 Bean?
松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。 ---- 1. Aware 接口 小伙伴们知道,Spring 容器最大的特点在于所有的 Bean 对于 Spring 容器的存在是没有意识的,因此我们常说理论上你可以无缝将 Spring 容器切换为其他容器(然而在现实世界中,我们其实没有这样的选择,除了 Spring 容器,难道还有
江南一点雨
2022/06/24
1.4K0
工具类如何获取到 Spring 容器中的 Bean?
面试官:spring的BeanFatory和FactoryBean区别
BeanFactory是bean工厂,是 IoC 容器的核心接口,提供了获取bean,或者判断bean类型的各种接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。BeanFactory有很多子类,对已有的功能提供了很多扩展,其中最重要的子类就是 ApplicationContext,如图。
苏三说技术
2020/10/15
5750
面试官:spring的BeanFatory和FactoryBean区别
51. 一道阿里面试题:说说你知道的关于BeanFactory和FactoryBean的区别
BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。
用户11332765
2024/11/01
680
Spring之BeanFactory和FactoryBean接口的区别
  Spring框架中的BeanFactory接口和FactoryBean接口因为名称相似,老是容易搞混淆,而且也是面试过程中经常会碰到的一个问题。所以本文就专门给大家整理出来。
用户4919348
2019/04/02
4520
Spring之BeanFactory和FactoryBean接口的区别
spring-boot使用aop进行日志记录
运行项目,然后访问上述controller,然后查看控制台和数据库中相应的表是否有对应数据
earthchen
2020/09/24
9000
Spring官网阅读(十三)ApplicationContext详解(下)
前面我们也提到了ApplicationContext继承了BeanFactory接口,其继承关系如下:
程序员DMZ
2020/07/06
1.4K0
Spring 源码系列之容器概览~
松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
江南一点雨
2020/09/14
5330
Spring 源码分析(二)之 Spring IOC 容器源码分析
spring.xml文件中保存了我们对Bean的描述配置,BeanFactory会读取这些配置然后生成对应的Bean。
zoro
2019/04/11
5391
Spring 源码分析(二)之 Spring IOC 容器源码分析
Spring BeanFactory 容器
BeanFactory简称bean工厂,是整个spring的核心父类,也是IOC容器或对象的工厂,类是:org.springframework.beans.factory.BeanFactory,是一个接口类,主要定义一些接口的功能为子类来实现。ApplicationContext、ClassPathXmlApplicationContext、FileSystemXmlApplicationContext等,这些都是BeanFactory的各种功能实现。
逍遥壮士
2020/09/18
3820
Spring BeanFactory 容器
Spring在代码中获取Bean的方式
方法一:在初始化时保存ApplicationContext对象 方法二:通过Spring提供的utils类获取ApplicationContext对象 方法三:继承自抽象类ApplicationObjectSupport 方法四:继承自抽象类WebApplicationObjectSupport 方法五:实现接口ApplicationContextAware 方法六:通过Spring提供的ContextLoader
BUG弄潮儿
2022/06/30
2.2K0
一文带你解读Spring5源码解析 IOC之开启Bean的加载,以及FactoryBean和BeanFactory的区别。
通过往期的文章我们已经了解了Spring对XML配置文件的解析,将分析的信息组装成BeanDefinition,并将其保存到相应的BeanDefinitionRegistry中,至此Spring IOC的初始化工作已经完成,这篇文章主要对Bean的加载进行一个深入的了解及探索。
@派大星
2023/06/28
2100
一文带你解读Spring5源码解析 IOC之开启Bean的加载,以及FactoryBean和BeanFactory的区别。
Spring之BeanPostProcessor(后置处理器)介绍
  为了弄清楚Spring框架,我们需要分别弄清楚相关核心接口的作用,本文来介绍下BeanPostProcessor接口
用户4919348
2019/04/02
12.5K0
Spring 如何从 IoC 容器中获取对象?
前面几篇文章主要分析了 Spring IoC 容器如何初始化,以及解析和注册我们定义的 bean 信息。
WriteOnRead
2021/03/12
10.3K0
Spring 如何从 IoC 容器中获取对象?
【小家Spring】BeanFactory体系和ApplicationContext体系,两大体系各接口分析、区别和联系
前面已经讲述了很多Spring容器启动、解析、依赖注入等等源码层面的东西了,但是小伙伴有没有一种感觉就是:Spring的设计者把面向对象使用到了极致(使用得非常的好),并且它吧职责单一原则也是使用到了极致。
YourBatman
2019/09/03
1.9K0
【小家Spring】BeanFactory体系和ApplicationContext体系,两大体系各接口分析、区别和联系
BeanFactory与FactoryBean的区别与联系
BeanFactory顾名思义:生产和管理bean的工厂。它是IOC容器的规范接口,Spring中有很多个BeanFactory的实现,如DefaultListableBeanFactory,XmlBeanFactory,ClassPathXmlApplicationContext,ApplicationContext等等。
冰枫
2018/04/19
1.7K1
BeanFactory与FactoryBean的区别与联系
推荐阅读
相关推荐
Spring获取Bean的9种方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档