spring笔记

142 阅读7分钟

Spring核心原理

Spring是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架

一、spring容器的主要核心:

1.IOC(Inversion of Control)控制反转:

简单地说,由spring来负责控制对象的生命周期和对象间的关系。传统的Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IOC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;就是把new对象实例化的工作交给spring容器来完成,spring帮我们负责销毁对象,控制对象的生命周期,在需要使用对象的时候直接向spring申请即可。控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

2.DI(Dependency Injection)依赖注入:

组件之间依赖关系由容器在运行期决定,由容器动态的将某个依赖关系注入到组件之中。在系统运行中,动态的向某个对象提供它所需要的其他对象。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

注入方式:set方式注入、构造器注入、工厂方法注入,注解方式注入

set方式注入:目标对象中需要提供相关的set方法,需要调用set方法将资源传递给目标对象使用。

构造器注入:目标对象中提供带参数的构造方法,通过构造方法将资源传递给目标对象使用。

静态工厂注入:调用静态工厂的方法来获取自己需要的对象。

实例工厂注入:实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法

注解方式注入:Spring2.5之后,Spring增加了注解注入。@Autowired 注解,可以对Bean类成员变量、方法及构造函数进行标注,完成依赖注入的自动装配工作。使用@Autowired可以省略Bean类的待依赖注入对象的set方法。@Resource注解的功能和@Autowired注解功能相近,@Resource有name和type两个主要的属性。Spring容器对于@Resource注解的name属性解析为bean的名字,type属性则解析为bean的类型。因此使用name属性,则按byName模式的自动注入策略,如果使用type属性则按 byType模式自动注入策略。如果两个属性都未指定,Spring容器将通过反射技术默认按byName模式注入。

注:在 Spring 中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。bean是一个由Spring IoC容器实例化、组装和管理的对象。

IOC/DI 底层是通过反射实现的,可以通过某个类的权限定名用 Class.forName(类的权限定名)获取这个类的类对象,再通过这个类的类对象通过Clazz.getInstance()方法类创建一个bean实例。

3.AOP(Aspect-OrientedProgramming)面向切面:

纵向重复的代码横向抽取,使用过滤器 Filter

在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程

中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。

注意:AOP 底层是动态代理,如果是接口采用 JDK 动态代理,如果是类 采用CGLIB 方式实现动态代理

二、Spring 能帮我们做什么?

Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系。

Spring 根据配置文件来进行创建及组装对象间依赖关系,只需要改配置文件即可

Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。

Spring 面向切面编程能提供一种更好的方式来完成,一般通过配置方式,而且不需要在现有代码中添加任何额外代码,现有代码专注业务逻辑。

Spring 能非常简单的帮我们管理数据库事务。我们只需获取连接,执行 SQL,其他事物相关的都交给 Spring 来管理了。

Spring 还能与第三方数据库访问框架(如 Hibernate、 JPA)无缝集成,而且自己也提供了一套 JDBC访问模板,来方便数据库访问。

Spring 还能与第三方 Web(如 Struts、 JSF)框架无缝集成,而且自己也提供了一套 Spring MVC框架,来方便 web 层搭建。

Spring 能方便的与 Java EE(如 Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)。

\

spring aop场景中使用:

Authentication 权限

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading 懒加载

Debugging  调试

logging, tracing, profiling and monitoring 记录跟踪 优化 校准

Performance optimization 性能优化

Persistence  持久化

Resource pooling 资源池

Synchronization 同步

Transactions 事务

\

\

方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的 Advisor或拦截器实现。

连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用或特定的异常被抛出。

通知(Advice): 在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。Spring中定义了四个advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice

切入点(Pointcut): 指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点:例如,使用正则表达式。 Spring定义了Pointcut接口,用来组合MethodMatcher和ClassFilter,可以通过名字很清楚的理解, MethodMatcher是用来检查目标类的方法是否可以被应用此通知,而ClassFilter是用来检查Pointcut是否应该应用到目标类上

引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。Spring中要使用Introduction, 可有通过DelegatingIntroductionInterceptor来实现通知,通过DefaultIntroductionAdvisor来配置Advice和代理类要实现的接口

目标对象(Target Object): 包含连接点的对象。也被称作被通知或被代理对象。POJO

AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。

织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

\

blog.csdn.net/a745233700/…

一、spring组成

spring core、spring aop、spring context、spring jdbc、spring orm、spring web、spring mvc

常见配置:java代码配置、java 注解、xml

二、spring优点

spring属于低侵入式设计,代码的污染极低;

spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;

spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。

spring对于主流的应用框架提供了集成支持。

三、

\

\

\

aop www.jianshu.com/p/5b9a0d77f…

www.cnblogs.com/benbencyb/p…

\