框架常见问题

IOC和DI是什么

IOC: 控制反转,本质就是把本来在类内部控制的对象,反转到类外部进行创建后注入,不再有类本身进行控制
DI:依赖注入. 是自身对象中的内置对象是通过注入的方式进行创建的
在这里插入图片描述

IOC和DI的关系:
IOC就是容器,DI就是注入这一行为,那么DI确实就是IOC的具体功能的实现.而IOC则是DI发挥的平台和空间,所以说IOC和DI是相辅相成的,最重要的是,他们都是为了实现解耦而服务的.

DI如何实现?
依赖注入可以通过setter方法注入(设值注入).构造器注入和接口注入三种方式来实现.
Spring支持setter注入和构造器注入,通常使用构造器注入来注入必须的依赖关系,对于可选的依赖关系,则用setter注入是更好的选择. setter注入需要类提供无参构造器或者无参的静态工厂方法来创建对象.

Spring AOP的实现原理

Spring AOP的面向切面编程,是面向对象编程的一种补充,用于处理系统中分布的各个模块的横切关注点,比如事务管理,日志,缓存等.
它是用动态代理实现的,在内存中零临时为增强某个方法生成一个AOP对象.这个对象包含目标对象的所有方法,在特定的切入点做了增强处理,并回调原来的方法;
Spring AOP的动态代理主要有两种方式实现:
JDK动态代理:通过反射来接受被代理的类,但是被代理的类必须实现接口,核心是InvocationHandler和Proxy类,
cglib动态代理: 是一个代码生成的类库,可以在运行是动态生成某个类的子类,所以,CGLIB是通过集成的方式做的动态代理,但是断子绝孙类不行(类被表级了final)

AOP 能做什么

  1. 降低模块之间的耦合度
  2. 是系统容易扩展
  3. 避免修改业务代码.避免引入重复代码.,更好的代码复用

AOP怎么用

前置通知: 某方法调用之前发出通知,
后置通知:某方法调用之后发出通知,
返回后通知:方法正常返回后,调用通知,在方法调用后,正常退出发出通知
异常通知: 抛出异常后通知(After throwing advice) : 在方法抛出异常退出执行的通知,
环绕通知: 通知包裹在被通知的方法的周围

Spring 中的设计模式

  1. 工厂模式: 在各种BeanFactory以及ApplicationContext创建中常用
  2. 模板模式:同上
  3. 代理模式: AOP实现中用到了JDK的动态代理
  4. 单例模式:如在创建Bean的时候
  5. 策略模式:在spring中 可以使用JdbcTemplate实现对数据库的CRUD操作,而在查询时我们可能会用到RowMapper接口及spring提供的BeanPropertyRowMapper的实现类,RowMapper接口就是规范,而我们业务需求编写的每个实现类都是一个达成目标的策略
  6. 观察者模式:监听器就是观察者模式的具体体现
  7. 适配器模式:在spring -frameword中提供了spring mvc的开发包,在用spring mvc 中,它实现控制器方式有很多种,如常用的@Controller注解

Spring 中的作用域有哪些?

Spring IOC容器在根据配置(xml或者注解)创建一个Bean实例是,可以为Bean指定实例的作用域

作用域包括:

  1. singleton(单例模式): 使用该属性定义Bean时,IOC容易仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例;
  2. prototype(原型模式):使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例
  3. request(HTTP请求): 该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次Http请求都会创建一个新的Bean,适用于WebApplicationContext环境
  4. session(会话):该属性仅用于HTTP Session,同一个Session共享一个Bean实例,不同Session使用不同的实例
  5. global-session(全局回话,在spring5.x版本中已经被移除):该属性仅用于HTTP Session,通session作用域不同的是,所有的Session共享一个Bean实例

Bean的生命周期:
实际开发中,一般常用的就是单例模式和原型模式.
单例模式生命周期和容器相同,
原型(多例)模式生命周期,是每次使用时创建新的对象,用完等待与垃圾回收器回收

Spring框架实现实例化和依赖注入的方式分别是什么?

实现实例化的三种方式:

  1. 使用构造器实例化Bean : spring ioc容器既能使用默认空构造器也能使用有参数构造器两种方式创建Bean

  2. 使用静态工厂方式实例化Bean: 使用这种方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,该方法必须是静态方法,而且使用静态工厂方法也允许指定方法参数,spring ioc容器将调用此属性指定的方法来获取Bean

  3. 使用实例工厂方法实例化Bean: 使用这种方式不能指定class熟悉,必须使用factory-bean属性来指定工厂Bean的id, factory -method熟悉指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样

依赖注入的方式:
依赖注入是spring协调不同Bean实例之间的合作而提供的一种工作机制,在确保Bean实例之间合作的同时,并能保持每个Bean的相对独立性.

(1). 基于构造函数的注入: 就是通过Bean类的构造方法,将Bean所依赖的对象注入.构造函数的参数一半情况下就是依赖项,spring容器会根据bean中指定的构造函数参数来决定调用那个构造

(2). 基于set方法注入
将Bean所依赖的对象通过设置函数注入,bean需要为注入的依赖对象提供设置方法.

(3). 基于自动装配的注入
spring IOC容器会基于反射查看bean定义的类, 当spring 容器发现bean被设置为自动装配的by Tupe模式后,它会根据参数类型在spring容器中查找与参数类型相同的被依赖bean对象,如果已经创建,则会把被依赖的对象自动注入到bean中,如果没有创建,则不会注入.注入过程需要借助bean提供的设置方法来完成,否则注入失败

(4). 基于注解的方式注入
spring 主要提供了@Autowired和@Resource注解模式

@Autowired装配顺序
默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如: @Autowired(required=false) 如果想使用名称装配可以结合@ Qualifier注解进行使用

@Resource装配顺序

  1. 如果同时指定了name和type,则从spring上下文中找到唯一匹配的bean进行装配,找不到就抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个就抛出异常
  4. 如果既没有指定name也没有指定tyoe ,就自动按照byName方式进行装配,如果没有匹配,则回退为一个原始类型进行匹配,如果匹配就自动装配

SpringMVC的工作流程

执行过程分析:

  1. 用户向服务器发送请求,请求被Spring前端控制器DispatcherSerMlet.捕获;
  2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping_获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
  3. DispatcherServlet根据获得的Handler ,选择一个合适的HandlerAdapter。(附注:如果成功获得 HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)
  4. 提取 Request中的模型数据,填充 Handler入参,开始执行 Handler(也就是我们自己写的Controller)。在填充Handler 的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
    (1)HttpMessageConveter:将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息
    (2)数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
    (3)数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等
    (4)数据验证:验证数据的有效性(长度,格式等),验证结果存储到BindingResult或Error中
  5. Handler执行完成后﹐向 DispatcherServlet返回一个ModelAndView对象;
  6. 根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到Spring 容器中的 ViewResolver)返回给DispatcherServlet;
  7. ViewResolver结合Model和 View,来渲染视图
  8. 将渲染结果返回给客户端。

在这里插入图片描述

Springmvc的优点:
1.它是基于组件技术的。全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件。并且和Spring 提供的其他基础结构紧密集成。
2.不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)
3.可以任意使用各种视图技术,而不仅仅局限于JSP。比如:PDF,Excel
4.支持各种请求资源的映射策略
5.它是易于扩展的

常见的问题:

  1. 遇到请求没有被控制器方法接收到,可以检查 RequestMapping_映射和请求URL
  2. 遇到请求参数没有传递到控制器方法,可以检查参数是否按照要求编写
  3. 遇到控制器方法正常执行,但是没有视图显示(比如404错误),可以检查视图解析器是否配置
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值