Spring
Spring与其他框架的不同
不是替换原有的框架,而是对其进行管理。
Spring框架
Spring 框架是一个项目管理框架,其底层使用了23中设计模式中的工厂设计等模式,用力里将现有的项目中的每一个组件(Action,Servvice,Dao,事务相关等都是项目中的一个组件)统一生产、并管理。
注意:实体类,通常不适用Spring管理
Spring 中的两大核心思想
IOC ( Inversion of controll)控制反转
将创建对象的权限转交给Spring ,Spring通过工厂模式和反射机制完成对象的创建
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JsDMoiYr-1606376732681)(1527679670305.png)]
DI(dependcy Injection)依赖注入(在 IOC基础上提出 DI思想)注入=为实例变量赋值 ; 依赖=需要
Spring将依赖的对象,作为实例变量,由Spring的工厂进行创建以及赋值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KhcDKtTT-1606376732683)(1527679691364.png)]
AOP ( aspect or iented programming) 面向切面编程
举个例子:歌星都有好多助理,歌星最重要的一件事就是唱歌,其他事他不用关注,比如唱歌前可能需要和其他人谈合作,还要布置场地,唱歌后还要收钱等等,这些统统交给他对应的助理去做。也许哪一天,这个歌星做慈善,免费唱歌了,不收钱了,那么就可以把收钱这个助力给辞退了。这就是 AOP,每个人各司其职,灵活组合,达到一种可配置的、可插拔的程序结构。AOP 的实现原理就是代理模式。
工厂模式回顾
①作用:创建对象
②工厂的使用步骤:
>I、创建类
>
>II、编写配置文件(applicationContext.properties,配置key=value)
>
>III、调用工厂API,完成对象的创建
③好处:解耦、提高维护性
Spring环境搭建
1、导入相关的Jar包(www.springsource.org官网下载,3.X版本开始不再提供依赖Jar包)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aZGBXBg0-1606376732685)(1527642399822.png)]
2、导入第三方依赖Jar包:日志
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-32zY1uJ4-1606376732687)(1527642420442.png)]
3、配置文件:配置文件的名称,位置没有限制;约定俗称为:applicationContext.xml
Spring 开发步骤
1、书写目标类。
2、编写配置文件(applicationContext.xml)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ByJVNuu1-1606376732688)(1527678035665.png)]
3、调用Spring 的工厂API(ApplicationContext)
I、作用:Spring的工厂,负责创建对象
II、实现类
本地环境:ClassPathXMLApplicationContext
web环境:XmlWebApplicationContext、
AnnotationConfigWebApplicationContext
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U6SiXsNy-1606376732689)(1527678358893.png)]
Spring的注入(Injection)
1、在Spring创建对象的同时,为该对象的实例变量赋值
2、Set注入:调用实体的Set方法,完成属性的赋值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ltEuUIu-1606376732690)(1527678648132.png)]
JDK原生类型
8种基本类型+String+Date
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-68FxKh3G-1606376732691)(1527678757147.png)]
容器类型(数组、List、Set、Map、Properties、容器的嵌套注入)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V4js8u1R-1606376732692)(1527678844866.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vMgNx6BB-1606376732693)(1527678856029.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZrLce1Kz-1606376732694)(1527678866363.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-38HOCGU5-1606376732695)(1527678876227.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T4xlzuuZ-1606376732696)(1527678886859.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FeRViDJg-1606376732697)(1527678927940.png)]
自建类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lwJCA5QV-1606376732699)(1527679181997.png)]
总结:Spring注入的好处:
解耦,没有强关联性,更容易更换实现。Spring是一个面向接口编程的框架
FactoryBean
作用:用于创建复杂的对象,或者步骤较多的对象的创建
开发步骤
I、实现FactoryBean接口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LkoazdIO-1606376732700)(1527679390702.png)]
II、配置文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dBvZOAS1-1606376732701)(1527679415266.png)]
特例:如果需要获取FactoryBean本身类型的对象,使用工厂的ctx.getBean("&conn"); --> 语法:"&id的名称"
Spring中控制对象多例或者单例
I、简单对象
通过配置文件中的属性进行控制(单例:singleton默认 , 多例:prototype)
II、复杂对象
通过实现FactoryBean接口,并且在isSingleton方法中返回true | false 控制
单例或者多例的选择
I、单例:SqlSessionFactory、Service、DAO
II、多例:Connection、SqlSession、Action、ShoppingCart
Spring工厂创建对象的生命周期
I. 创建:工厂创建之后,会根据Spring的配置文件完成所有对象的创建(饿汉式)。
为什么使用饿汉式创建对象?
避免多次IO操作,提高程序运行效率,减少创建对象的时间。(概念接近连接池)
II. 对象生命周期方法:
1、对象初始化方法:
<bean init-method="自定义方法" />
<!--Spring在创建对象之后,立即调用对象的初始化方法。-->
2、对象销毁方法:
<bean destroy-method="自定义方法" />
<!--Spring在工厂关闭之后,立即调用对象的销毁方法。-->
III、对象销毁:工厂的close()方法执行,则关闭工厂,销毁对象。
IV. Singleton对象由Spring工厂销毁,Prototype对象由JVM的GC销毁。
<context:property-placeholer />配置文件参数化
1、作用:将经常需要修改的配置信息,转移到局部配置.properties文件中,易于修改和维护
2、实现步骤:
I、引入context的命名空间和xsd文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fpj2ysz2-1606376732702)(1527680290430.png)]
II、引入局部配置文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a6nNhFH1-1606376732703)(1527680348437.png)]
III. 参数化:${username}在Spring 3.x起,与数据库不兼容,不能使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p7rN8JbY-1606376732703)(1527680367658.png)]
代理模式
概念:将核心功能与辅助功能分离,达到核心功能更纯粹、辅助功能可复用。
I、静态代理设计模式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iPcIsNhs-1606376732704)(1527680550254.png)]
概念:
1、通过代理类,为原始类(目标类)添加额外的辅助功能,更容易更换代理类的实现,利于维护。
2、代理类 = 实现与原始类相同的接口 + 额外的辅助功能 + 调用原始类的方法。
静态代理的问题:
1、代理类数量过多,不利于项目的管理和维护。
2、多个代理类的辅助功能存在冗余,修改时,维护性差。
动态代理设计模式
概念:
由Spring负责动态生成的代理类,为原始类添加额外的辅助功能。
动态代理设计模式的实现
I、引入Jar包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dB3NcHPy-1606376732705)(1527680717923.png)]
II、引入aop的xmlns和xsd文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LQZaoeZK-1606376732705)(1527680750688.png)]
III、详细实现步骤:
1、创建原始对象:(没有复制功能的Service对象)
2、添加辅助功能对象(Advice的实现类)
i). 前置通知MethodBeforeAdvice:在原始功能前,添加额外功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3uBLRH5Z-1606376732706)(1527766491401.png)]
ii). 后置通知AfterReturningAdvice:在原始功能后,添加额外功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aTo4DLy8-1606376732707)(1527766507051.png)]
iii). 环绕通知MethodInterceptor:在原始功能的前、后添加额外功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3V21HLOt-1606376732708)(1527766521458.png)]
iv). 异常通知ThrowsAdvice:在原始功能产生异常时,添加额外功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sbq6ZKw5-1606376732709)(1527766534019.png)]
3、指定切入点:(明确需要添加额外功能的方法)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-206nsioj-1606376732712)(1527680960180.png)]
4、组装切面:(在pointcut-ref切入点位置,添加advice-ref所代表的额外功能 advice)
注意:动态代理,仍旧使用工厂获得原始对象,Spring会根据配置文件中的“切入点+额外功能”决定,是否创建代理对象。