Spring是一个开源的轻量级控制反转和面向切面编程的容器框架。轻量级是说它开发使用简单,功能强大。控制反转是指将对象的创建,销毁控制交给ioc容器,方便解耦合,降低维护难度。面向切面编程是指将相同的逻辑横向抽取出来,可以对一些通用业务如事务,日志进行集中管理。
六个模块:
一:spring context 提供框架式的bean访问方式,以及企业级功能,还可(JNDI、定时任务)
二:spring core 核心类库,所有功能都依赖该类库,提供IOC 和 DI服务
IOC:控制反转,将创建对象的权利交给spring管理,由spring来负责控制对象的声明周期。对于某个对象而言,以前是由自己控制它引用对象的生命周期,而在IOC中,所有对象都被spring控制,控制对象的生命周期不再是引用它的对象,由spring容器帮我们创建、查找、以及注入依赖对象。引用对象只是被动的接受对象。
DI: 依赖注入, 应用程序在运行时,依赖IOC容器来动态获取注入对象所需要的外部依赖。而DI具体就是通过反射来实现注入的,反射允许。
三:spring web提供了基本的面向web的综合特性,提供对常见框架如Struts2的支持,spring管理这些框架将spring的资源注入给框架,也能给这些框架后面增添拦截器。
四:spring MVC 提供面向web应用的model-view-controller 即mvc来实现。
五:spring DAO 对JDBC的抽象封装,简化了数据访问异常的处理,并能统一管理JDBC事务。
六:spring ORM 对现有的ORM框架的支持。
Spring的依赖注入方式
方式一:setter方式注入,通过反射调用无参构造方法生成对象,再通过对于的setter方法注入配置的值,支持注解和xml两种实现方式
方式二:构造器方式注入,通过反射调用有参构造方法生成对象,支持注解和xml两种实现方式
注解实现方式:@Autowired,它是默认按类型匹配的、@Resource,它是默认按名字匹配的
spring的优点:
一:spring属于低侵入式设计,代码污染极低。
二:spring的DI机制将对象之间的依赖关系由框架处理,减少组件的耦合性。
三:spring提供了对AOP的技术支持,将一些通用任务,如安全、事务、日志、权限等进行集中管理,从而提供更好的复用。
AOP 面向切面编程:用于将哪些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装成一个可复用的模块,允许开发者定义纵向的关系,但不适用于定义横向的关系,会导致大量的代码重复,而不利于各个模块的复用。
四:spring对于主流的应用框架提供集成支持。
AOP的动态代理:
①:JDK的动态代理值提供接口的动态代理,不支持类的代理,要求被代理类实现接口。
②: CGLIB动态代理是一个代码生成的类库,可以在运行时动态生成指定类中的一个子类对象,并覆盖其中特定的方法,并添加增强模块,以实现AOP。
静态代理:
与动态代理的区别就是,生成AOP代理的对象时机不同,相对来说:Aspect的静态代理方式效果更好,但是Aspect需要特定的编译器进行处理,而spring AP则无需特定的编译器处理。
IOC让相互协作的组件保持松散的耦合,而AOP编程允许把遍布应用各层的功能分离出来形成可重用的功能组件。
连接点:指程序允许过程中,所执行的方法,一个连接点总代表一个一个方法的执行。
切面:被抽取出来的公共模块,可以用来横切多个对象,Aspect切面,可以看成point cut切点和advice通知的结合,一个切面可以由多个切点和通知组成。
切点:用于要对哪些join point进行拦截
目标对象:包含连接点的对象,也称作为被通知的对象,由于springAop通过动态代理实现的,所以这个对象永远是一个代理对象。
织入:通过动态代理,在目标对象的方法中执行增强逻辑的过程。
引入:添加额外的方法或者字段到被通知的类,spring允许接入新的接口到任何被代理的对象。
通知:指要在连接点上执行的动作,即逻辑的增强,比如权限的校验。
通知类型:
1. 前置通知:在连接点之前执行的通知。
2. 后置通知:当连接点退出之后执行的通知。
3. 环绕通知:包围一个连接点的通知,这是最强大的一种通知,它可以选择是否继续执行连接或者返回它们自己的返回值或抛出异常来结束执行。
4. 返回后通知:在连接点正常完成后执行的通知。
5. 抛出异常通知:在方法抛出异常退出执行的通知。
Spring的Bean懒加载和非懒加载
懒加载:需要使用对象的时候才创建,节省资源,但不利于提前发现错误。 如果需要懒加载,可以使用@Lazy注释或者xml中配置属性default-lazy-init="true"
非懒加载:也叫迫切加载,容器启动时就创建对象,消耗资源,但有利于提前发现错误。 spring中默认时迫切加载,即在项目启动时,spring会扫描符合条件的所有bean并将其初始化