Spring知识集合常用注解及原理面试专用且需掌握的知识

1.什么是 Spring Framework?

  • springFramework包括了了ioc依赖注入、aop.context上下文,bean管理,el表达式

2.spring bean 容器的生命周期是什么样的?

  • Spring 容器根据配置中的bean 定义中实例化bean。

  • Spring 使用依赖注入填充所有属性,如bean 中所定义的配置。

  • 如果bean 实现BeanNameAware 接口,则工厂通过传递bean 的ID 来调用setBeanName()。

  • 如果bean 实现BeanFactoryAware 接口,工厂通过传递自身的实例来调用setBeanFactory()。

  • 如果存在与bean 关联的任何BeanPostProcessors,则调用preProcessBeforeInitialization() 方法。

  • 如果为bean 指定了init 方法( 的init-method 属性), 那么将调用它。

  • 最后, 如果存在与bean 关联的任何BeanPostProcessors,则将调用postProcessAfterInitialization() 方 *法。

  • 如果bean 实现DisposableBean 接口,当spring 容器关闭时,会调用destory()。

  • 如果为bean 指定了destroy 方法( 的destroy-method 属性),那么将调用它。

3.BeanFactory 和 ApplicationContext 的区别?

  • Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类。事实上,Spring提供了两种不同的容器:一种是最基本的BeanFactory,另一种是扩展的ApplicationContext。BeanFactory 仅提供了最基本的依赖注入支持,而 ApplicationContext 则扩展了BeanFactory ,提供了更多的额外功能4.spring 的特性?谈谈你对 spring 的理解?spring 用来干嘛?

4.spring有两大核心,IOC和AOP

  • IOC即控制反转,通常我们在项目当中需要手动new去创建对象,这种方式不利于对对象的管理,现在我们将对象的创建权利反转给spring容器,这就是控制反转。

  • spring容器在实例化对象的时候,会根据对象之间的依赖关系,自动完成属性注入工作,这就是依赖注入 AOP即面向切面编程,底层是通过动态代理的机制来实现的,支持jdk和cglib两种。 默认通过jdk动态代理。通常我们在项目当中,一些公共功能的实现可以通过aop来 进行解耦和统一实现,比如事务管理、日志、权限等等。 我们在项目当中的事务管理是这样配置的

5.jdk 的动态代理和 cglib 动态代理有什么区别?

  • jdk是需要接口才能实现功能,不能通过实现类 cglib不需要接口,可以直接代理类

6.aop 的实现原理?

  • AOP标签的定义解析刘彻骨肯定是从NamespaceHandlerSupport的实现类开始解析的,这个实现类就是AopNamespaceHandler。至于为什么会是从NamespaceHandlerSupport的实现类开始解析的,这个的话我想读者可以去在回去看看Spring自定义标签的解析流程,里面说的比较详细。

  • 要启用AOP,我们一般会在Spring里面配置aop:aspectj-autoproxy/ ,所以在配置文件中在遇到aspectj-autoproxy标签的时候我们会采用AspectJAutoProxyBeanDefinitionParser解析器

  • 进入AspectJAutoProxyBeanDefinitionParser解析器后,调用AspectJAutoProxyBeanDefinitionParser已覆盖BeanDefinitionParser的parser方法,然后parser方法把请求转交给了AopNamespaceUtils的registerAspectJAnnotationAutoProxyCreatorIfNecessary去处理

  • 进入AopNamespaceUtils的registerAspectJAnnotationAutoProxyCreatorIfNecessary方法后,先调用AopConfigUtils的registerAspectJAnnotationAutoProxyCreatorIfNecessary方法,里面在转发调用给registerOrEscalateApcAsRequired,注册或者升级AnnotationAwareAspectJAutoProxyCreator类。对于AOP的实现,基本是靠AnnotationAwareAspectJAutoProxyCreator去完成的,它可以根据@point注解定义的切点来代理相匹配的bean。

  • AopConfigUtils的registerAspectJAnnotationAutoProxyCreatorIfNecessary方法处理完成之后,接下来会调用useClassProxyingIfNecessary() 处理proxy-target-class以及expose-proxy属性。如果将proxy-target-class设置为true的话,那么会强制使用CGLIB代理,否则使用jdk动态代理,expose-proxy属性是为了解决有时候目标对象内部的自我调用无法实现切面增强。

  • 最后的调用registerComponentIfNecessary 方法,注册组建并且通知便于监听器做进一步处理

7.springmvc 的原理?springmvc 的工作流程?springmvc 的源     码 你看过吗?

  • 首先请求到达核心控制器dispatcherServlet,dispatcherServlet会判断请求后缀是否满足格式要求,如果满足格式要求,会查询handlerMapping,查找对应的handler,调用handlerAdapter进行参数绑定等适配工作,之后调用具体的handler进行业务逻辑处理,返回一个modelAndView对象给dispatcherServlet。dispatcherServlet调用viewResolver进行视图解析渲染,然后返回给客户端

8.springmvc 的常用注解有哪些?

  • @controller

    用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器

  • @requestMapping

    RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请 求的方法都是以该地址作为父路径  RequestMapping注解有六个属性:

  • 1、 value**

    value:指定请求的实际地址

  • 2、method;**

    method: 指定请求的method类型, GET、POST、PUT、DELETE等

  • 3、consumes**

    consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

  • 4、produces**

    produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

  • 5、params**

    params: 指定request中必须包含某些参数值是,才让该方法处理。

  • 6、headers**

    headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

3)@Resource和@Autowired

  • @Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

  • (1)@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配

  • (2)@Resource

  • @Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,Sprin将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略

  • 3)共同点

    两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

  • 4) @PathVariable

    用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数

  • 5)@CookieValue

    作用:用来获取Cookie中的值;

  参数: value:参数名称 required:是否必须 defaultValue:默认值

  • 6)@RequestParam

    用于将请求参数区数据映射到功能处理方法的参数上

  • 7)@SessionAttributes

    @SessionAttributes即将值放到session作用域中,写在class上面。

    @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(value 属性值),

    还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(types 属性值*

  • 8)@SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(value 属性值),

  • 9)@ResponseBody 

    还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(types 属性值)*

  • 10)@ModelAttribute

    代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。

9.mybatis 使用了哪些设计模式?你了解过哪些设计模式?

  • Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;

  • 工厂模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;

  • 单例模式,例如ErrorContext和LogFactory;

  • 代理模式,Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;

  • 组合模式,例如SqlNode和各个子类ChooseSqlNode等;

  • 模板方法模式,例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler;

  • 适配器模式,例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;

  • 装饰者模式,例如Cache包中的cache.decorators子包中等各个装饰者的实现;

  • 迭代器模式,例如迭代器模式PropertyTokenizer;

10.springboot 自动配置的原理

  • Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值