背景:
①在分层架构中,上层调用者与下层实现者之间形成代码级关联,这无疑增加了设计的耦合度;
②大部分第三方框架,例如struts通过强迫使用者继承指定父类或实现指定接口,从而导致应用与框架绑定死板,形成“侵入性”编程;
③散布在应用各个模块中的非功能性重复模块,没有得到充分且灵活的复用;
冲突:这些问题导致Java在做开发的时候(特别是Web开发)越发显得臃肿繁琐
疑问:有没有一个可以轻量化的工具或者框架来解决这些问题呢
回答:spring
1:定义
2:核心
3:spring框架图
4:学习目的
5:IOC底层原理
一:定义
spring是开源的轻量级一站式框架
二:spring核心的两部分
①IOC(控制反转)
②AOP(面向切面编程)
下面来具体并且详细的介绍这两个部分
1:IOC,中文意思是控制反转
所谓控制反转实际上是将创建对象的控制权由程序中的new关键字来创建转换为有spring容器来创建,即创建对象的过程交给了spring容器,而非程序本身创建了
2:AOP,面向切面编程,扩展功能可以不修改源代码实现
三:spring框架图
简要介绍一下上面框架中各部分模块的用途:
①spring Core:IOC,控制反转,是所有应用模块的核心,只要用到spring容器,都是采用该模块作为基础,主要用来对bean的创建、管理、依赖关系维护,对于spring,所有的框架、对象都被视为bean,被spring容器管理
②spring AOP:面向切面编程,常见的使用场景为声明式事务管理,无须编写代码来进行事务控制、业务层进行业务处理之前、之后、异常时能够统一管理,记录日志等
③spring ORM:对持久层框架进行支持,例如可以整合hibernate、mybatis
④spring DAO:可以直接支持jdbc对数据库操作
⑤spring WEB:可以支持web应用,整合web框架,例如struts
⑥Spring的MVC框架:Spring为构建Web应用提供了一个功能全面的MVC框架。虽然Spring可以很容易地与其它MVC框架集成,例如Struts,但Spring的MVC框架使用IoC对控制逻辑和业务对象提供了完全的分离。
常用的开发模式是:
- WEB 层:Spring MVC.
- 业务层:Bean 管理:(IOC)
- 持久层:Spring 的JDBC 模板.ORM 模板用于整合其他的持久层框架
四:学习目的
①方便解耦,简化开发
Spring 就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring 管理
②AOP 编程的支持
Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
③声明式事务的支持
只需要通过AOP进行配置就可以完成对事务的管理,而无需手动编程
④方便程序的测试
Spring 对Junit4 支持,可以通过注解方便的测试Spring 程序
⑤方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、
MyBatis、Quartz 等)的直接支持,例如ssm、ssh等
⑥降低JavaEE API 的使用难度
Spring 对JavaEE 开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,
使这些API 应用难度大大降低
五:IOC底层原理
参照:https://blog.csdn.net/z4331016/article/details/78210582
大概意思是采用工厂模式,结合dom4j解析xml技术,解析出xml中的bean中对应的class属性,然后通过反射,创建出对应的对象
(1)xml配置文件
(2)dom4j解决xml
(3)工厂设计模式
(4)反射
实际项目中:
xml对应applicationContext.xml
工厂对应ApplicationContext
通过以上两个条件来创建对象
例如:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“applicationContext.xml”);
User user = (User)applicationContext.getBean(User.class);
user.hello();
延伸:IOC(控制反转)和DI(依赖注入)是相同的概念,控制反转意思是说调用者调用其他对象时,由之前的自身创建对象转变为由容器来创建,依赖注入的意思是说,当一个类中要依赖其他类时,通过依赖注入,可以直接通过容器来直接用该依赖的对象,无须自己创建和维护,简而言之,spring容器实现了对对对象生命周期的管理和依赖关系的维护,实现了解耦的过程