Spring 基础知识
一、控制反转 IoC
控制反转(Inversion of Control,英文缩写为 IoC)是一个重要的面向对象编程的法则,可以用来削减计算机程序的耦合度,也是轻量级的Spring框架的核心。
控制反转还有一个名字叫做依赖注入(Dependency Injection,简称DI)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也就是说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取它所依赖的对象的引用,这个责任的反转。
通俗来说,控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给IoC容器来帮忙实现。
好莱坞原则:Don’t call me, we you call you。
控制反转是目标,依赖注入是实现控制反转的方式。
二、Spring框架(Spring Framework)
Spring框架是一个轻量级的以IoC和AOP为核心的容器框架,是用来简化企业应用级开发的框架。通过控制反转(IoC)改变对象的创建方式,将对象的创建和维护由开发人员完成 改为 由容器帮助我们完成对象的创建和维护,以达到解耦的目的。使用AOP集中式管理事务、日志、缓存等复用任务。
三、Spring特点
简化开发、解耦、集成其他框架、封装常用API、IoC、DI、AOP。
通过控制反转IoC,依赖注入DI机制来管理对象,降低程序/对象之间的耦合性;
封装常用API以达到 简化开发;
集成多种框架,方便其他框架的使用、扩展、优化,如mybatis、hibernate等;
使用AOP集中式管理常用的任务,如安全、事务、日志、权限等,以达到 代码更好的复用性;
Spring采用 低侵入式设计模式。
四、Spring主要包括7个模块
- Spring Context:提供框架式的Bean访问方式,一起企业应用级功能(JNDI、定时任务等);
- Spring Core:核心类库,所有更能都依赖该类库,提供了IoC和DI服务;
- Spring AOP:AOP服务;
- Spring Web:提供基本的面向web的综合特性,提供对常见框架(如Struts2)的支持,Spring框架能够管理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器;
- Spring MVC:提供面向web应用的Model-View-Controller,即MVC实现;
- Spring DAO:对JDBC的抽象封装,简化了数据访问异样的处理,并能统一管理JDBC事务;
- Spring ORM:对现有的ORM框架的支持:Hibernate、Mybatis。
五、依赖注入方式
set、construct、implement
六、Spring配置方式
xml、注解、基于Java代码配置
七、Spring创建对象
通过无参构造函数、静态工厂、实例化工厂
八、bean对象的延迟加载
使用 lazy-init=“true” ,延迟创建bean对象,在使用的时候再创建
九、自动装配
指 将一个Bean注入到其他的Bean的Property中,即创建对象时,构造函数/set函数所需要的参数,让Spring自动配置。
autowire=“byType/byName”
十、Spring Bean 的作用域
Singleton 单例
Prototype 原型
Request
Session
Globalsession
十一、xml配置Java collection
<List>
<map>
<props>
<set>
十二、Spring框架的设计模式
代理模式(AOP)
单例模式(bean)
工厂模式(创建对象)
模板模式(代码复用)
前端控制器(DispatchServlet)
观察者模式
适配器模式
依赖注入
十三、Spring中的事件处理
Spring 的核心是 ApplicationContext,它负责管理bean的完整的生命周期。
Spring 提供的内置事件:
ContextRefreshedEvent
ContextStartedEvent
ContextStoppedEvent
ContextClosedEvent
RequestHandleEvent
Spring 时间处理是单线程的,所以如果一个事件被发布,直至 并且 所有的接收者得到的该消息,该进程被阻塞并流程将不再继续。
监听上下文事件
自定义事件
十四、Spring AOP(面向切面编程)的原理
AOP
AOP(面向切面编程),它是一种思想。它就是 针对业务处理过程中的切面 进行提取,以达到优化代码、减少重复代码的目的。就比如,在编写业务逻辑代码的时候,我们习惯性的都要写:日志记录,事务控制,以及权限控制等,每一个子模块都要写这些代码,代码明显存在重复。这时,我们运用面向切面的编程思想,采用横切技术,将代码中重复的部分,不影响主业务逻辑的部分抽取出来,放在某个地方进行集中式管理、调用。形成日志切面、事务控制切面、权限控制切面。这样,我们就只需要关注业务的逻辑处理,即 提高了工作的效率,又使得代码变得简洁优雅。这就是面向切面的编程思想,它是面向对象编程思想的一种扩展。
AOP的使用场景
缓存、权限管理、内容传递、错误处理、懒加载、记录跟踪、优化、校准、调试、持久化、资源池、同步管理、事务控制等
AOP相关概念
切面(Aspect)
连接点(JointPoint)
通知(Advice)
切入点(Pointcut)
代理(Proxy)
织入(Weaving)
十五、代理模式
------ 本由我做的事,交由他人来做
代理机制
静态代理
AspectJ,编译时增强
- 优点
可以做到在不修改目标对象功能的前提下,对目标功能扩展 - 缺点
因为本来和代理类要实现统一的接口,所以会产生很多的代理类,类太多,一旦接口增加方法,目标对象和代理对象都要维护。
动态代理(JDK代理/接口代理)
Spring AOP,运行时增强
代理对象,不需要实现接口,代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象,需要我们指定代理对象/目标对象实现的接口类型。
JDK的动态代理
只能用于实现了接口的类产生代理。
Cglib(Code Generation Library)代理
应用的是底层的字节码增强技术,生成当前类的子类对象。
特点:在内存中构建一个子类对象,从而实现对目标对象功能的扩展。
使用场景
- 修改代码的时候。不用随便去修改别人已经写好的代码,如果需要修改的话,可以通过代理的方式来扩展该方法
- 隐藏某个类的时候,可以为其提供代理类
- 当我们要扩展某个类功能的时候
- 当一个类需要对不同的调用者提供不用的调用权限的使用
- 减少本类代码量的时候
- 需要提升处理速度的时候。就比如我们在访问某个大型系统的时候,一次生成实例会耗费大量的时间,我们可以采用代理模式,当用来需要的时候才生成实例,以提高访问速度
若有不正之处,请谅解和批评指正,谢谢~
转载请标明:
https://blog.csdn.net/vihem/article/details/118560276