编程Spring基础.docx
《编程Spring基础.docx》由会员分享,可在线阅读,更多相关《编程Spring基础.docx(28页珍藏版)》请在冰豆网上搜索。
编程Spring基础
Spring基础
1.课程介绍
Ø1.为什么需要Spring;(了解)
Ø2.初识Spring;(了解)
Ø2.Spring入门;(掌握)
Ø3.BeanFactory与ApplicationContext的使用;(掌握)
Ø4.Spring配置细节;(掌握)
Ø5.Spring测试;(掌握)
Ø6.Spring依赖注入;(掌握)
Ø7.三层架构中Spring的使用;(掌握)
2.为什么需要Spring
开发应用时常见的问题:
一:
代码耦合高
1.应用程序是由一组相互协作的对象组成,一个完整的应用是由一组相互协作的对象组成。
所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象协作来完成所需功能,而且要低耦合、高内聚。
业务逻辑开发是不可避免的,那就需要有个框架出来帮我们来创建对象及管理这些对象之间的依赖关系;
publicclassEmployeeServiceImpl{
//如果接口和实现类在同一地方存在,那么就是高耦合。
privateIEmployeeDaoemployeeDao=newEmployeeJdbcDaoImpl();
}
2.EmployeeService对象除了完成业务逻辑功能的实现,还需要把数据通过EmployeeDao进行持久化,那么EmployeeService对象就依赖于EmployeeDao,如果EmployeeService离开了EmployeeDao就无法进行工作了;
问题:
若把IEmployeeDao的实现改成:
EmployeeHibernateDaoImpl?
传统解决方式:
在每一个使用到IEmployeeDao的地方,都需要修改为newEmployeeHibernateDaoImpl();
工厂模式:
通过一个工厂来创建管理IEmployeeDao实例对象,然后在需要用到IEmployeeDao的地方直接通过工厂来获取:
bean.properties
employeeDao=cn.itsource.dao.impl.EmployeeDaoImpl
publicclassObjectFactory{
publicstaticObjectgetObject(Stringname){//name=employeeDao
Propertiesps=newProperties();
ps.load(bean.properties);
returnClass.forName(name).newInstance();
}
}
publicclassAServiceImpl{
privateIEmployeeDaoemployeeDao=ObjectFactory.getEmployeeDao();
}
publicclassBServiceImpl{
privateIEmployeeDaoemployeeDao=ObjectFactory.getEmployeeDao();
}
二:
对象之间依赖关系处理繁琐
publicclassEmpployeeAction{
privateIEmployeeServiceservice;
}
-----------------------------------------------------------
publicclassEmpployeeService{
privateIEmployeeDaodao;
}
问题:
如果对象有很多,且互相存在依赖关系,并且有的对象需要单例模式,有的则需要多个实例,处理起来比较繁琐;
三:
事务控制繁琐
1.实际开发中,某一个业务逻辑可能会牵涉多个操作(多个sql),事务开启在service层,是极好的。
但是每个方法前都要开启事务,每个方法后都要关闭事务,这样就会导致代码臃肿,开发效率低下的问题;
思考:
如何降低业务逻辑部分之间耦合度,提高程序的可重用性,同时提高开发的效率!
-->AOP
EmployeeService{
publicvoidsave(...){
开启事务
dao.save(...);
关闭事务
}
publicvoidupdate(...){
开启事务
dao.update(...);
关闭事务
}
3.初识Spring
3.1.什么是框架
1.程序中的框架(framework)其实是一系列jar包(一系列.class文件)的组合;
2.一个半成品,不需要从零起步,提高开发效率;
3.为了解决某一个领域的问题而产生;
4.适用于团队开发,统一规范,方便维护;
......
3.2.什么是Spring
1.Spring是一个开源的轻量级控制反转(IOC)和面向切面编程(AOP)的容器框架;
(1)轻量级:
相对于重量级(框架设计比较繁琐,配置较多,例如EJB(tomcat不支持),现在基本不用了)而言,开发使用都比较简单,功能强大;
(2)IOC(Inverseofcontrol):
将创建对象的权利和依赖关系维护(字段赋值)交给Spring容器(不再使用以前new关键字创建对象);
(3)AOP(AspectOrientedProgramming):
将相同的逻辑抽取出来,即将业务逻辑从应用服务中分离出来。
然后以拦截的方式作用在一个方法的不同位置。
例如日志,事务的处理;
注意事项:
Spring底层原理:
xml+dom4j+工厂设计模式+反射
3.3.Spring框架的好处
1.方便解耦,降低维护难度,提高开发效率(Spring相当于是一个大的工厂,它提供的IOC思想,可以将对象的创建和依赖关系维护都交给spring管理);
2.spring支持AOP编程(spring提供面向切面编程,可以很方便的实现对程序进行权限拦截和运行监控等功能,可以将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用);
3.Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。
在企业级开发中,通常用于整合其他层次的框架;
4.方便程序的测试(Spring对junit4支持,可以通过注解测试Spring程序,非常便捷);
5.方便集成各种优秀的框架(Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部,也可以集成其他优秀的框架);
6.Spring降低了javaEEAPI的使用难度(Spring对javaEE开发中非常难用的一些API,例如JDBC,javaMail,远程调用等,都提供了封装,是这些API应用难度大大降低);
注:
Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
3.4.Spring框架的模块化
1.简单地说,模块化就是有组织地把一个大文件拆成独立并互相依赖的多个小模块;
2.Spring框架的功能大约由20个模块组成,这些模块按组可以分为:
(1)CoreContainer(核心容器):
1Beans:
负责Bean工厂中Bean的装配,所谓Bean工厂即是创建对象的工厂,Bean的装配也就是对象的创建工作;
2Core:
这个模块即是负责IOC(控制反转)最基本的实现;
3Context:
Spring的IOC容器,因大量调用SpringCore中的函数,整合了Spring的大部分功能。
Bean创建好对象后,由Context负责建立Bean与Bean之间的关系并维护。
所以也可以把Context看成是Bean关系的集合;
4SpEl:
即SpringExpressionLanguage(Spring表达式语言);
(2)DataAccess/Integration(数据访问/集成):
1 JDBC:
对JDBC的简单封装;
2 ORM:
支持数据集成框架的封装(如Mybatis,Hibernate);
3 OXM:
即ObjectXMLMapper,它的作用是在Java对象和XML文档之间来回转换;
4 JMS:
生产者和消费者的消息功能的实现;
5 Transations:
事务管理;
(3)Web与远程调用:
1 WebSocket:
提供Socket通信,web端的的推送功能;
2 Servlet:
SpringMVC框架的实现;
3 Web:
包含web应用开发用到Spring框架时所需的核心类,包括自动载入
WebApplicationContext特性的类,Struts集成类、文件上传的支持类、Filter类和大量辅助工具类;
4 Portlet:
实现web模块功能的聚合(如网站首页(Port)下面可能会有不同的子窗口(Portlet));
(4)AOP:
面向切面;
(5)Aspects:
同样是面向切面的一个重要的组成部分,提供对AspectJ框架的整合;
(6)Instrumentation(设备):
相当于一个检测器,提供对JVM以及对Tomcat的检测;
(7)Messaging(消息):
Spring提供的对消息处理的功能;
(8)Test(测试):
我们在做单元测试时,Spring会帮我们初始化一些测试过程当中需要用到的资源对象;
4.Spring入门
1.Spring提供了强大的IOC机制,能够帮助我们管理对象和依赖关系维护:
(1)管理对象:
包括对象的创建,初始化,和销毁(分情况);
注:
通常被Spring管理的类称之为Bean,在Spring容器中的对象称之为Bean对象;
(2)依赖关系维护:
DI(DependencyInjection)依赖注入,后续再讲;
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配置文件
1.在classpath的根目录下新建一个applicactionContext.xml配置文件,文件名可以自定义,但是通常使用applicactionContext这个名字;
2.添加文档声明和约束(这个东西不需要记忆):
(1)可以参考文档,中英文文档都可以;
1spring-framework-4.1.2.RELEASE\docs\spring-framework-reference\pdf
(2)可以参考资源中的资料;
(3)可以XXspring的配置文件;
(4)也可以直接拿以下内容去修改
xmlversion="1.0"encoding="UTF-8"?
>
//www.springframework.org/schema/beans"
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="http:
//www.springframework.org/schema/beans
http:
//www.springframework.org/schema/beans/spring-beans.xsd">
--collaboratorsandconfigurationforthisbeangohere-->
第三步:
编写逻辑代码
1.准备一个普通的Java类(MyBean)
publicclassMyBean{
publicvoidhello(){
System.out.println("hellospring...");
}
}
第四步:
将这个类交给Spring去管理即注册到Spring容器中
1.大家要记得,Spring是一个容器,我们需要把我们的类交给Spring去管理。
因为,我们的测试是创建一个普通的类,然后再通过Spring帮我们把这个类的对象创建出来就算是成功了;
2.在配置文件中将这个Java类交给Spring管理。
在applicationContext.xml中配置
3.元素和属性讲解:
bean元素:
表示对象配置或注册标签;
id属性:
这个bean对象在Spring容器中的唯一标识,也可以使用name,常用id(唯一特性),获取这个对象的时候就可以通过这个表示来获取;
class属性:
对应对象所属类的完全限定名。
注意这里可以是JDK自带的类,也可以是自己新建的类;
问题:
我想使用或者获取Spring容器创建的这个对象或Bean,那么如何操作?
4.2.Spring容器的实例化(如何创容器对象_测试用)
1.Spring容器对象有两种:
BeanFactory和ApplicationContext;
2.ApplicationContext继承自BeanFactory接口,拥有更多的企业级方法,推荐使用该类型;
4.2.1.BeanFactory
1.BeanFactory是一个接口,可以通过其实现类XmlBeanFactor获取其实例。
接口中有一个getBean()方法可以获取Spring容器中配置或注册的Bean对象;
@Test
publicvoidtestHelloSpring()throwsException{
/**
*我们第一步是要启动框架,而启动框架则需要拿到Spring的核心对象
*咱们学习的第一个核心对象是BeanFactory:
顾名思义,这是一个创建Bean的工厂
*而Bean工厂创建对象又必需拿到配置文件中的数据
*因为:
我们的第一步读取配置文件,拿到BeanFactory工厂
*/
//第一步:
读取资源文件
Resourceresource=newClassPathResource("applicationContext.xml");
//第二步:
拿到核心对象BeanFactory
BeanFactoryfactory=newXmlBeanFactory(resource);
}
4.2.2.ApplicationContext(推荐使用)
1.ApplicationContext的中文意思是"应用程序上下文",它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持、资源访问(如URL和文件)、事件传播等方面进行了良好的支持,被推荐为JavaEE应用之首选,可应用在JavaAPP与JavaWeb中;
2.要使用ApplicationContext的功能,必需要导入相应的jar包:
spring-context-4.1.2.RELEASE.jar--上下文
spring-expression-4.1.2.RELEASE.jar--Spring表达式语言
//加载文件系统中的配置文件实例化
Stringconf="C:
\applicationContext.xml";
ApplicationContextfactory=newFileSystemXmlApplicationContext(conf);
//加载工程classpath下的配置文件实例化
Stringconf="applicationContext.xml";
ApplicationContextfactory=newClassPathXmlApplicationContext(conf);
4.2.3.获取对象方式
方式一:
通过id直接拿到相应的Bean对象
//通过xml中配置的id拿到对象
MyBeanbean=(MyBean)factory.getBean("myBean");
System.out.println(bean);
方式二:
通过id与对象的Class对象拿到Bean对象(推荐使用)
//通过id与对象的class拿到Bean对象
MyBeanbean=factory.getBean("myBean",MyBean.class);
System.out.println(bean);
4.2.4.ApplicationContext与BeanFactory的区别【掌握】
联系:
1.ApplicationContext是BeanFactory的子类,拥有更多的功能与方法;
区别:
1.ApplicationContext默认是在读取配置文件的时候就会根据配置创建Bean对象(迫切加载)。
而BeanFactory是在使用的时候才进行对象的创建(懒加载/延迟加载)
扩展:
1.我们在使用ApplicationContext的时候,可以通过配置让它也变成与BeanFactory一样的懒加载:
配置一:
让所有Bean都变成懒加载,只需要在标签中加入default-lazy-init="true":
//www.springframework.org/schema/beans"
....
default-lazy-init="true">
配置二:
让其中一个Bean变成懒加载,在标签中加入lazy-init="true":
5.Spring配置细节
5.1.Bean对象的作用域
1.指的是我们配置的Bean是单例还是多例/原型
2.通过Bean元素中的scope属性指定:
Øsingleton:
默认值,单例
Øprototype:
多例
3.其他属性值:
(一般都不用)
5.2.Bean对象配置懒加载
1.Spring中所有bean对象全部懒加载:
配置文件的根对象中添加default-lazy-init为true
//www.springframework.org/schema/beans"
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="http:
//www.springframework.org/schema/beans
http:
//www.springframework.org/schema/beans/spring-beans.xsd"
default-lazy-init="true">
2.单个Bean对象懒加载/延迟加载
5.3.Bean对象的生命周期
1.Bean对象的生命周期指的是:
从对象创建、初始化、调用执行到销毁的一个过程;
2.不同作用域的Bean,生命周期有所区别:
(1)Spring管理的Bean对象默认是单例的,可以设置成多例;
(2)Bean对象的实例化和初始化:
1实例化实质是Spring容器调用Bean的无参构造创建Bean对象;
2初始化实质上是Spring容器调用指定的初始化方法;
3BeanFactory管理的Bean默认是在使用的时候才创建Bean对象,即延迟加载,而AppliacationContext管理的Bean默认是在容器创建的时候就会创建Bean对象,即迫切加载;
4如果是多例的Bean,都是在获取的时候才创建Bean对象,因为只有获取的时候才知道要获取多少个Bean对象;
(3)Bean对象的销毁:
1实质上是Spring容器调用指定的销毁方法(并不是真正意义上的销毁Bean对象);
2单例的Bean是在容器关闭的时候(ApplicationContext对象没有close方法,其实现类有)会自动调用指定的销毁方法;
3多例的Bean容器不会管理,因为根本就不知道有多少个bean对象;
3.可以通过bean元素的init-method和destroy-method属性指定初始化方法和销毁方法。
但是一般我们自己不会来配置这个生命周期。
而这个基本上Spring自身来使用,例如在Spring操作连接池的时候,它会在DateSource销毁的时候执行;
6.Spring测试
6.1.Spring测试介绍
1.单元测试在我们的软件开发流程中占有举足轻重的地位;
2.而且目前基于Java的企业应用软件来说,Spring已经成为了标准配置,那么如何在Spring框架中更好的使用单元测试呢?
3.Spring框架提供了对单元测试(junit4)的强大支持,我们不用在使用传统的单元测试去测试Spring功能。
通过SpringJunit测试,使用注解帮我们读取配置文件和赋值,简化测试代码,提高测试效率;
4.三大框架整合的时候如果Spring的配置文件不能读取,那么整个项目是跑不起来的,而Spring的测试可以让我们在不启动服务器的情况下,使用注解读取相应的配置文件,把项目跑起来;
6.2.Spring测试步骤
第一步:
导入相应的包
spring-test-4.1.2.RELEASE.jar--测试包
spring-aop-4.1.2.RELEASE.jar--AOP包
注意:
测试包依赖AOP,所以需要导入AOP的jar包,如果没有导入会报错:
第二步:
编写测试类和方法
注解:
Ø@RunWith:
表示先启动Spring容器,把junit运行在Spring容器中;
Ø@ContextConfiguration("classpath:
applicationContext.xml"):
表示从CLASSPATH路径去加载资源文件;
Ø@Autowired:
表示自动装配,自动从Spring容器中取出对应bean赋值给当前使用的属性;
Spring