开发框架
Posted miraclemaker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发框架相关的知识,希望对你有一定的参考价值。
1.什么是Spring:
- 是一个轻量级的框架,通过AOP可以提高内聚性,通过IOC可以松耦合,方便的对数据库进行访问,方便的集成第三方组件,支持RestFul应用的开发,但是组件配置较为繁琐,所以推出了SpringBoot。
2.Spring,SpringMvc,SpringBoot三者的关系:
- SpringMVC是Spring的子容器,他们都是用来管理Bean对象的。SpringMVC管理Controller层的对象Spring管理Service和DAO层的对象。子类容器可以访问父类容器中的对象,所以Controller中可以调用service和dao层的对象,但反过来不可以。SpringMVC赋予Spring快速构建MVC程序的能力。
- spring运用时需要复杂的XMl配置,为了简化开发,出现了SpringBoot,做到开箱即用。
3.什么是IOC和AOP:
- IOC:是一种控制反转思想,将对象的创建和调用从开发人员手中转移到IOC容器进行管理,降低了对象间的依赖关系,实际项目里一个service引用的类是非常多的,如果每次都要进行调用类的初始化,这是不可能的。创建Bean对象后我们一般用@Autowired(按照bytype注入,默认按类型装配)或者@resources(按照byName注入,默认按名称装配)注解进行自动装配。
- IOC原理:
。ioc初始化:加载bean生成BeanDefinition保存到map集合里,即ioc容器内,ioc容器对这些bean进行处理和维护;
。bean的初始化和依赖注入:对单例bean进行初始化,用@Autowired或getbean获得bean使用;
- AOP:面向切面(将很多横切方法组成一个面)编程思想,将与业务功能无关,但是很多业务都要调用的功能抽离出来,不侵入原代码的同时增强功能。创建抽离代码的bean的时候,创建的是bean的代理。基于JDK动态代理实现的,类实现了接口就是jdk,没实现就是cglib。
4.将一个类声明为Bean的注解有哪些
。@Component :通用的注解,可标注任意类为 Spring 组件。
。@Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
。@Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
。@Controller : 返回⼀个视图,前后端不分离使用。
- @Component和@Bean注解的区别:
。@Component 注解作用于类,而@Bean注解作用于方法。
。@Component与@ComponentScan(路径)配合使用根据类路径扫描@Bean,自动生成对象。 。@Bean标注的是根据方法手动生成的对象。在引用第三方类需要装配到容器时只能用@Bean。
5.注入Bean的注解:
- @Autowired :byType(默认按照接口类型装配),当一个接口有多个实现类,@Autowired 转换为byName(按照类名称装配)。
- @Resource:byName(默认按照类名称装配)。
- 当一个接口有多个实现类,@Autowired 和@Resource都需要通过名称才能正确匹配到对应的 Bean。Autowired 可以通过 @Qualifier 注解来显式指定名称,@Resource可以通过 name 属性来显式指定名称。
6.Bean的作用域:
- sington:在ioc容器中只能存在唯一一个Bean实例
- prototype:每次获取都会创建一个Bean实例
- request:每次HTTP请求时创建一个Bean实例,只在当前HTTP中起作用
- session:每次来自新session的http请求时创建Bean实例
- globalSession:全局session共享一个bean实例
7.Bean的生命周期:
- 采用反射实例化Bean对象->设置对象属性->前置处理->配置init-method否->后置处理->使用中->配置destory-method否。期间可以进行一些实现一些接口增强功能。
8.如何定义一个全局异常类:
- 类上添加@ControllerAdvice注解,然后定义一些用于捕捉不同异常类型的方法,在这些方法上添加@ExceptionHandler(value = 异常类型.class)和@ResponseBody注解,方法参数是HttpServletRequest和异常类型。
9.什么是循环依赖,spring怎么解决的
- 创建A实例的时候,a实例包含着b属性实例,b实例又包含a属性实例。
- spring采用三级缓存解决:
。一级缓存:缓存经过完整生命周期的Bean;
。二级缓存:缓存未经过完整生命周期的Bean;
。三级缓存:是一个object工厂,可以生成代理类;
创建a到一半去创建b,此时将a放入三级缓存,创建b的时候如果需要代理对象就生成,不需要就直接从三级缓存中取,取完将a放入二级缓存;b对象属性完成注入创建完成后,自己放入一级缓存,其他需要依赖a的可以去二级缓存中取,等待a对象的属性也完成注入后将a放入一级缓存。
10.SpringMVC工作原理
- dispatcherservlet作为中央处理器先接受请求,将请求传到HanderMappering,HanderMappering一系列过滤器找到适合处理的Hander返回给dispatcherservlet。
- dispatcherservlet将过滤器和Hander包装好后给HanderAdapter适配执行Hander返回数据对象和逻辑视图ModelAndView给dispatcherservlet。
- dispatcherservlet将逻辑View传给ViewResolver,ViewResolver根据逻辑View查找实际VIew返回给dispatcherservlet。
- dispatcherservlet将model与view整合返回给浏览器。
11.spring用到了哪些设计模式:
- 工厂设计模式:BeanFactory创建bean对象时
- 代理设计模式:AOP采用了动态代理模式
- 单例设计模式:Sping中的Bean默认都是单例的
- 适配器设计模式:Spring AOP增强通知,SpringMVC中HandlerAdaper都使用到了
- 观察者设计模式:Spring的监听器
- 模板方法模式:jdbcTemplate等以Template对数据库操作的类
12.Spring事务:
- 原理:分为编程式和声明式,我们一般采用声明式,添加@Transactional注解。
- 失效场景:
。事务类没有加载到容器中;
。加载类上,调用的方法不是public;
。可能是非运行时异常,可以用rollbackfor配置;
。业务自己捕获了异常,就不会发生回滚;
- 隔离级别:
。使用后端数据库默认的隔离级别
。脏读,不可重复读,幻读都有可能发生
。脏读不会发生,不可重复读,幻读可能发生(Oracle默认)
。脏读,不可重复读不会发生,幻读可能发生(MySQL默认)
。脏读,不可重复读,幻读都不会发生
- 传播行为:
。支持当前事务,如果不存在,则新启一个事务(默认)
。支持当前事务,如果不存在,则抛出异常
。支持当前事务,如果不存在,则以非事务方式执行
。不支持当前事务,创建一个新事务
。不支持当前事务,如果已存在事务就抛异常
。不支持当前事务,以非事务方式执行
- @Transactional:
。用在类上,该类所有public修饰的方法都等同于加了@Transactional;
。用在方法上,如果是运行时异常数据可以回滚,非运行时异常无法生效,加上这个rollbackFor=Exception.class在非运行时异常也可以回滚了
。原理:基于相应类生成一个代理对象,执行方法时将事务设置为不自动提交,有异常就会回滚了。
13.spring的bean是线程安全的吗
- spring的默认bean作用域是单例的,单例的bean线程不安全的,但是开发中大部分的bean都是无状态的,没有属性,比如controller、service、dao,不会有线程安全问题。
- 如何保证线程安全:
。设置Bean为prototype类型,每次获取都创建一个bean;
。用ThreadLocal为每个线程保存一个副本。
14.springboot常用注解:
- @SpringBootApplication:SpringBoot的启动类上。
- @ComponentScan :扫描被@Component (@Repository,@Service,@Controller)注解的 bean。
- @Configuration:声明配置类。
- @Autowired:自动注入Bean对象。
- @Controller:返回一个视图,常见于前后端不分离项目。
- @RestController:以由对象转换来的JSON或XML的形式写入HTTP,常见于前后端分离项目。
- @Scope:声明Bean的作用域。
- post增,delete删,put改,get查+mapping注解:写在方法上标识方法的作用。
- @PathVariable :获取前端传回url的路径参数。参数就是路径的一部分。
- @RequestParam:获取前端传回url的查询参数。路径后方?拼接参数。
- @RequestBody:以Json格式接受前端传回的数据并转换为Java对象。
- @ConfigurationProperties(prefix = "library"):读取配置文件并绑定到某个类上:
- @Value("$property"):小范围的读取配置文件的单个属性。
- JSR303:是一种校验规则,用在Entity层标识属性值的某种规范。
- @ControllerAdvice :定义全局异常处理类,写在类上方。
- @ExceptionHandler :声明异常处理方法,写在方法上方。
- @Transactional:用在类或者方法上,标识事务,出现异常会回滚。
15.springboot自动配置原理:
- 启动类@SpringbootApplication注解下,有三个关键注解
。@springbootConfiguration:表示启动类是一个自动配置类
。@CompontScan:扫描启动类所在包外的组件到容器中
。@EnableConfiguration:最关键的一个注解,该注解import了一个自动配置文件选择器,这个选择器判断自动装配有没有打开->排除了哪些配置->加载META-INF/spring.factories文件中通过装配条件筛选的类。
16.CAP理论:
- 一致性:每次数据更新完保证每个节点的数据都一致
- 可用性:没有故障的节点必须在固定时间内完成服务
- 容灾性:发生故障时,服务也能够正常使用
- 为什么不能同时保证一致性和可用性:
。当网络发生故障的时候,如果要保证一致性,节点要相互等待,不满足可用性,而如果不等待的话,又无法满足一致性。
17.熔断限流:
- 熔断:客户端请求时间过久时,停止链接。
- 降级:流量过大时为了保证核心功能的可用性 ,而选择性的降低一些功能的可用性。
- 限流:客户端请求量过大时,对流量进行限制,防止过大导致系统雪崩。
。漏桶算法:一般使用消息队列来实现,系统以恒定速度处理队列中的请求,当队列满的时候开始拒绝请求。
。令牌桶算法:计数器算法和漏桶算法都无法解决突然的大并发,令牌桶算法是预先往桶中放入一定数量token,然后用恒定速度放入token直到桶满为止,所有请求都必须拿到token才能访问系统。
18.BeanFactory和FactoryBean:
- BeanFactory:是一个简单的Ioc容器,有依赖注入等简单功能。
- FactoryBean:是创建bean的一种方式,帮助实现复杂Bean的创建。
19.get请求和post请求的区别:
- get:从服务器获取数据方,参数就在url后面,不太安全。没有副作用的用get。
- post:向服务器传输数据,内容在请求体里面,一般我们用requestbody与post结合使用,可能有副作用的用post。
以上是关于开发框架的主要内容,如果未能解决你的问题,请参考以下文章