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之间的关系
-
BeanFactory和ApplicationContext是Spring的两大核心接口,而其中ApplicationContext是BeanFactory的子接口。它们都可以当做Spring的容器,Spring容器是生成Bean实例的工厂,并管理容器中的Bean。在基于Spring的Java EE应用中,所有的组件都被当成Bean处理,包括数据源,Hibernate的SessionFactory、事务管理器等。
-
生活中我们一般会把生产产品的地方称为工厂,而在这里bean对象的地方官方取名为BeanFactory,直译Bean工厂(com.springframework.beans.factory.BeanFactory),我们一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文。
-
Spring的核心是容器,而容器并不唯一,框架本身就提供了很多个容器的实现,大概分为两种类型:一种是不常用的BeanFactory,这是最简单的容器,只能提供基本的DI功能;一种就是继承了BeanFactory后派生而来的ApplicationContext(应用上下文),它能提供更多企业级的服务,例如解析配置文本信息等等,这也是ApplicationContext实例对象最常见的应用场景。