spring是一个免费开源的应用框架,旨在降低程序的开发难度,轻量级,松耦合。ioc依赖注入控制反转,aop切面编程能将系统服务与应用逻辑服务隔离,以实现高类聚。mvc对web应用提供了高可配性。事务管理层提供事务管理的抽象层。jdbc提供了jdbc通用的异常层次结构,简化了错误处理策略。
aop即切面编程它与oop相辅相成,它提供了与oop不同的软件结构抽象视角,在oop中对象作为基本单元。在aop中aspect作为基本单元
aspect由pointcut和advice组成,它既包括横切逻辑的定义也包含了连接点的定义。它的主要工作就是通过pointcut和advice定位到joinpoint上和在advice上编写代码。
joinpoint就是程序运行的时间点,如方法的执行或异常的处理
advice就是在特定的joinpoint处,aspect所采取的动作,springaop在joinpoint周围使用advice作为拦截器。
advice包括before,afterreturning,afterThrow,after,around几种模式
为创建一个advice对象而链接aspect和其他应用类型对象,称为编织。
1.引用spring-boot-start-aop依赖项
2.创建adviceconfig配置类,用configuration注解标记为配置类。用aspect注解标记为切面
3.用befor,after,around注解标记方法,并表明具体切入方法。
spring的核心就是ioc容器,他们创建对象,配置和管理对象的完成生命周期。通过依赖注入管理应用程序的组件
ioc通过工厂模式和反射机制原理实现
ioc包括beanfactory和applicationcontext两种容器;beanfactory是bean的集合工厂类。它会在客户端的要求时实例化bean,applicationcontext接口扩展了beanfactory。它在beanfactory的基础上提供了一些额外的功能。如支持依赖注入,支持国际化,使用即时加载,自己创建和管理资源对象。
1.实例化bean,反射机制,通过creatBeanInstance方法产生。
2.给生成的bean填充属性,通过populateBean方法,循环依赖问题在这里产生。
3.如果实现了beanNameaware方法,则传递对象id,调用setbeanname方法
4.如果实现了beanFactoryaware方法,则传递bean对象,调用setbeanFactory
5.如关联beanPostprocess前置方法则调用前置方法
6.如果实现init方法,则调用init方法
7.如关联beanPostprocess后置方法则调用后置方法
8.如果实现disposableBean方法,则调用detroy方法,制定了distroy方法则调用指定distroy方法
循环依赖采用三级缓存概念;一级缓存:单列对象,完整bean;二级缓存:早期单列对象,半成品;三级缓存:单列工厂对象
解决过程:
1.通过反射实例化a对象,把a对象的工厂对象放入三级缓存。
2.a属性注入又依赖b对象,b对象实例化把b对象的工厂对象放入三级缓存对象
3.b对象属性注入又依赖a对象,三级缓存中已存在a对象的工厂对象,通过工厂,生产代理对象放入二级缓存后删除三级缓存对象。
4.b对象拿到a代理对象就可以直接完成装配,放入一级缓存。删除三级缓存的工厂对象
5.a对象实例化完成就可以把a对象从二级缓存同步到一级缓存,销毁二级缓存对象。
装配就是当bean在spring容器中组合在一起时,它被称为装配
在spring中提供了自动装配,也就是说可以通过检查beanfactory的内容让spring自动解析bean的协作者
主要模式有:
1.no没有自动装配,默认设值,只有使用显示bean引用进行装配。
2.byname它根据对象的名称注入对象依赖项
3.bytype它根据对象类型注入对象依赖项
4.构造函数 通过调用类的构造函数注入依赖项
5.autodetect首先尝试使用构造函数注入依赖项,如果不能,则尝试通过byname装配
注解装配:
spring容器中为打开注解装配,因此要使用基于注解的装配,我们必须通过配置 .annotation-config>在spring配置文件中启用它 1.component:是spring管理组件的通用构造型,spring扫描机制可以将其拉入应用环境 2.controller:将一个类标记为spring web mvc控制器。标有它的bean会自动导入到ioc容器中。 3.service:此注解是组件注解的特化,它不会对component注解提供任何其他行为。你可以在服务层中使用service它可以更好的指定意图 4.repository:这个注解是具有类似功能和用途的conponent注解的特化。它为dao提供了额外的好处,它将dao导入ioc容器,并使未经检查的异常有资格转换为springdataAccessexception 5.required:应用于bean的属性setter方法,此注解仅指示必须使用过bean定义的显示属性,或自动装配填充受影响的bean属性,如未填充受影响的bean属性则抛出异常。 6.autowired:作用于setter和构造函数默认情况下它是类型bytype注入,想使用名称,可以结合quaifier注解使用,默认依赖对象必须存在。如果允许为null,可以设置它的requid属性为false 7.resource:resource不是spring的注解,但spring支持该注解的注入,默认按照byname自动注入,有两个重要的属性name和type,name按照name依赖注入,type按照bytype依赖注入。 1.用户发送请求至前端控制器dispatcherservlet 2.dispatcherservlet收到请求调用handermapping处理器映射器 3.处理器映射器找到具体的处理器,生产处理器对象及处理器拦截器-并返回给dispatcherservlet 4.dispatcherservlet调用handlerApter处理器controller 5.controller执行完妇女会modelandview 6.handlerApter将controller执行结果modelandview返回给dispatcherservlet 7.dispatcherservlet将modelandview传给viewreslover视图解析器 8.viewreslover解析返回具体的view 9.dispatcherservlet根据view进行渲染视图相应给用户注解:
4.mvc