Spring 什么是spring: spring是一个轻量级的开源企业级框架,主要用来简化开发 spring 的特点: 轻量:基础版本只有2MB 容器(Bean):对象们统一交给spring容器来管理,由spring容器来管理对象们的生命周期以及配置 控制反转(IOC):正常情况下创建对象的权利是对象本身,而在spring 框架中,对象提供依赖,而不是直接构建 切面编程(AOP):spring框架把业务逻辑和系统服务分开,将系统服务比如事务管理,日志等单独封装起来,避免重复代码
SpringMVC M:model包括service mapper entity V:view C:controller Controller用来接收来自view的请求,给model,model在接收之后,执行相应的业务逻辑来完成相应功能,以后在交由controller 返回给view页面显示 常用的注解 @RequsetMapping 用于处理请求url的注解 @RequsetBody 将前端传递的json格式数据转换为Java数据 @ResponseBody 返回给前端数据时,将Java数据转换为json数据
@Autowired注解 按照by type注入装配依赖对象,默认情况下他所装配的对象必须存在,我所用到的基本上就是在service 层需要用到mapper层的方法时,将所需要的类注入到当前类,执行所需要的操作,也就是接口注入
依赖注入的方式 构造注入,setter注入,接口注入 我用到的几乎全部是接口注入,代码压力小,逻辑上也很清晰
Spring Bean的生命周期 记不住,根本记不住,如下
(1) 实例化Bean: 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。对于ApplicationContext容器,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean。 (2)设置对象属性(依赖注入): 实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息以及通过BeanWrapper提供的设置属性的接口完成依赖注入。 (3)处理Aware接口: 接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean:
- 如果这个Bean已经实现了BeanNameAware接口,会调用实现的setBeanName(Stringbeanld)方法,此处传递的就是Spring配置文件中Bean的id值;
- 如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory0方法,传递的是Spring工厂自身。
- 如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文; (4)BeanPostProcessor : 如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforelnitialization(Object obj, Strings)方法。 (5) InitializingBean 5 init-method : 如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。 (6)如果这个Bean实现了BeanPostProcessor接口,将会调用 postProcessAfterInitialization(Object obj, Strings)方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术; 以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。 (7) DisposableBean : 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy(方法; (8)destroy-method : 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法
Spring框架使用的设计模式 记不住…… 简单工厂模式:Spring中的BeanFactory 就是简单工厂模式的体现。根据传入一个唯一的标识来获得 Bean 对象,但是在传入参数后创建还是传入参数前创建,要根据具体情况来定
工厂模式:Spring中的 FactoryBean 就是典型的工厂方法模式,实现了 FactoryBean 接口的 bean是一类叫做 factory 的bean。其特点是,spring 在使用getBean(调用获得该 bean 时,会自动调用该 bean 的 getopject()方法,所以返回的不是 factory 这个 bean,而是这个 bean.getOjbectl)方法的返回值。
单例模式:在 spring中用到的单例模式有:scope="singleton”,注册式单例模式,bean 存放于Map 中。bean name 当做 key,bean 当做 value。
原型模式:在 spring中用到的原型模式有:Scope="prototype”],每次获取的是通过克隆生成的新实例,对其进行修改时对原有实例对象不造成任何影响。
迭代器模式:在 Spring中有个 Compositelterator 实现了 Iterator,Iterable 接口和 Iterator 接口,这两个都是迭代相关的接口。可以这么认为,实现了 Iterable 接口,则表示某个对象是可被迭代的。Iterator 接口相当于是一个迭代器,实现了Iterator 接口,等于具体定义了这个可被迭代的对象时如何进行迭代的。
代理模式:Spring 中经典的AOP,就是使用动态代理实现的,分JDK和CGlib 动态代理。
适配器模式:Spring 中的AOP 中 AdvisorAdapter 类,它有三个实现: MethodBeforAdviceAdapter. AfterReturnningAdviceAdapter. ThrowsAdviceAdapter. Spring 会根据不同的AOP 配置来使用对应的 Advice,与策略模式不同的是,一个方法可以同时拥有多个Advice。Spring 存在很多以 Adapter 结尾的,大多数都是适配器模式。
观察者模式:Spring 中的 Event 和 Listener。 spring事件:ApplicationEvent,该抽象类继承了EventObject 类,JDK建议所有的事件都应该继承自 EventObject。 spring事件监听器:ApplicationListener,该接口继承了 EventListener 接口,JDK 建议所有的事件监听器都应该继承EventListener.
模板模式:Spring 中的org.springframework.jabc.core JdbcTemplate 就是非常经典的模板模式的应用,里面的 execute 方法,把整个算法步骤都定义好了。
责任链模式:DispatcherServlet 中的 doDispatch()方法中获取与请求匹配的处理器HandlerExecutionChain, this.getHandler()方法的处理使用到了责任链模式。
Spring事务的相关 这个部分不太理解
MyBatis 自我理解 就是内部封装了JDBC,这样开发过程中只需要关注sql语句本身即可,需要用到MyBatisX这个插件,就是那个小鸟,在resouses 目录中的xml要与Java目录中的一一对应,否则映射不上,找不到位置,极大的简化了开发,不需要书写jdbc 那一套
#{}和${}的区别 前者是预编译处理,一般在书写sql语句时用到,后者是字符串代替
ResultMap 当实体类中的属性名和表中的字段名不一致时,会使用resultMap将这两个东西映射起来
Springboot 作为spring框架的一种扩展和简化,能够自动装配,简化配置,独立运行,无代码生成和XML配置
核心注解 @SpringBootApplication 标注当前类是springboot的启动类 @SpringBootConfiguration 标注当前类是springboot得配置类 @ComponentScan Spring组件扫描
Springboot的启动方式 打包成jar包运行 利用maven插件运行 在启动类中直接运行
Springboot的热部署 Spring Loaded 用到的地方是微服务相关,使用热部署的依赖,达到实时更新页面的效果 Spring-devtools 没有接触过
Springboot 的核心配置文件 application 在所有的springboot项目中都需要用到 bootstrap 所用到的场所是微服务,用来部署微服务的相关配置
Spring Cloud 微服务,就是将业务分成一个一个的微型服务开发,这样某一个服务挂掉的时候不影响其他服务运行,各服务之间通过微服务的相关技术来接应串联
Nacos Nacos的相关配置就是配置在bootstrap 中的,微服务的各个服务会上传到他上,称之为注册中心,他会检测各个服务的状态,包括各个参数
Feign 前面讲到微服务的各个服务之间会进行“互动”,但是互动的请求路径是写死的,通过实现feign的Client接口,实现灵活查询
Docker 将各种应用装配到一个一个的容器当中,互不影响,一般流程是,下载镜像,下拉容器,便可以使用相关的应用
gateway 网关,可以在boot项目中进行配置,只有满足了条件,才可以经过网关,访问服务
RabbitMQ 生产队列,所学习到的是生产消费模型,生产者在发送数据时,会首先经过网关,然后再经过交换机(exchange),满足了exchange得条件之后,进入指定的消息队列,此时消费者可以消费该服务
Nginx 两大特点: 反向代理,负载均衡 反向代理就是,当监听到所配置的端口以后,nginx会帮助你去访问指定页面,而不是直接去访问,是无感知的一个过程 负载均衡就是,合理的分配资源,承受能力强的,多分,承受能力差的,少分
Redis 非关系型数据库,实现的功能主要是加快访问速度,因为在MySQL 访问数据时需要经过读取磁盘io的过程,但是redis不需要,他是直接读取本地数据,这导致了一个问题是一旦数据量很大的时候,redis会出现问题,为了解决这个问题就是,在进程结束以后,会清理掉redis中内容,当下次再需要的时候,再下载进去