• Spring(二)- BeanFactory与ApplicationContext


    一、Spring框架的诞生

    1. Spring 框架概述

    spring是一个开源的轻量级Java开发应用框架,可以简化企业级应用开发。
    Spring解决了开发者在JavaEE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。是当前企业中Java开发几乎不能缺少的框架之一。
    Spring的生态及其完善,不管是Spring哪个领域的解决方案都是依附于Spring Framework基础框架上的。

    2. Spring 框架的历史

    ⚫ Jsp 默默扛下所有;
    ⚫ MVC+三层架构分工明确,但开发成本及其高;
    ⚫ EJB 重量级框架出现,走出一个困境,又进入另一个困境;
    ⚫ Spring 春天来到,随之,SSH风生水起、称霸武林;
    ⚫ Spring 稳住江湖大哥位置,SSM开始上位;
    ⚫ Spring 本着“拿来主义”的思维快速发展,生态不断健全;
    ⚫ SpringBoot 又一里程碑崛起,把“约定大于配置“思想玩的炉火纯青;
    ⚫ SpringCloud 打包了微服务众多解决方案,应对互联网项目更加easy!

    3. Spring Framework技术栈图示

    在这里插入图片描述

    二、BeanFactory实现IoC控制反转思想

    根据下图,分析一下Spring的BeanFactory的开发步骤:

    在这里插入图片描述

    1)导入Spring的jar包或Maven坐标;
    2)定义UserService接口及其UserServiceImpl实现类;
    3)创建beans.xml配置文件,将UserServiceImpl的信息配置到该xml中;
    4)编写测试代码,创建BeanFactory,加载配置文件,获取UserService实例对象。

    1. 导入Spring的jar包或Maven坐标

     
    <dependency> 
    	<groupId>org.springframeworkgroupId> 
    	<artifactId>spring-contextartifactId> 
    	<version>5.3.7version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    2. 定义UserService接口及其UserServiceImpl实现类

    public interface UserService {}
    public class UserServiceImpl implements UserService {}
    
    • 1
    • 2

    3. 创建beans.xml配置文件,将UserServiceImpl的信息配置到该xml中

    <bean id="userService" class="com.itheima.service.impl.UserServiceImpl">bean>
    
    • 1

    4. 编写测试代码,创建BeanFactory,加载配置文件,获取UserService实例对象

    // 创建BeanFactory
    DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
    // 创建读取器
    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
    // 加载配置文件
    reader.loadBeanDefinitions("beans.xml");
    // 获取Bean实例对象
    UserDao userService = (UserService) beanFactory.getBean("userService");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    三、BeanFactory实现DI依赖注入思想

    上面使用BeanFactory完成了IoC思想的实现,下面去实现以下DI依赖注入:
    1)定义UserDao接口及其UserDaoImpl实现类;
    2)修改UserServiceImpl代码,添加一个setUserDao(UserDao userDao)用于接收注入的对象;
    3)修改beans.xml配置文件,在UserDaoImpl的< bean>中嵌入< property>配置注入;
    4)修改测试代码,获得UserService时,setUserService方法执行了注入操作。

    1. 定义UserDao接口及其UserDaoImpl实现类

    public interface UserDao {}
    public class UserDaoImpl implements UserDao {}
    
    • 1
    • 2

    2. 修改UserServiceImpl代码,添加一个setUserDao(UserDao userDao)用于接收注入的对象

    public class UserServiceImpl implements UserService {
    	
    	private UserDao userDao;
    	// BeanFactory调用此处的setUserDao方法,从容器中获取userDao设置到此处
    	public void setUserDao(UserDao userDao) {
    		this.userDao = userDao;
    		System.out.println(userDao);
    	} 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3. 修改beans.xml配置文件,在UserDaoImpl的< bean>中嵌入< property>配置注入

    
    <bean id="userService" class="com.itheima.service.impl.UserServiceImpl"> 
    	
    	
    	<property name="userDao" ref="userDao"/>
    bean>
    
    <bean id="userDao" class="com.itheima.service.impl.UserDaoImpl">bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4. 编写测试代码,创建BeanFactory,加载配置文件,获取UserService实例对象

    // 创建BeanFactory
    DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
    // 创建读取器
    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
    // 加载配置文件
    reader.loadBeanDefinitions("beans.xml");
    //获取Bean实例对象
    UserService userService = (UserService) beanFactory.getBean("userService");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    将断点打在UserService调试发现,创建完userService后,同时userDao也被注入到userService中

    在这里插入图片描述
    在这里插入图片描述

    四、ApplicationContext

    ApplicationContext 称为Spring容器,内部封装了BeanFactory,比BeanFactory功能更丰富更强大,使用ApplicationContext 进行开发时,xml配置文件的名称习惯写成applicationContext.xml

    // 创建ApplicationContext,加载配置文件,实例化容器
    ApplicationContext applicationContext = new ClassPathxmlApplicationContext(“applicationContext.xml");
    // 根据beanName获得容器中的Bean实例
    UserService userService = (UserService) applicationContext.getBean("userService");
    
    • 1
    • 2
    • 3
    • 4

    1. BeanFactory与ApplicationContext的关系

    1)BeanFactory是Spring的早期接口,称为Spring的Bean工厂(创建bean),ApplicationContext是后期更高级接口,称之为Spring 容器;
    2)ApplicationContext在BeanFactory基础上对功能进行了扩展,例如:监听功能、国际化功能等。BeanFactory的API更偏向底层,ApplicationContext的API大多数是对这些底层API的封装;
    3)Bean创建的主要逻辑和功能都被封装在BeanFactory中,ApplicationContext不仅继承了BeanFactory,而且
    ApplicationContext内部还维护着BeanFactory的引用,所以,ApplicationContext与BeanFactory既有继承关系,又有融合关系。
    4)Bean的初始化时机不同,原始BeanFactory是在首次调用getBean时才进行Bean的创建,而ApplicationContext则是配置文件加载,容器一创建就将Bean都实例化并初始化好。

    ApplicationContext除了继承了BeanFactory外,还继承了ApplicationEventPublisher(事件发布器)、ResouresPatternResolver(资源解析器)、MessageSource(消息资源)等。但是ApplicationContext的核心功能还是BeanFactory。

    在这里插入图片描述
    在这里插入图片描述

    applicationContext内部维护着beanFactory的引用,在学习过程中会查看beanFactory内部维护的属性,断点查看如下图示内容的

    在这里插入图片描述

    验证BeanFactory和ApplicationContext对Bean的初始化时机,在UserDaoImpl的无参构造内打印一句话,验证构造方法的执行时机

    public class UserDaoImpl implements UserDao {
    	public UserDaoImpl() {
    		System.out.println("UserDaoImpl创建了...");
    	} 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    断点观察,BeanFactory方式时,当调用getBean方法时才会把需要的Bean实例创建,即延迟加载;
    而ApplicationContext是加载配置文件,容器创建时就将所有的Bean实例都创建好了,存储到一个单例池中,当调用getBean时直接从单例池中获取Bean实例返回

    2. BeanFactory的继承体系

    BeanFactory是核心接口,项目运行过程中肯定有具体实现参与,这个具体实现就是DefaultListableBeanFactory,而ApplicationContext内部维护的Beanfactory的实现类也是它
    在这里插入图片描述

    3. ApplicationContext的继承体系

    只在Spring基础环境下,即只导入spring-context坐标时,此时ApplicationContext的继承体系
    在这里插入图片描述

    只在Spring基础环境下,常用的三个ApplicationContext作用如下:
    在这里插入图片描述

    如果Spring基础环境中加入了其他组件解决方案,如web层解决方案,即导入spring-web坐标,此时ApplicationContext的继承体系

    <dependency> 
    	<groupId>org.springframeworkgroupId> 
    	<artifactId>spring-webartifactId> 
    	<version>5.3.7version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    在Spring的web环境下,常用的两个ApplicationContext作用如下:
    在这里插入图片描述

  • 相关阅读:
    算法竞赛进阶指南 货仓选址
    idea使用git
    【软考经验分享】软考-中级-嵌入式备考
    又火了!GitHub标星百万的并发编程手册(彩图版)竟是从阿里流出
    23.3 Bootstrap 框架4
    我的十年程序员生涯--考研失利,倒也还好
    服务器开发不常见操作
    【推荐算法系列十七】:GBDT+LR 排序算法
    集群容器部署和管理(Docker&K8S)
    python基础项目实战-PyQt5制作俄罗斯方块
  • 原文地址:https://blog.csdn.net/qq_36602071/article/details/127643333