1.传统Javaweb开发困惑
问题一:层与层之间紧密耦合在了一起,接口与具体实现紧密耦合在了一起
解决思路:程序代码中不要手动new对象,第三方根据要求为程序提供需要的Bean对象
![](https://i-blog.csdnimg.cn/blog_migrate/320846bd5820a2e10febe6afccd5d715.png)
问题二:通用的事务功能耦合在业务代码中,通用的日志功能耦合在业务代码中
解决思路:程序代码中不要手动new对象,第三方根据要求为程序提供需要的Bean对象的代理对象
![](https://i-blog.csdnimg.cn/blog_migrate/28c0a611d196cf4efabe6499dc7ecd28.png)
2.loC,DI,AOP思想
loC思想(Inversion of Control),控制反转,强调的是原来在程序中创建Bean的权利反转给第三方
DI思想(Dependency Injection),依赖注入,强调的Bean之间的关系,这种关系第三方负责去设置
AOP思想(Aspect Oriented Programming),面向切面编程,功能的横向抽取,主要实现方式就是Proxy
3.框架(Framework)
基本特点
基于基础技术之上,从众多业务中抽取出来的通用解决方案
框架是一个半成品,使用框架规定的语法开发可以提高开发效率
框架一般具有扩展性
框架内部使用大量的设计模式,算法,底层代码操作技术,如,反射,xml解析,注解解析等
Java中常用的框架
-基础框架:完成基本业务操作的框架,如MyBatis,Spring,SpringMVC,Struts2,Hibernate等
-服务框架:特定领域的框架,一般还可对外提供服务框架,如MQ,ES,Nacos等
4.Spring框架
4.1概述
Spring是一个开源的轻量级Java开发应用框架,可以简化企业级应用开发
Spring的生态及其完善,不管Spring哪个领域的解决方案都依附于Spring Framework基础框架
Spring的官网:www.spring.io
![](https://i-blog.csdnimg.cn/blog_migrate/a1e3b7f8ab9dccf157cd271be2e65d23.png)
4.2Spring Framework技术栈
图示:
![](https://i-blog.csdnimg.cn/blog_migrate/074aa6b28963fe11aa439cf421d0a233.png)
4.3BeanFactory
4.3.1loC思想实现
导入Spring的jar包或者Maven坐标
![](https://i-blog.csdnimg.cn/blog_migrate/8075c63917bc4c86dcae6587efeaa420.png)
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.20</version>
</dependency>
</dependencies>
定义接口及其接口实现类
![](https://i-blog.csdnimg.cn/blog_migrate/5738776680a0bffe631719e6a4974faf.png)
创建xml配置文件,将接口实现类的信息配置到该xml文件中
![](https://i-blog.csdnimg.cn/blog_migrate/75b6ee883f44d23a9c94e2d05c323203.png)
编写测试代码,创建BeanFactory,加载配置文件,获取接口的实例对象
// 创建工厂对象
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
// 创建一个读取器(xml文件)
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
// 读取配置文件给工厂
reader.loadBeanDefinitions("beans.xml");
// 根据id获取Bean实例对象
UserService userService = (UserService)beanFactory.getBean("UserService");
System.out.println(userService);
4.3.2DI思想实现
定义UserDao接口及其UserDaoImpl实现类
修改UserServiceImpl代码,添加一个setUserDao(UserDao userDao)用于接收注入的对象
private UserDao userDao;
//接收注入的对象
public void setUsrDao(UserDao userDao) {
this.userDao = userDao;
System.out.println(userDao);
}
修改beans.xml配置文件,在UserDaoImpl的 中嵌入 配置注入
<!--配置UserService-->
<bean id="UserService" class="com.itlzxr.service.impl.UserServiceImpl">
<property name="usrDao" ref="userDao"></property>
</bean>
<!--配置UserDao-->
<bean id="userDao" class="com.itlzxr.dao.impl.UserDaoImpl"></bean>
![](https://i-blog.csdnimg.cn/blog_migrate/e5c30e7dc48413f4bd63c91512048140.png)
编写测试代码,创建BeanFactory,加载配置文件,获取UserService实例对象
BeanFactory是Spring中最底层,最核心的对象
4.4ApplicationContext(更常用)
ApplicationContext称为Spring容器,内部封装了BeanFactory,比BeanFactory功能更丰富强大
ApplicationContext进行开发时,xml配置文件的名称习惯写成applicationContext.xml
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
System.out.println(userService);
4.5BeanFactory与ApplicationContext的关系
1)BeanFactory是Spring的早期接口,称为Spring的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。
![](https://i-blog.csdnimg.cn/blog_migrate/5f1c8692229b3250f48715456a54766c.png)
4.6继承体系
1.beanFactory继承体系
BeanFactory是核心接口,项目运行过程中肯定有具体实现参与,这个具体实现就是DefaultListableBeanFactory,而ApplicationContext内部维护的Beanfactory的实现类也是它
![](https://i-blog.csdnimg.cn/blog_migrate/ac514494a6923a4489ec1d4553741794.png)
2.ApplicationContext继承体系
-只在Spring基础环境下,即只导入spring-context坐标时,此时ApplicationContext的继承体系
![](https://i-blog.csdnimg.cn/blog_migrate/efb6d715e2c05c32447ccdd5a749c35c.png)
只在Spring基础环境下,常用的三个ApplicationContext作用如下:
实现类 | 功能描述 |
ClassPathXmlApplicationContext | 加载类路径下的xml配置的ApplicationContext |
FileSystemXmlApplicationContext | 加载磁盘路径下的xml配置的ApplicationContext |
AnnotationConfigApplicationContext | 加载注解配置类的ApplicationContext |
-如果Spring基础环境中加入了其他组件解决方案,如web层解决方案,即导入spring-web坐标,此时
ApplicationContext的继承体系
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.7</version>
</dependency>
![](https://i-blog.csdnimg.cn/blog_migrate/957e3a167f1d06ca35ecebc73ddc4dca.png)
在Spring的web环境下,常用的两个ApplicationContext作用如下
实现类 | 功能描述 |
XmlWebApplicationContext | web环境下,加载类路径下的xml配置的ApplicationContext |
AnnotationConfigWebApplicationContext | web环境下,加载磁盘路径下的xml配置的ApplicationContext |