spring框架是一个开源的java企业级应用开发框架,主要用来开发web应用,简化java开发。
它有以下特点:
轻量、ioc、aop、容器、mvc框架、事务、异常处理。
轻量:大小只有2mb。
ioc:通过控制反转实现了解耦合,对象们只需要给出它们的依赖就行,而不是创建或者查找依赖的对象们。
aop:支持面向切面编程,将业务逻辑和系统服务分开。
容器:spring可以在容器中管理bean的生命周期配置。
mvc框架:spring的web框架是个精心设计的框架,是web框架很好的替代品。
事务管理:spring提供一个持续的事务管理接口,可以扩展到上至本地事务,下至全局事务。
异常处理:spring框架提供方便的api把具体技术相关的异常转换为一致的unchecked异常。
aop即面向切面编程,它将那些与业务逻辑无关却为系统模块所共同调用的逻辑或者责任封装起来,有利于减少系统的重复代码,降低模块间的耦合度,便于以后的扩展和维护。
主要涉及到的点有连接点、切入点、切面、通知,切入点表达式。
连接点:在程序执行过程中可以插入切面的点。比如一个个的方法。
切入点:特殊的连接点,它需要和通知配合。相当于指定了一个特殊的地点。
切面:切入点+通知。相当于在什么地点干什么事。
通知:定义了在何时做什么。
切入点表达式:用于定位切入点的。
通知:@before、@after、@afterReturning、@afterThrowing、@around,其中环绕通知可以获取到方法的返回值。
用法:定义一个通知类,用切入点表达式定位切入点,然后定义想要的通知。
原理:如果要代理的类实现了某个接口,springaop通过jdk动态代理创建代理类对象;如果要代理的类没有实现某个接口,那么springaop就会使用cglib动态代理创建代理类的子类对象作为代理对象。
当然也可以使用aspectj来实现切面编程,但是aspectj比springaop复杂,一般大量切面用aspectj,少量切面用aop。
ioc控制反转意思就是将对象的创建控制权转移,由spring的容器利用反射机制通过配置文件的信息动态的创建和使用对象。
ioc的依赖注入有三种方式:构造器注入、setter注入和注解注入。
构造器注入好处是可以在对象初始化完成后就可以使用对象,缺点是注入对象很多时构造器参数很长,而且有多种注入方式是需要创建多个构造器。
setter注入:简单方便实用,但是对象初始完成后还不能实用对象。
注解注入:@autowired和@resource
一个默认是按类型注入一个是按名称注入,两者都可以指定name和type注入。
spring集成了20多个模块,常用的有七个。
核心模块:实现了ioc,其中的beanfactory是核心类,可以管理和配置javabean。
context模块:集成了beanfactory类,提供了框架式的bean的访问方式和企业级功能。
web模块:对现有的web框架进行了集成,而且提供了servlet监听和context上下文功能。
web mvc模块:实现了model-view -controller模式。
dao模块:将业务代码和数据库连接代码分离,降低了两者间的耦合度。
orm模块:对市面上的orm框架进行了集成。
aop模块:支持aop,可以进行面向切面编程。
构造器注入、setter注入、注解注入。
spring没有提供bean的线程安全策略,因此spring中的bean是线程不安全的。
singleton、prototype、request、session、globle-session。
singleton定义的bean只有一个实例、prototype为每一个bean请求定义一个实例、request为每一个网络请求定义一个实例、session是确保每一个session中都有一个bean实例、global-session全局作用域。
隐式装配:通过autowired的byname或bytype隐藏配置。
显示装配:在xml文件中显示配置。
编程式事务:通过translationTemplate
声明式事务:通过@translation注解
隔离级别:读未提交、读已提交、可重复读、序列化。
可能出现的问题:脏读、幻读、不可重复读。
序列化直接加的表锁,因此隔离级别最高,不会出现上述问题。
用户发送请求,前端控制器将请求转发给handlermapping处理器映射器,处理器映射器返回一个执行链handler(包含拦截器)给dispatcherServlet,然后中央控制器将handler交给handleradapter处理器适配器适配后调用具体的后端处理器执行handler,执行完成后返回一个modelandview,之后dispaterServlet将modelandview交由视图解析器解析,将逻辑视图转换为真正的视图返回view,接下来再进行渲染视图将数据模型填充到视图中,最后把结果响应给用户。
dispaterServlet:中央调度器,负责把请求转发给对应的控制类。
handlerMapping:处理器映射器,负责根据用户请求的url找到对应的处理器,最终返回处理器对象和拦截器。
handlerAdpter:处理器是适配器,负责适配handler然后调用相应的后端处理器去执行handler,返回modelandview。
modelandview:后端服务器返回的数据和视图类的封装。
viewResolver:视图解析器,将逻辑视图转化为物理视图。
intercepters:拦截器,拦截请求然后做相应的处理工作。
该注解用于处理请求地址的映射。用在类上代表此类中的所有方法的请求地址都以此作为父地址。
该注解用于依赖注入,可以标注于类中的属性上。默认是按照类型自动装配,但是要保证类型唯一;也可以按名称注入,需要配合@Qualifier注解使用。
补:springaop和aspectj区别?
一个运行时增强,一个是编译时增强;springaop是基于代理,而aspectj是基于字节码操作,因此aspectj比springaop功能更强大,但是springaop相对简单一些。推荐大量切面用aspectj,少量切面用springaop。
补:springbean的生命周期?
这个周期的过程太长了,背不过啊啊啊啊!先放过去吧了解一下知道有这么回事。