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注解与全局配置文件中对应的属性进行绑定的