spring
1.控制反转(IOC):未使用spring框架之前,我们通常是自己new对象来调用方法。而应用spring框架后,把创建对象的操作交由spring容器为我们创建对象,需要用时由spring容器提供对象。这便是控制反转的通俗理解了。
作用:主要便是降低代码耦合度。
IOC是应用了工厂设计模式来实现的,Bean工厂创建bean对象,以key-value的形式存储在一个Map中。再由applicationContext.xml 配置bean对象给spring容器。
us=com.abc.service.impl.UsersServiceImpl
bean标签的基本配置:
bean标签: 把指定的类交给spring管理,让spring创建这个类的对象
id:唯一标识
class:bean的全限定类名(类的全路径地址)
<bean id="us" class="com.abc.service.impl.UsersServiceImpl"></bean>
spring的bean作用域:
<bean id="us" class="com.abc.service.impl.UsersServiceImpl" scope="singleton"></bean>
1.singleton:只有一个该bean 的实例对象,spring默认使用该属性。--单例
2.prototype:一个容器可以有多个该bean的对象,每次请求都会创建一个新的 bean 实例。
3.request:将创建的bean对象放到request作用域中,仅在它对应的请求期间有效。
4.session:将创建的bean对象放到session作用域中,仅在它对应的请求期间有效。
5.global-session: 全局session作用域,仅portlet的web应用中使用。
2.依赖注入DI:是Spring的Ioc核心的具体实现。
依赖注入即是让spring来完成属性的赋值。以往给类的属性赋值,一般是用set方法或者有参构造。
xml配置注入:
property标签: 告诉spring这个类里面有什么样的属性,要完成赋值工作。
name :属性的名字是什么
ref: 给这个属性注入的是一种对象类型 ,要写的是一个对象的id值
value : 给这个属性注入的是一种普通的数据(字符串、基本数据类型)
<!-- set方式注入-->
<bean id="us" class="com.abc.service.impl.UsersServiceImpl">
<property name="属性名" value="属性值"></property>
<property name="属性名" ref="bean的id"></property>
</bean>
3.AOP:面向切面编程。
即是给某部分初始代码再写一个通知方法(增强方法代码)给接到该初始代码上作扩展。
这里应用代理的方式实现,便达到了不修改源码的情况下,进行功能增强,通过动态代理实现的;减少重复代码,提高开发效率,方便维护。
xml部分配置:
<aop:config>
<aop:aspect ref="通知对象">
<aop:before method="通知对象里的通知方法" pointcut="切入点表达式(增强方法路径)"/>
</aop:aspect>
</aop:config>
通知的几种类型:
前置通知——目标方法运行之前调用 @Before 前置通知
后置通知——目标方法运行之后调用(如果出现异常不调用) @After 后置通知
环绕通知——目标方法之前和之后都调用 @Around 环绕通知
异常拦截通知——如果出现异常,就会调用 @AfterThrowing 抛出异常后通知
后置通知——目标方法运行之后调用(无论是否出现异常都会调用)
AOP的代理主要分为静态代理和动态代理。而动态代理主要有两种方式:
JDK动态代理和CGLIB的动态代理。
4.事务:
spring支持编程式事务管理和声明式事务管理两种方式。实际上是对数据库事务的支持,事务的作用是保证事务里多个操作,要么全部成功,要么全部失败。
事务特性:ACID
事务并发问题:脏读、不可重复读、幻读。
事务隔离级别:读未提交、读已提交、可重复读、串行化。
spring实现事务的原理:
在某个方法上增加@Transaction注解,开启事务,这个方法中的所有sql都会在一个事务中执行,统一成功或者统一失败。
进入正题:在一个方法上加了@Transaction注解后,Spring会基于这个类生成一个代理对象,会将这个这个代理对象作为bean,当使用这个代理对象的方法时,若该方法上存在@Transaction注解,那么代理逻辑会把事务的自动提交设置为false,然后再去执行原本的业务逻辑方法,如果执行的业务逻辑没有出现异常,那么代理逻辑中就会将事务进行提交,如果执行的业务逻辑方法出现了异常,那么会将事务进行回滚。
5.SpringMVC 的工作原理:
1.用户向服务器发送请求,请求被前端控制器 DispatchServlet 捕获;
2.DispatcherServle 对请求 URL 进行解析,根据得到的请求资源标识符(URL),调用 HandlerMapping 处理器映射器;
3.HandlerMapping 将找到处理请求的Handler (Controller)返回给DispatcherServle;
4.DispatcherServle通过HandlerAdapter 处理器适配器请求执行Handler ;
5.Handler将处理好的模型数据和视图名称给HandlerAdapter,其再传给DispatcherServle;
6.DispatcherServle再调用ViewResolver 视图解析器 将逻辑视图转化为真正的视图 View;
7.DispatcherServle通过model 解析对View进行渲染;
8.DispatcherServle获取到处理好的ModelAndView响应给用户。
6.springboot自动配置原理分析:
1.启动类启动,加载注解@SpringBootApplication
1)又加载@SpringBootConfiguration 相当于配置类;
2)同时又加载@EnableAutoConfiguration 开启自动配置; a.@Import(AutoConfigurationImportSelector.class) 导入选择自动配置类;
b.调用selectImports方法(2.0.3)加载109个自动配置类(从spring.factories配置文件中获取的) 调用getAutoConfigurationEntry(2.1.0)加载118个自动配置类;
c.每个配置类都有条件接口,条件判断@ConditionalOnClass(xxx.class)pom文件中是否有依赖 有依 赖则继续执行 没有不执行了;
d.条件判断@ConditionalOnMissingBean(name = "xxx")spring容器中是否有bean对象 有,就不创建;没有,就创建。
3)@ComponentScan 扫描当前启动类所在包或子包,创建bean对象放到容器中。
7.Spring Cloud:是一个集成各技术的技术栈,包含了很多组件。
其中的几个核心组件:
Eureka:服务注册于发现。
Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。
Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。