框架

    技术2022-07-11  72

    1.Spring的AOP和IOC

    IOC 也叫 DI : 控制反转 与 依赖注入,创建对象将不再由调用者自己创建而是将对象交由  spring由spring管理与创建,因此也称为依赖注入。 spring以动态灵活的方式来管理对象 , 注入的两种方式,设置注入和构造注入。 设置注入的优点:直观,自然 构造注入的优点:可以在构造器中决定依赖关系的顺序。

    注解:        @Component 把对象加入ioc容器,对象引用名称是类名,第一个字母小写        @Component(“name”) 把指定名称的对象,加入ioc容器        @Repository 主要用于标识加入容器的对象是一个持久层的组件(类)        @Service 主要用于标识加入容器的对象是一个业务逻辑层的组件        @Controller 主要用于标识加入容器的对象是一个控制层的组件        @Resource 注入属性(DI), 会从容器中找对象注入到@Resource修饰的对象上        @Autowired 注入属性(DI), 会从容器中找对象注入到@Autowired修饰的对象上

    @Autowired与@Resource的区别

    1、@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。 

     2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false

    3、@Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定,  如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

    AOP:面向切面编程,是OOP的补充,aop是动态的抽象, 是对应用执行过程中的步骤进行抽象,从而获得步骤之间的逻辑划分(AOP使用动态代理实现)。

     切面(Aspect):其实就是共有功能的实现。如日志切面、权限切面、事务切面等。在实际应用中通常是一个存放共有功能实现的普通Java类,之所以能被AOP容器识别成切面,是在配置中指定的。

           通知(Advice):是切面的具体实现。以目标方法为参照点,根据放置的地方不同,可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)与环绕通知(Around)5种。在实际应用中通常是切面类中的一个方法,具体属于哪类通知,同样是在配置中指定的。

           连接点(Joinpoint):就是程序在运行过程中能够插入切面的地点。例如,方法调用、异常抛出或字段修改等,但Spring只支持方法级的连接点。

           切入点(Pointcut):用于定义通知应该切入到哪些连接点上。不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。

           目标对象(Target):就是那些即将切入切面的对象,也就是那些被通知的对象。这些对象中已经只剩下干干净净的核心业务逻辑代码了,所有的共有功能代码等待AOP容器的切入。

           代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象的核心业务逻辑功能加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。

           织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行期,当然不同的发生点有着不同的前提条件。譬如发生在编译期的话,就要求有一个支持这种AOP实现的特殊编译器;发生在类装载期,就要求有一个支持AOP实现的特殊类装载器;只有发生在运行期,则可直接通过Java语言的反射机制与动态代理机制来动态实现

    AOP用法:配置文件 XML

    2.Spring 中的 bean 的作用域有哪些?

    3.Spring事务

    事务的特性

    原子性(atomicity) 一个事务必须被视为一个不可分割的最小工作单元, 整个事务中的所有操作要么全部执行成功, 要么全部失败回滚, 对于一个事务来说, 不可能只执行其中的一部分操作. 一致性(consistency) 事务必须使数据库从一个一致性的状态变换到另一个一致性的状态, 也就是说一个事务执行之前和执行之后都必须处于一致性的状态. 拿转账来说, 假设用户A和用户B两者的钱加起来一共是5000, 那么不管A和B之间如何转账, 转几次账, 事务结束后两个用户的钱相加起来应该还得是5000, 这就是事务的一致性. 隔离性(isolation) 并发的事务之间是相互隔离的, 一个事务所做的修改在最终提交之前, 对其他事务是不可见的. 例如, 账户A有5000元存款, 执行完转账语句(-500), 只要该事务没有提交, 对其他事务来说账户余额还是5000元. 持久性(durability) 事务一旦提交, 其对数据库的修改就是永久性的, 即使系统崩溃, 修改的数据也不会丢失.

    并发事务带来的问题

    更新丢失(Lost Update) 多个事务修改同一行记录(都未提交), 后面的修改覆盖了前面的修改. 脏读(Dirty Reads) 一个事务可以读取另一个事务未提交的数据. 不可重复读(Non-Repeatable Reads) 同一个事务中执行两次相同的查询, 可能得到不一样的结果. 这是因为在查询间隔内,另一个事务修改了该记录并提交了事务. 幻读(Phantom Reads) 当某个事务在读取某个范围内的记录时, 另一个事务又在该范围内插入了新的记录, 当之前的事务再次读取该范围的记录时, 会产生幻行.

    Spring事务管理的四个属性: Propagation, Isolation, timeout, readOnly.

    4.Spring的单例模式

    spring的Bean默认的是单例的,Bean的作用域可以通过Bean标签的scope属性进行设置,Bean的作用域包括: 默认情况下scope="singleton",那么该Bean是单例,任何人获取该Bean实例的都为同一个实例; scope="prototype",任何一个实例都是新的实例; scope="request",在WEB应用程序中,每一个实例的作用域都为request范围;

    scope="session",在WEB应用程序中,每一个实例的作用域都为session范围;

    注意:在默认情况下,Bean实例在被Spring容器初始化的时候,就会被实例化,默认调用无参数的构造方法。在其它情况下,Bean将会在获取实例的时候才会被实例化。

    在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例)

    singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。

    5.Spring中bean的生命周期

    1.Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化 2.Bean实例化后对将Bean的引入和值注入到Bean的属性中 3.如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法 4.如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入 5.如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。 6.如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。 7.如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用 8.如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。 9.此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。 10.如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

     

    6.Spring的事务隔离级别

    隔离级别 在MySQL常用的存储引擎中, 只有InnoDB支持事务, 所以这里说的隔离级别指的是InnoDB下的事务隔离级别.

    READ UNCOMMITTED(读未提交) 在该隔离级别, 事务中的修改即使没有提交, 对其他事务也都是可见的. 避免了更新丢失的发生. READ COMMITTED(读已提交) 在该隔离级别, 一个事务只能看见已经提交的事务所做的修改. 避免了更新丢失和脏读. REPEATABLE READ(可重复读) MySQL默认的隔离级别, 该级别保证了在同一个事务中多次读取同样的记录的结果是一致的. 避免了更新丢失、脏读、不可重复读和幻读. (注意看MySQL官网, RR隔离级别下解决了幻读问题) SERIALIZABLE(可串行化) SERIALIZABLE是最高的隔离级别, 它通过强制事务串行化执行, 避免了并发事务带来的问题.

    7.Spring事务的事务传播行为

    8.Spring 框架中用到了哪些设计模式?

    Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的:

    1.单例模式:spring中bean默认是单例模式  2.前端控制器:spring用前端控制器DispatcherServlet对请求进行分发  3.工厂模式:BeanFactory创建对象的实例

    ioc理解:把对象的创建,初始化,销毁交给spring控制,实现控制反转

    9.Spring除了IOC和AOP还有什么?

    spring-aop spring-beans spring-context spring-core spring-jdbc spring-orm spring-tx spring-webmvc spring-web

    10.Mybatis和Hibernate的区别

    一、mybatis和hibernate的区别

    Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

    Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

    Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

    按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,框架只有适合才是最好。   

    11.springboot的优点和缺点

    优点: 1、使用注解配置,无需xml(简单粗暴) 2、快速搭建、开发 3、简化maven 4、方便的和三方框架集成 5、内嵌tomcat部署简单 6、内置健康检查,建库等 7、自动配置,让配置更加简单。 缺点: 报错不能准确定位。 版本更替差异大。

     

    12.mybatis中#和$符号的区别

    #{}是预编译处理,${}是字符串替换

    #{}:Mybatis在处理#{}时,会将sql中的#{}替换为?号,对sql语句预编译后调用 PreparedStatement 的set 方法来赋值。

    ${}:字符串替换, 告诉 mybatis 使用$包含的“字符串”替换所在位置。使用的是 Statement 对象,有SQL注入的风险。

    13.Mybatis的工作原理

    1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。

    2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。

    3)构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。 4)创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。

    5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。

    6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。

    7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。

    8)输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

     

    14.SpringBoot自动配置原理

    @SpringBootConfiguration @EnableAutoConfiguration

    15.SpringMVC 的工作原理

      1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;

          2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

          3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)

           4.  提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

          HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

          数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

          数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等

          数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

          5.  Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

          6.  根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

          7. ViewResolver 结合Model和View,来渲染视图

          8. 将渲染结果返回给客户端。

    16.什么是Spring MVC ?简单介绍下你对springMVC的理解?

    Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。 C:控制器

      ①中央调度器 DispatherServlet :前端控制器

      ②后端控制器:自定义的处理器

    M:数据  ModelAndView中的Model

    V:视图 ModelAndView 中的View  

    17.JPA也能写sql,为什么还要用MyBatis?

    JPA默认使用hibernate作为ORM实现,为什么阿里巴巴的持久层抛弃了hibernate采用了MyBatis框架?主要就是因为MyBatis更适合处理大量数据或者大并发情况。

    JPA是面向对象的思想,一个对象就是一个表,强化的是你对这个表的控制。JPA继承的那么多表约束注解也证明了JPA对这个数据库对象控制很注重;

    mybatis则是面向sql,你的结果完全来源于sql,而对象这个东西只是用来接收sql带来的结果集。你的一切操作都是围绕sql,包括动态根据条件决定sql语句等。mybatis并不那么注重对象的概念,只要能接收到数据就好。

    Mybatis的优点是简单高效,优化起来也方便,比较符合现在的开发节奏,现在的互联网公司都是先快速开发占领市场,然后再优化代码。而且这个过程需求经常是变来变去的,开发人员也有流动性,这种情况下用Mybatis显然更加适合。而且相比于JPA,MyBatis学习成本低,使用简单,能达到目的,不增加额外工作量(或很少增加),架构来说MyBatis功能单一,场景明确,耦合度低,无状态,便于(放在业务代码里)分布式部署。在大多数场景里,MyBatis更适合。

    18.会话跟踪技术(4种)

    1.cookie;2.session;3.隐藏表单域;4.URL重写

    Processed: 0.012, SQL: 9