SSM框架

    科技2022-07-13  121

    1.为什么使用Spring(优缺点)? (1)方便解耦,简化开发(IOC:通过Spring提供的IOC容器,将对象间的依赖关系交由Spring控制,避免过度耦合) (2)AOP编程的支持(Spring提供的AOP功能方便进行面向切面编程) (3)声明式事务的支持 (4)方便程序的测试(Spring对Junit4支持,可以通过注解方便调试) (5)方便集成各种优秀框架(Spring不排斥各种优秀的开源框架Struts,Hibernate)

    2.Spring容器创建对象的时机 第一种:默认情况下,Spring在容器启动时变创建对象 第二种:在bean中有一个属性lazy-init,若lazy-init为“default/false”,则在容器启动时创建对象(默认设置);若lazy-init为“true”则在getbean时才创建对象

    3.Spring中常见的注解解释 第一步:在applicationContext.xml中引入命名空间。(命名空间是用来约束xml文件格式的)。 第二步:在applicationContext.xml文件中导入注解扫描器<context:component-scan base-package=" "></context:component-scan> @Component(@Repository:Dao层 @Service:service层 @Controller:web层) @Resource注解可以对类成员变量、方法以及构造函数进行标注,完成自动装载工作,通过@Resource注解来消除get/set方法。 @Autowired功能和@Resource一样,可以对类的成员变量、方法以及构造函数进行标注,完成自动装载工作,只不过@Resource值按照名称来进行装配,而@Autowired则是按照类型来进行装配,首先它会根据类型去匹配,如果同一类型有多个则按照名称去匹配,为空则抛出异常。 @Required:表明bean的属性必须在配置时设置。 @Configuration:声明当前类时一个配置类。 @Bean:实例化,初始一个新对象,将这个对象交给Spring的IOC容器来管理。 @Configuration与@Component的不同:@Configuration是基于代理来实现的,而@Component是基于反射来实现的。

    4.Spring MVC的常见注解解释 @Controller:用于标记一个类上,被它标记的类就是Spring MVC Controller的一个对象。 @RequestMapping:用于处理请求地址映射的注解,可用于类或者方法上,用于类上表示类中的所有响应请求的方法都是以该地址作为父路径。 @PathVariable:取出URL模板中的变量作为参数。 @Responsebody:该方法的返回结果直接写入HTTP响应报文(ResponseBody)中,一般在异步获取数据时使用。在使用@RequestMapping后,返回值通常解析为跳转路径,加上@Responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP响应正文中,例如异步获取json数据,加上@Responsebody注解后,就会直接返回json数据。 @RequestParam在SpringMVC后台控制层获取参数的方式主要有两种,一种是request.getParameter(“name”),另一种是用注解@RequestParam直接获取,Spring会自动根据参数名字封装进入,我们可以直接拿这个参数名使用

    5.Mybatis的常见标签或者注解 @Select简单查询:Select * from Table @Result:用来配置列名和属性,@Result(id=true,column=“id”,property=“id”) @Insert简单插入:@Insert(“insert into tb_user(name,sex,age) values (#{name},#{sex},#{age})”) @Update简单更新 @Delete简单删除:@Delete(“delete from Table where id = #{id}”) @Mapper

    6.Spring中bean的生命周期 1.Spring容器根据配置将bean实例化。 2.Spring使用依赖注入填充所以属性。 3.如果bean实现BeanNameAware接口,则工厂通过传递bean的ID来调用setBeanName()。 4.如果bean实现BeanFactoryAware接口,则工厂通过传递自身的实例来调用setBeanFactory()。 5.如果存在与bean关联的任何BeanPostProcessors,则调用postProcessBeforeInitialization()方法。 6.如果为bean指定了init方法,那么将调用它。 7.如果存在与bean关联的任何BeanPostProcessors,则将调用postProcessAfterInitialization()方法。 8.如果bean实现DisposableBean接口,则当Spring容器关闭时会调用destory()。 9.如果为bean指定了destory方法,那么将调用它。

    7.Spring事务(ACID,隔离级别,事务传播机制) TransactionDefinition:定义了一些基本的事务属性。 PlatformTransactionManager:Spring事务管理器。 TransactionStatus:事务状态,提供简单的事务控制执行和查询事务状态的方法。 实现原理:Spring并不直接管理事务,而是为各个平台如JDBC、Hibernate等提供对应的事务管理器。将事务管理的职责委托给相关的平台框架来实现。

    ACID: 1)原子性:要么全部完成,要么全部不起作用。 2)一致性:事务一旦完成(不管成功还是失败),系统必须保证业务处于一致的状态,而不是部分完成部分失败。 3)隔离性:可能有许多事务会同时处理相同的数据,每个事务都应该与其他事务隔离开,不能相互影响。 4)持久性:事务一旦完成,无论发生了什么错误,都不应受到影响。通常情况下,事务的结果被写到持久化存储器中。 事务传播机制:当事务方法被另一个事务方法调用时,必须指定事务该如何传播。

    隔离级别: 1)ISOLATION_DEFAULT:使用后端数据库默认的隔离级别-1. 2)ISOLATION_READ_UNCOMMITTED:未提交读,最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读0. 3)ISOLATION_READ_COMMITTED:读已提交,允许读取并发事务已经提交的数据,可以阻止脏读,但幻读和不可重复读仍有可能发生1. 4)ISOLATION_REPEATABLE_READ:可重复读,对同一字段的多次读取结果都是一致的,可以阻止脏读和不可重复读,但幻读仍存在2. 5)ISOLATION_SERIALIZABLE:序列化,最高的隔离级别,可以解决脏读、幻读、不可重复读,通常通过完全锁定事务相关的数据库来实现的4.

    Spring支持的事务管理类型: 编程式事务管理和声明式事务管理。

    声明式事务: 1)在applicationContext.xml配置事务管理器,并将事务管理器交予Spring。 2)在目标类或者目标方法添加@Transaction注解。(如果在类上添加,则 说明类中的所有方法都添加事务,如果只在方法上添加注解,那么只有该方法具有事务)。

    8.IOC底层实现原理 概念:IOC是面向对象编程中的一种设计原则,IOC理论提出的观点为:借助于“第三方”实现具有依赖关系的对象之间的解耦。所谓IOC,对于Spring框架来说,就是由Spring来负责控制对象的生命周期和对象间的关系。是对创建对象控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,现在把这种权利转移到了第三方。

    实现原理:通过反射+工厂模式实现。在实例化一个类时,通过反射调用类中的set方法将事先保存在HashMap中的类属性注入到类中。 控制反转:原本需要主动创建依赖对象,并正向传递给对象,现在通过Spring容器自动创建依赖对象,对象只需要被动去接收依赖对象,获取依赖对象的方式反转了,以前是主动获取,现在是被动接收。

    依赖注入发生的时间: 1)用户第一次通过getBean方法向IOC容器索要Bean时,IOC容器触发依赖注入。 2)当用户在Bean定义资源中为元素配置了lazy—init属性,即让容器在需要使用Bean对象时,再触发依赖注入,创建Bean对象。

    依赖注入实现在以下两个方法中: 1).createBeanInstance:生成Bean所包含的Java对象实例。 2).populateBean:对Bean属性的依赖注入进行处理。

    9.AOP的底层实现原理 概念:AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的集合。而AOP技术恰恰相反,它利用“横切”技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到了一个可重用模块,并将其名为“Aspect”,即切面。简单点说就是将那些与业务无关,却为业务模块所共同调用的逻辑或方法封装起来,便于减少系统的重复代码,降低模块间的耦合度,有利于未来的可操作性和可维护性。AOP的核心思想为将应用程序中的商业逻辑和对其提供支持的通用服务进行分离。

    AOP的实现: 主要分为两大类:一是采用动态代理技术,二是采用静态注入方式。 动态代理:提供一个基础接口作为被调用类型和代理类之间的统一入口。实现InvocationHandler,对代理对象方法的调用,会被分派到其invoke方法来实现。通过Proxy类,调用其newProxyInstance方法生成一个实现相应基础接口的代理类实例。使用动态代理实现AOP需要有4个角色:被代理的类,被代理类的接口,织入器和InvocationHandler。而织入器利用反射机制生成一个代理类,然后再这个代理类中织入代码。被代理的类就是AOP里所说的目标,InvocationHandler是切面类,包含Advice和Pointcut。

    如何使用AOP? 可以通过配置文件或者编程的方式来实现AOP。 通过配置文件:1)配置ProxyFactoryBean,显示设置advisors,advice,target等。2)配置AutoProxyCreator,这种方式下,还是如以前一样使用定义的Bean,但从容器中获取的其实已经是代理对象了。3)通过aop:config来配置。4)通过aop:aspectj-autoproxy配置,使用Aspectj的注解来标识通知及切入点。

    AOP是如何生成代理类? 提供了两种方式来实现代理对象:JDKProxy和cglib,具体使用哪个是由AOPProxyFactory根据AdvisedSupport对象的配置来决定。默认如果目标类时接口,则采用JDK动态代理模式,否则使用cglib来生成代理。

    切面是如何织入的? InvocationHandler是JDK动态代理的核心,生成的代理对象的方法调用都会委托到InvocationHandler.invoke()方法。

    AOP能干什么?(AOP的好处) 1)降低模块的耦合度。 2)使系统容易扩展。 3)使用AOP可以推迟为将来的需求作决定,因为可以把这种需求作为独立的方面很容易实现。 4)更好的代码复用性。

    AOP基本概念: 1)连接点:需要在程序中插入横切关注点的拓展点,连接点可能是类初始化、方法执行、方法调用、字段调用或处理异常等等,Spring只支持方法在连接点处执行,表示为“在哪里做”。 2)切入点:选择一组连接点集合,Spring默认使用Aspectj语法,在AOP中表示为“在哪里做的集合”;语法execution(修饰符 返回值 包.类.方法名(参数))。 3)增强:在连接点上执行的行为,增强提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段;包括前置增强(before advice)、后置增强(after advice)、环绕增强(around advice)等。在AOP中表示为“做什么”。 4)切面:横切关注点的模块化,比如上边提到的日志组件可以认为是增强、引入和切入点的组合。在AOP中表示为“在哪里做和做什么的集合”。 5)目标对象:切入点选择的对象,是需要被增强的对象。在AOP中表示为“对谁做”。 6)织入:是将切面应用到目标对象从而创建出AOP代理对象的过程。 7)引入:也称为内部类型声明,为已有的类添加额外新的字段或方法。在AOP中表示为“新增什么”。 8)前置通知(Before):在连接点前面执行,前置通知不会影响连接点的执行,除非抛异常。 9)正常返回(After returning):在连接点正常执行完成后执行,如果连接点抛出异常,则返回通知不执行。 10)异常返回通知(After throwing):在连接点抛出异常后执行。 11)最终通知(After):在连接点执行完成之后,不管是正常执行完成还是抛出异常,都会执行最终通知中的内容。 12)环绕通知(Around):能在连接点前后自定义一些操作,是以上几个通知的集合。

    动态字节码生成(Cglib): 使用动态字节码生成技术实现AOP原理是在运行期间目标字节码加载后,生成目标类的子类,将切面逻辑加入到子类中,所以Cglib不需要基于接口。Cglib在运行期间扩展了Java类和实现Java的接口,它封装了ASM,所以在使用Cglib之前需要导入ASM的jar。 Spring默认采用动态代理机制实现AOP,当动态代理不可用时(代理类无接口)会使用Cglib机制。但Spring中默认的AOP有一定的缺点:第一,只能对方法进行切入,不能对接口、字段、静态代码块进行切入。第二,同类中互相调用方法将不会使用代理类,因为要使用代理类必须要从容器中拿到Bean。第三,性能不是最好的,自定义的类加载器的性能要优于动态代理和CGlib。

    10.Spring MVC运行流程 1)用户发起请求到前端控制器(Controller)。 2)前端控制器没有处理业务逻辑的能力,需要找到具体的模型对象处理(Handler),到处理器映射器(HandlerMapping)中查找Handler对象(Model)。 3)HandlerMapping返回执行链,其中包含两部分:Handler对象和拦截器数组。 4)前端出路器通过处理器适配器包装后执行Handler对象。 5)处理业务逻辑。 6)Handler处理完业务逻辑,返回ModelAndView对象,其中view是视图名称,不是真正的视图对象。 7)将ModelAndView返回前端控制器。 8)视图解析器(ViewResolver)返回真正的视图对象(View)。 9)前端控制器根据模型数据和视图对象进行视图渲染。(此时前端控制器既有视图又有Model对象数据) 10)返回渲染后的视图(html/json/xml)。 11)给用户产生响应。

    11.什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection)? 控制反转:是指将创建对象的功能交给Spring容器,在我们需要使用对象的时候不需要自己创建,可以直接从容器中获取。 依赖注入:动态地向某个对象提供它所需要的依赖对象。

    12.BeanFactory和ApplicationContext的区别? 1)BeanFactory采用的是延迟加载的形式来注入Bean的,只有在某个Bean被使用时,才会对该Bean进行加载实例化。而ApplicationContext是在容器启动时就一次性创建好所有的Bean。 2)BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryProcessor的使用,但两者之间的区别是BeanFactory需要手动注册,而ApplicationContext则是自动注册。 3)ApplicationContext除了上述提供的BeanFactory所能提供的功能外,还能提供更完整的框架功能:国际支持化、资源访问(如URL)、事件传递。

    13.Mybatis中的#{}和KaTeX parse error: Expected 'EOF', got '#' at position 12: {}有什么区别? 1)#̲{}将传入的数据都当成一个字符…{}将传入的数据直接显示生成在sql中。 2)#{}可以防止sql注入,而KaTeX parse error: Expected 'EOF', got '#' at position 15: {}无法防止。 3)一般能用#̲{}就别用{}。 4)如果你只是想在SQL语句中插入一个不改变的字符串,使用${},例如:order by ${columnName}。

    14.从架构设计的角度,可以将Mybatis分为哪几层?每一层都有哪些主要模块? Mybatis架构自上而下分为基础支撑层、数据处理层、API接口层。 基础支撑层:主要用来做连接管理、事务管理、配置加载、缓存管理等最基础的组件,为上层提供最基础的支撑。 数据处理层:主要用来做参数映射、sql解析、sql执行、结果映射等处理,可以理解为请求到达,完成一次数据库操作的流程。 API接口层:主要对外提供API,提供诸如数据的增删查改、获取配置等接口。

    15.Spring的常见注入方式有哪些? setter属性注入 构造方法注入 注解方式注入

    16.Spring中bean的作用域? singleton:Spring IOC容器中只存在一个bean实例,bean以单例模式存在,是系统默认值。 prototype:每次从容器中调用bean时都会创建一个新的实例,即每次执行getBean()相当于执行new Bean()操作。 在单例模式下,启动Spring容器便会创建对象;在多例模式下,启动容器并不会创建对象,而是在获得bean时才会创建对象。

    17.@Request Mapping的作用是什么? 将http请求映射到相应的类/方法上。

    18.@Autowired的作用是什么? @Autowired可以对类成员变量/方法以及构造函数进行标注,完成自动装配的工作,通过@Autowired的使用来消除set/get方法。

    19.Mybatis的逻辑分页和物理分页的区别是什么? 逻辑分页是一次性查询很多数据,然后在结果中检索分页的数据,这样做的弊端为需要消耗大量的内存、有内存溢出的风险、对数据库压力较大。 物理分页是指从数据库中查询指定条数的数据。

    20.Mybatis的好处? 1)避免创建、频繁释放造成系统资源浪费:在SQLMapConfig.xml中配置数据库连接池,使用连接池管理数据库链接。 2)将SQL语句配置在XXXmapper.xml文件中与Java代码分离。 3)Mybatis自动将Java对象映射至SQL语句,占位符需要和参数一一对应。 4)Mybatis自动将SQL执行结果映射至Java对象,能够将数据库记录封装成类的对象。

    21.Mybatis与Hibernate的区别? 1)Mybatis学习门槛低,易于学习,程序员可以直接写原生态SQL。 2)Mybatis可以通过xml或注解方式灵活配置要运行的SQL语句,并将Java对象和SQL语句映射生成最终执行的SQL,最后将SQL执行的结果再映射生成Java对象。 3)Mybatis灵活度高,适合需求变换频繁。

    22.使用Mybatis的mapper接口时有哪些要求? 1)Mapper接口方法名和mapper.xml中定义的每个SQL的ID相同。 2)Mapper接口方法的输入参数类型和mapper.xml中定义的每个SQL的parameterType的类型相同。 3)Mapper接口方法的输出参数类型和mapper.xml中定义的每个SQL的resultType的类型相同。 4)mapper.xml文件中的namespace即是Mapper接口的类路径。

    23.SpringMVC里面的拦截器是怎么写的? 一种是实现接口,另外一种是继承适配器类,然后在SpringMVC的文件中配置拦截器即可。

    <!-- 只针对部分请求拦截 --> <mvc:interceptor> <mvc:mapping path="/modelMap.do" /> <bean class="com.et.action.MyHandlerInterceptorAdapter" /> </mvc:interceptor>

    24.谈谈你对SpringBoot的理解? Spring Boot的设计目的是为了简化Spring应用的初始搭建以及开发过程。Spring Boot是微服务框架的起点,简化了开发过程/配置过程/部署过程/监控过程。默认配置了很多框架的使用方式,就像maven整合了所有的jar包,Spring Boot整合了许多框架,同时将其他技术同Spring结合起来,通过Spring Boot可以很快搭建一套web项目。 不足之处:Spring Boot还需要在认证鉴定方面/监控方面与外围的框架进行集成。

    25.讲一下Spring Boot的四大核心? 起步依赖机制:通过起步依赖机制(Starter),简化jar包的引用,解决jar版本冲突问题。 自动配置:可以实现简单配置,甚至零配置就能搭建整套框架。 StringBoot CLI(命令行界面):一种命令工具. Actuator:是Spring Boot的程序监控器,可监控Spring应用程序上下文中的Bean,查看自动配置决策、Controller映射、线程活动、应用程序健康状况等。

    26.Spring Boot常见注解? @SpringBootApplication:包含@Configuration、@EnableAutoConfiguration、@ComponentScan。 @RestController:用于标注控制层组件,包含@Controller和@ResponseBody。 @Autowired @Qualifier @RequestMapping

    Processed: 0.015, SQL: 8