spring获取ioc实例

1、BeanFactoryAware接口

实现了BeanFactoryAware接口的类,能够获取到BeanFactory对象,从而可以通过bean工厂获取ioc容器中的实例,BeanFactory也是Spring容器最基本的接口。他负责配置、创建、管理ioc容器中的Bean。


package com.business.platform.spring;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.stereotype.Component;

/**
 * @ClassName BeanUtils
 * @Description: 获取spring ioc容器中的实例工具
 * @Author xsl
 * @Date 2020/9/21 8:51
 */
@Component
public class BeanUtils implements BeanFactoryAware {
    
    
    /**
     * Spring的bean工厂
     */
    private static BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory factory) throws BeansException {
    
    
        beanFactory = factory;
    }

    public static <T> T getBean(String beanName) {
    
    
        return (T) beanFactory.getBean(beanName);
    }
}

2、ApplicationContextAware接口

实现了ApplicationContextAware的类能够获取到ApplicationContext。如果说BeanFactory是Sping的心脏,那么ApplicationContext就是完整的身躯了。在ApplicationContext接口的众多实现类中,有3个是我们经常用到的,并且使用这3个实现类也基本能满足我们Java EE应用开发中的绝大部分需求。

类名称 功 能 描 述
ClassPathXmlApplicationContext 从类路径ClassPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。
FileSystemXmlApplicationContext 从指定的文件系统路径中寻找指定的XML配置文件,找到并装载
XmlWebApplicationContext 从Web应用中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。这是为Web工程量身定制的,使用WebApplicationContextUtils类的getRequiredWebApplicationContext方法可在JSP与Servlet中取得IoC容器的引用
package com.business.platform.spring;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @ClassName BeanUtils
 * @Description: 获取spring ioc容器中的示例工具
 * @Author xsl
 * @Date 2020/9/21 8:51
 */
@Component
public class BeanUtils implements ApplicationContextAware {
    
    
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    
    
        if (BeanUtils.applicationContext == null) {
    
    
            BeanUtils.applicationContext = applicationContext;
        }
    }

    /**
     * 获取applicationContext
     */
    public static ApplicationContext getApplicationContext() {
    
    
        return applicationContext;
    }

    /**
     * 通过name获取 Bean.
     * @param name
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name) {
    
    
        return(T) getApplicationContext().getBean(name);
    }

    /**
     *  通过class获取Bean.
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {
    
    
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 通过name,以及Clazz返回指定的Bean
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name, Class<T> clazz) {
    
    
        return getApplicationContext().getBean(name, clazz);
    }

}

3、BeanFactory和ApplicationContext之间的关系

  1. BeanFactory和ApplicationContext是Spring的两大核心接口,而其中ApplicationContext是BeanFactory的子接口。它们都可以当做Spring的容器,Spring容器是生成Bean实例的工厂,并管理容器中的Bean。在基于Spring的Java EE应用中,所有的组件都被当成Bean处理,包括数据源,Hibernate的SessionFactory、事务管理器等。

  2. 生活中我们一般会把生产产品的地方称为工厂,而在这里bean对象的地方官方取名为BeanFactory,直译Bean工厂(com.springframework.beans.factory.BeanFactory),我们一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文。

  3. Spring的核心是容器,而容器并不唯一,框架本身就提供了很多个容器的实现,大概分为两种类型:一种是不常用的BeanFactory,这是最简单的容器,只能提供基本的DI功能;一种就是继承了BeanFactory后派生而来的ApplicationContext(应用上下文),它能提供更多企业级的服务,例如解析配置文本信息等等,这也是ApplicationContext实例对象最常见的应用场景。

猜你喜欢

转载自blog.csdn.net/qq_44132240/article/details/113329656