Spring

本文详细介绍了Spring框架的核心特性,包括控制反转(IoC)和面向切面编程(AOP)。Spring通过IoC容器管理对象依赖,降低了组件间的耦合,同时提供了AOP支持,便于实现事务管理、日志记录等功能。文章还阐述了Spring的DI(依赖注入)概念,以及BeanFactory和ApplicationContext的应用上下文。此外,讨论了Spring的Bean作用域、自动装配和扫描包功能。AOP方面,文章解释了其在处理横切关注点上的优势,以及Spring AOP的实现机制,包括织入、代理和切面。
摘要由CSDN通过智能技术生成

Spring是分层的JavaEE应用一站式的轻量级开源框架,以控制反转(Inverce of Control,Ioc)和面向切面编程(Aspect Oriented Programming,AOP)为内核,提供了表现层SpringMVC,持久层SpringJDBC以及业务层事务管理等众多的企业级应用技术。
Spring简化Java开发
Spring整合了大量著名的第三方框架和类库(如Struts,Hibernate,Mybatis,iBATIS,JPA,Web Service,FreeMaker等),逐渐成为使用最多的javaEE企业应用开源框架。

Spring的特点
1方便解耦,简化开发(核心);通过Spring提供的IoC容器,可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合;
2AOP编程的支持(核心);通过Spring提供的AOP功能,用户可以方便地进行面向切面编程,许多不容易用传统面向对象编程(OOP)实现的功能都可以通过AOP轻松应对;
3声明式事务的支持(核心);通过Spring的声明式事务灵活地进行事务管理,提高开发效率和质量。
4方便的程序测试;可以用非容器依赖的编程方式进行几乎所有的测试工作
5方便集成各种优秀的框架;Spring不排斥各种优秀框架,并提供对各种优秀框架(如Struts,Hibernate,Hessian,Quartz等)的支持
6降低JavaEE API的使用难度;Spring为很多难用的JavaEE API(如JDBC,JavaMail,远程调用等)提供了一个简单封装。通过Spring的简单封装,大大降低了这些JavaEE API的使用难度
7Spring源码是经典的学习范例;Spring的源码设计合理,结构清晰,处处体现出对Java设计模式的灵活运用以及Java技术的深度挖掘。

IoC概念
控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转。控制权转移带来的好处就是降低了业务对象之间的依赖程度。

传统方式:表现层→(调用依赖关系)→业务逻辑层→(调用依赖关系)→数据访问层

DI概念
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要得分其他对象。这一点是通过DI来实现的;
依赖注入是组装应用对象的一种方式,对象无需知道依赖来自何处或者依赖的实现方式。依赖对象通常只能通过接口了解所注入的对象,这样就能确保低耦合。
依赖注入,方式有:
构造器注入
方法注入
接口注入
注意:Spring的IoC容器只支持构造器和方法注入。
DI和AOP是Spring框架最核心的部分。

IoC容器是Spring框架的核心,Spring容器使用依赖注入管理构成应用的组件,它会创建相互协作的组件之间的关联。Spring自带了几种容器的实现,可以归为两种类型
BeanFactory(Bean工厂)
是spring最核心的接口,它提供了高级IoC的配置机制。BeanFactory使管理不同类型的java对象成为可能
ApplicationContext(应用上下文):
它是建立在BeanFactory基础之上,提供了更多面向应用的功能。一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文。
注意:BeanFactory是Spring框架的基础设施,属于底层封装组件,ApplicationContext面向Spring框架的开发者,属于上层封装组件,专门供开发者使用;

Spring有几种获取ApplicationContext应用上下文实例的方式,分别如下:
1ClassPathXmlApplication-从类路径下的XML配置文件中加载上下文定义,把应用上下文当作类资源;
2FileSystemXmlApplicationContext-读取文件系统下的XML配置文件并加载上下文定义;
3XmlWebApplicationContext-读取Web应用下的XML配置文件并加载上下文定义

IoC容器在加载时装配所有Bean,提升了性能,以空间换时间

装配Bean
Bean元数据信息在Spring容器中的内部对应物是由一个个BeanDefinition形成的Bean注册表
有三种方式:
基于XML配置
基于注解的配置
基于Java类的配置

Spring容器中,所有的Bean默认都是单例。当容器分配一个Bean时,它总是返回Bean的同一个实例。
有时需要每次请求时都获取唯一的Bean实例,则可以为Bean声明一个作用域。Spring支援配置Bean作用域如下:
singleton:在每一个Spring容器中,一个Bean定义只有对象实例;
prototype:允许Bean的定义可以被实例化任意次(每次调用都创建一个实例);

内部Bean的特点是不能被复用。内部Bean仅适用于一次注入,而且不能被其他Bean所引用。
简化Bean配置,Spring提供了两种方式,可以简化XML配置Bean
自动装配:用于减少甚至消除配置< property>元素和< construtor-arg>元素,让Spring自动识别如何装配Bean的依赖关系
自动检测:用于让Spring能够自动识别到哪些类需要被装配成Bean,从而减少对< bean>元素的使用
注意:当自动装配和自动检测一起使用时,他们可以明显简化XML配置和Bean的操作。

byName根据属性名装配;把与Bean属性具有相同id的其他Bean自动装配到Bean对应属性。
byType根据属性类型装配
@Resource注解作用与@Autowired相同,不同在@Resource注解默认byName,而@Autowired默认bytype。
@Scope注解用来指定bean的作用域
@Value注解–给基本数据类型或String类型赋值

扫描包
@Conponent 通用
@Controller 表现层
@Respository 持久层
@Sevrice 逻辑层

AOP通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
AOP是OOP的延续和有益补充,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑的各个部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
在Spring中提供了AOP的丰富支持,允许通过分离应用的业务逻辑与系统及业务逻辑,并不负责其他系统级关注点,例如日志或事务支持

AOP与OOP区别
AOP和OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。这两设计思想在目标上有着本质的差异。
OOP针对业务处理过程的实体及其属性和行为进行抽象封装,以获取更加清晰高效的逻辑单元划分。
AOP针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。
AOP绝对不会代替OOP,而是与OOP整合起来,取长补短。

横切关注点:在软件开发中,分布于应用中多处的功能被称为横切关注点。
AOP主要功能如下:
日志记录;性能统计;安全控制;事务处理;异常处理;其他功能

AOP通过横向抽取机制为这类无法通过纵向继承体系进行抽象的重复性代码提供了解决方案。

连接点是插入代码的位置,Spring仅支持方法的连接点,仅能在方法调用前,方法调用后,方法抛出异常时以及方法调用前后这些程序执行点织入增强。
切点(查找连接点的方式和条件)定位连接点的方式,连接点相当于数据库的记录,而切点相当于查询条件。
静态方法切点
动态方法切点
注解切点
表达式切点
流程切点
复合切点
增强是织入到目标类连接点上的一段程序代码。Spring中,增强除用于描述一段程序代码外,还拥有另一个和连接点相关的信息-执行点的方位。结合执行点的方位信息和切点信息,AOP就可以找到特定的连接点。
因为增强既包括了用于添加到目标连接点上的一段执行逻辑,有包含用于定位连接点的方位信息。
目标对象(Target)是增强逻辑的织入目标类。通过AOP,业务逻辑类只需要实现非横切逻辑的代码,而性能监视,事务管理横切逻辑则可以使用AOP动态织入到特定的连接点上。
引介(Introduction)是一种特殊的增强,它为类添加一些属性和方法。
**织入(**Weaving)织入是将增强添加到目标类具体连接点上的过程。AOP有三种织入方式:
编译器织入:要求使用特殊的Java编译器
类装载期织入:要求使用特殊的类装载器
动态代理织入:在运行器为目标类添加增强生成子类的方式
Spring采用动态代理织入方式

代理(Proxy):一个类AOP织入增强后,就产生了一个结果类,它是融合了原类和增强逻辑的代理类。根据不同的代理方式,代理类既可能是和原类具有相同接口的类,也有可能就是原类的子类,所以,可以采用调用原类相同的方式调用代理类。

切面(Aspect)切面由切点和增强或引介组成。既包括了横切逻辑的定义,也包括了连接点的定义。
Spring AOP负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。
Spring支持两种方法匹配器:
静态方法匹配器:它仅对方法名签名(包括方法名和入参类型及顺序)进行匹配,且仅会判别一次
动态方法匹配器:它支持在运行期检查方法入参的值,每次方法调用都必须判断。动态匹配对性能的影响很大,不常使用。
切面类型:
静态普通方法名匹配切面
静态正则表达式匹配切面
动态切面
流程切面
复合切点切面
引介切面–是引介增强的封装器,可以更容易为现有对象添加任何接口的实现;
Spring采用的机制时在创建代理时对目标类的每个连接点使用静态切点检查,如果仅通过静态切点检查就可以知道连接点时不匹配的,则在运行时就不再进行动态检查;如果静态切点检查是匹配的,在运行时才进行动态切点检查。
在动态切点类定义切点检查的方法可以防止不必要的动他检查操作,可以极大地提高运行效率;

SpringAOP:使用纯Java实现,它不需要专门的编译过程,也不需要特殊的类装载器,它在运行期通过代理的方式向目标织入增强代码。SpringAOC使用了两种代理机制。
JDK动态代理,CGlib动态代理的区别:默认采用JDK
JDK动态代理采用的是代理接口的方式实现的,所以使用JDK动态代理必须要有接口
CGlib动态代理采用的继承的方式来实现的。代理类继承目标类,所以使用CGlib动态代理不需要接口

设计模式是一套为反复使用多人知晓,经过分类编目的代码设计的经验总结。–概念
使用设计模式是为了可重用代码,让代码更容易被理解,提升代码的可拓展性和维护性,通用的设计模式有23个,每一个设计模式都是某一类典型问题的解决方案。–作用
模式不能套用,不要以为在任何一个系统中都能使用设计模式,系统设计也不是设计模式越多越好。
设计模式的本质是面向对象特性的实际应用,具体而言就是封装,继承和多态的反复使用。市面上关于设计模式的书没有一本适用于初学者。–使用
《java设计模式》《大话设计模式》《研磨设计模式》《设计模式之禅》《headfirst》《设计模式可复用面向对象软件的基础》

设计模式------1定义2DML类图 3优点缺点 4常见使用场景

代理设计模式 客户端不直接调用目标对象,而是通过调用代理对象,间接访问目标对象;用于解决控制目标对象的访问权限以及增加目标对象的额外功能 优点:代理模式能将代理对象和目标对象分离,在一定程度上降低了系统的耦合度;代理模式在客户端和目标对象中起到中介的作用,这样可以控制目标对象的访问,并增加额外的操作。 缺点:一定程度上增加了系统的复杂度,降低了系统的性能。 常见使用场景:远程代理–为一个位于不同地址空间的对象提供一个本地对象;虚拟代理–如果要创建一个消耗较大的对象,先创建一个消耗较小的对象来表示,真实对象只在需要时才被创建,Hibernate的延时加载就是通过虚拟代理实现的;安全代理–用来控制对目标对象的访问权限;防火墙代理–保护目标不被恶意用户攻击;

类关系:纵向:继承,实现接口;横向:依赖,关联,聚合,组合。

增强类型
Spring使用增强接口定义横切逻辑,同时由于Spring只支持方法连接点,所以增强既包含横切逻辑,还包含部分连接点信息;Spring增强类型如下:
前置增强:BeforeAdvice类代表前置增强,表示在目标方法执行前实施;;
后置增强:AfterReturingAdvice接口代表后置增强,表示在目标方法执行后实施增强
环绕增强:MethodInterceptor接口代表环绕增强,表示在目标方法前后实施增强;
异常抛出增强:ThrowsAdvice接口代表抛出异常增强,表示在目标方法抛出异常后实施增强;

ProxyFactory(代理工厂)代理接口,目标对象,增强对象

注解@Aspect 声明切面类
@Before 前置增强 -----通配符:
代表任意字符,匹配上下文中的一个元素
…代表任意字符,可以代表多个元素,但是在表示类的时候不能单独使用,必须配合
;在代表形参的时候可以单独使用
+代表任意类型匹配指定类的所有类(包括子类),只能跟在类名的后面
execution(返回类型+方法包名+类名+方法名+参数类型)
@After
@Around
@AfterThrowing
@Pointcut 定义切入点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值