1.课程介绍
- 为什么需要Spring; (了解)
- 初识Spring; (了解)
- Spring入门; (掌握)
- Spring依赖注入; (掌握)
- Spring测试; (掌握)
- Spring配置细节; (掌握)
- 三层架构中Spring的使用; (掌握)
2.为什么需要Spring
开发应用时常见的问题:
一:代码耦合高
- 应用程序是由一组相互协作的对象组成,一个完整的应用是由一组相互协作的对象组成。所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象协作来完成所需功能,而且要低耦合、高内聚。业务逻辑开发是不可避免的,那就需要有个框架出来帮我们来创建对象及管理这些对象之间的依赖关系;
public class EmployeeServiceImpl { //如果接口和实现类在同一地方存在,那么就是高耦合,维护难度增加了。 private IEmployeeDao employeeDao = new EmployeeJdbcDaoImpl(); }
EmployeeService对象除了完成业务逻辑功能的实现,还需要把数据通过EmployeeDao进行持久化,那么EmployeeService对象就依赖于EmployeeDao,如果EmployeeService离开了EmployeeDao就无法进行工作了;
问题:若把IEmployeeDao的实现改成:EmployeeHibernateDaoImpl?
传统解决方式:在每一个使用到IEmployeeDao的地方,都需要修改为new EmployeeHibernateDaoImpl();
- 工厂模式:通过一个工厂来创建管理IEmployeeDao实例对象,然后在需要用到IEmployeeDao的地方直接通过工厂来获取:
bean.properties employeeDao=cn.cxjcloud.dao.impl.EmployeeDaoImpl public class ObjectFactory { public static Object getObject(String name) { //name =employeeDao Properties ps = new Properties(); ps.load(bean.properties); return Class.forName(name).newInstance(); } } public class AServiceImpl { private IEmployeeDao employeeDao = ObjectFactory.getObject(); } public class BServiceImpl { private IEmployeeDao employeeDao = ObjectFactory.getObject(); }``` 二:对象之间依赖关系处理繁琐 ```java public class EmpployeeAction { private IEmployeeService service; } ------------------------------------------------------ public class EmpployeeService{ private IEmployeeDao dao; }
问题:如果对象有很多,且互相存在依赖关系,并且有的对象需要单例模式,有的则需要多个实例,处理起来比较繁琐;
三:事务控制繁琐
实际开发中,某一个业务逻辑可能会牵涉多个操作(多个sql),事务开启在 service 层,是极好的。但是每个方法前都要开启事务,每个方法后都要关闭事务,这样就会导致代码臃肿,开发效率低下的问题;
思考:如何降低业务逻辑部分之间耦合度,提高程序的可重用性,同时提高开发的效率! --> AOP
EmployeeService{ public void save(...){ 开启事务 dao.save(...); 关闭事务 } public void update(...){ 开启事务 dao.update(...); 关闭事务 }
3.初识Spring
3.1.什么是Spring
Spring是一个开源的轻量级控制反转(IOC)和面向切面编程(AOP)的容器框架;
(1)轻量级:相对于重量级(框架设计比较繁琐,配置较多,例如EJB(tomcat不支持),现在基本不用了)而言,开发使用都比较简单,功能强大;
(2)IOC(Inverse of control - 控制反转):将创建对象的权利和依赖关系维护(字段赋值)交给Spring容器(不再使用以前new关键字创建对象)。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被Spring控制,所以这叫控制反转;
(3)AOP(Aspect Oriented Programming):将相同的逻辑抽取出来,即将业务逻辑从应用服务中分离出来。然后以拦截的方式作用在一个方法的不同位置。例如日志,事务的处理;
注意事项:Spring底层原理:xml+dom4j+工厂设计模式+反射
3.2.Spring框架的好处
方便解耦,降低维护难度,提高开发效率(Spring相当于是一个大的工厂,它提供的IOC思想,可以将对象的创建和依赖关系维护都交给spring管理);
spring支持AOP编程(spring提供面向切面编程,可以很方便的实现对程序进行权限拦截和运行监控等功能,可以将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用);
Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。在企业级开发中,通常用于整合其他层次的框架;
方便程序的测试(Spring 对junit4支持,可以通过注解测试Spring 程序,非常便捷);
方便集成各种优秀的框架(Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部,也可以集成其他优秀的框架);
Spring降低了javaEE API的使用难度(Spring 对javaEE开发中非常难用的一些API,例如JDBC、javaMail、远程调用等,都提供了封装,是这些API应用难度大大降低);
注:Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
3.3.Spring框架的模块化
3.3.Spring框架的模块化
1.简单地说,模块化就是有组织地把一个大文件拆成独立并互相依赖的多个小模块;
2.Spring框架的功能大约由20个模块组成,这些模块按组可以分为:
(1)Core Container(核心容器):
①Beans:负责Bean工厂中Bean的装配,所谓Bean工厂即是创建对象的工厂,Bean的装配也就是对象的创建工作;
②Core:这个模块即是负责IOC(控制反转)最基本的实现;
③Context:Spring的IOC容器,因大量调用Spring Core中的函数,整合了Spring的大部分功能。Bean创建好对象后,由Context负责建立Bean与Bean之间的关系并维护。所以也可以把Context看成是Bean关系的集合;
④SpEl:即Spring Expression Language(Spring表达式语言);
(2)Data Access/Integration(数据访问/集成):
① JDBC:对JDBC的简单封装;
② ORM:支持数据集成框架的封装(如Mybatis,Hibernate);
③ OXM:即Object XML Mapper,它的作用是在Java对象和XML文档之间来回转换;
④ JMS:生产者和消费者的消息功能的实现;
⑤ Transations:事务管理;
(3)Web与远程调用:
① WebSocket:提供Socket通信,web端的的推送功能;
② Servlet:Spring MVC框架的实现;
③ Web:包含web应用开发用到Spring框架时所需的核心类,包括自动载入
WebApplicationContext特性的类,Struts集成类、文件上传的支持类、Filter类和大量辅助工具类;
④ Portlet:实现web模块功能的聚合(如网站首页(Port)下面可能会有不同的子窗口(Portlet));
(4)AOP:面向切面;
(5)Aspects:同样是面向切面的一个重要的组成部分,提供对AspectJ框架的整合;
(6)Instrumentation(设备):相当于一个检测器,提供对JVM以及对Tomcat的检测;
(7)Messaging(消息):Spring提供的对消息处理的功能;
(8)Test(测试):我们在做单元测试时,Spring会帮我们初始化一些测试过程当中需要用到的资源对象;
4.Spring入门
Spring提供了强大的IOC机制,能够帮助我们管理对象和依赖关系维护:
(1)管理对象:包括对象的创建,初始化,和销毁(分情况);
注:通常被Spring管理的类称之为Bean,在Spring容器中的对象称之为Bean对象;
(2)依赖关系维护:DI(Dependency Injection)依赖注入,后续再讲;
4.1.完成第一个Spring
第一步:导入Spring相关jar包
resources中:spring-framework-4.1.2.RELEASE
中文文档参考:Spring-Reference_2.5_zh_CN.chm
1.我们可以先导入核心包(core)与beans包:
2.导包的时候注意,现在使用Spring,要完成最小导包,即:需要什么jar包,我们就导入什么jar包,用到了其他功能,再添加相应jar包。这个对咱们认识框架的包是非常有帮助的。不然以后由于出现问题自己都不知道应该怎么解决;
第二步:导入Spring配置文件
在classpath的根目录下新建一个applicationContext.xml配置文件,文件名可以自定义,但是通常使用applicationContext这个名字;
javaweb实训第五天上午——Spring基础(2)https://developer.aliyun.com/article/1415064?spm=a2c6h.13148508.setting.20.6e1a4f0eQzpjQW