开发框架

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。

 

以上是关于开发框架的主要内容,如果未能解决你的问题,请参考以下文章

国内成熟的C#.NET快速开发框架都有哪些?

目前主流的移动WEB开发框架都有哪些

弄了套力软敏捷开发框架,却不知道能做啥?

力软的C#开发框架好不好用?服务好不好?

android开发一般都使用啥框架

程序开发中的框架是啥