丑陋的代码
- 代码耦合度高,不符合开闭原则
- 控制事务繁琐,大量的重复代码分散不同类的不同方法中,不利于维护。
- 第三方框架运用太麻烦,对使用者而言最关心的是获取到这个对象使用,而不关心这个对象创建。
Spring介绍
Spring定义
源于 Rod Johnson 在其著作 《Expert one on one J2EE design and development》 中阐述的部分理念和原型衍生而来。
Spring 是一个轻量级的 IoC / DI和 AOP 容器的开源框架,致力于构建致力于构建轻量级的 JavaEE 应用,简化应用开发,本身涵盖了传统应用开发,还拓展到移动端,大数据等领域。
什么是容器(Container):从程序设计角度看就是装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期,如 Tomcat 就是 Servlet 的容器。
Spring在JavaEE开发中作用
Spring 提供了 JavaEE 每一层的解决方案(full stack)。Web 开发中的最佳实践:根据职责的纵向划分:控制层、业务层、持久层:不同框架解决不同领域的问题。
Spring优势
Spring 除了不能帮我们写业务逻辑,其余的几乎什么都能帮助我们简化开发。
Spring FrameWork体系
Core Container(核心容器 IoC)包含有 Beans、Core、Context 和 SpEL 模块。
Test 模块支持使用 JUnit 和 TestNG 对 Spring 组件进行测试。
AOP 模块提供了一个符合 AOP 联盟标准的面向切面编程的实现。
Data Access / Integration 层包含有 JDBC、ORM、OXM、JMS 和 Transaction 模块。
Web 层包含了 Web、Web-Servlet、WebSocket、Web-Porlet 模块。
Spring依赖
我们使用 5.0.8.RELEASE 的版本
IoC和DI思想
IoC
IoC:Inversion of Control(控制反转):读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,好比于 MVC。
就是将原本在程序中手动创建对象的控制权,交由 IoC 容器来管理。
调用者只管负责从IoC 容器中获取需要使用的对象,不关心对象的创建过程,也不关心该对象依赖对象的创建以及依赖关系的组装,也就是把创建对象的控制权反转给了IoC容器。
DI
DI:Dependency Injection:依赖注入。
从字面上分析:IoC:指将对象的创建权,反转给了IoC 容器;DI :指IoC容器创建对象的过程中,将对象依赖属性(常量,对象)通过配置设值给该对象。
IoC 从字面意思上很难体现出谁来维护对象之间的关系,Martin Fowler 提出一个新的概念 DI,更明确描述了“被注入对象(Service 对象)依赖 IoC 容器来配置依赖对象”。
使用 Spring IoC DI
添加依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
编写Spring 的配置文件
<!--
配置数据库连接池对象才配置初始化与销毁化方法
若发现类名是以FactoryBean 结尾,注意创建对象类型
属性名必须对应是 setter 方法
-->
<bean id="唯一性" class="类全限定名" [init-method="初始方法" destroy-method="销毁方法"] >
<property name="属性名" value="属性值" | ref="容器中另外一个bean的 id 值">
........
</bean>
加载配置启动容器
使用 Spring API 启动容器
ApplicationContext及bean
BeanFactory:Spring 最底层的接口,只提供了的 IoC 功能,负责创建、组装、管理 bean,在应用中,一般不使用 BeanFactory,而推荐使用 ApplicationContext(应用上下文)。
ApplicationContext:继承了BeanFactory,除此之外还提供 AOP 集成、国际化处理、事件传播、统一资源加载等功能。
被Spring IoC容器管理的对象称之为 bean。
使用 Spring 测试启动容器
@RunWith(SpringJUnit4ClassRunner.class) // 但测试方法之前启动容器
@ContextConfiguration("classpath:Spring配置文件")// 指定加载的配置文件
@Autowired // 贴字段上,字段类型就是从容器中获取的对象的类型