Spring框架
Spring是一个轻量级的javaee框架,以ioc和aop为核心,并提供了表现层的spring mvc,持久层的jdbc还有业务层的事务管理等功能,并且能够很好的整合第三方框架。
- 程序解耦,简化开发。使用了spring ioc容器来创建和管理对象,并维护对象之间的依赖关系,可以降低程序的耦合度。用户不必自己来实现单例模式类和从配置文件中解析数据等底层编码,简化开发。
- 提供了面向切面编程技术。
- 面向切面编程能够实现很多传统面向对象技术很难实现的技术,比如日志和事务等功能。
- 声明式事务支持,声明式的方式可以提高开发效率。
Spring的核心功能有哪些?
Spring的三大核心组件:
Spring Core
Spring Context
Spring Beans
容器是Spring框架的核心,提供了Bean的创建,配置和管理。
AOP编程
数据访问
Web编程
BeanFactory和factoryBean的区别?
BeanFactory是spring IOC最基本的容器,负责创建和管理Bean。
FactoryBean是一个接口,当bean实现了FactoryBean后,通过getBean获取的Bean对象并不是FactoryBean的实现类对象,而是这个实现类中getObject方法返回的对象。FactoryBean而可以说是为IOC容器中的Bean的实现提供了更加灵活的方式。
描述一下Spring的applicationContext?
ApplicationContext是BeanFacotry的子接口,即也是一个spring ioc容器,负责创建和管理Bean。但是ApplicationContext跟BeanFactory不一样。BeanFactory创建Bean是一种懒加载的形式,当需要用到的时候才会去加载。
BeanFactory和ApplicationContext的区别?
BeanFactory采用懒加载的形式来加载bean,而ApplicationContext在spring启动的时候就会加载所有的bean到容器中。
ApplicationContext是BeanFactory的子接口,它还实现了很多其他接口,从而可以提供更多的功能,比如底层资源访问,强大的事件机制和国际化。
spring中bean的构造过程?
Spring中bean的作用域
Bean的作用范围和生命周期
Spring的循环依赖
比如A对象里面有个属性依赖于B对象,而B对象中有个属性依赖于A对象,这样就会形成循环依赖。
spring可以解决循环依赖问题:
- 必须setter注入
- 必须是单例模式
- 必须开启允许循环依赖
Spring采用三级缓存来解决循环依赖问题。
SingletonObjects easySingletonObjects和singletonfactories。
Spring的启动过程?
https://blog.51cto.com/12854546/1930134
- Spring启动有两种方式:
- 自己提供ApplicationContext创建Spring容器
- Web项目中在web.xml中配置监听
org.springframework.web.context.ContextLoaderListener
第一种方式:通过ClasspathApplicationContext初始化ioc,会加载spring.xml配置,然后解析配置信息,读取到<bean>信息,然后创建初始化Bean,最后通过getBean获取对象。
第二种方式:web.xml中进行配置监听,根据web容器的启动而启动
Spring IOC的原理?
Spring IOC即控制反转,将对象和对象之间的依赖关系交给ioc容器,让容器来创建并管理bean对象并维护对象之间的依赖关系。具体的方法就是依赖注入。
Spring容器启动后,会查找并加载需要管理的bean对象,解析xml配置件中的定义的bean信息,然后根据类的全限定名加载对应的类的字节码文件,在堆中创建该类的class对象,然后利用反射技术来初始化创建一个对象的实例,然后对bean的属性进行注入。接着初始化bean。
Spring AOP的原理,jdk和cglib方法的区别?
Spring AOP即面向切面编程,简单的来说,它是把程序重复的代码提取出来,在执行的时候通过动态代理技术,在不修改源码的基础上,对已有的方法进行增强.
Jdk动态代理:利用拦截器加上反射机制生成一个实现代理接口的代理类,在具体方法调用前调用invokeHandler来处理。
Cglib动态代理:利用asm开源包,对代理对象类的class文件加载运行,通过修改其字节码生成字类来处理。
Spring中,如果目标对象实现了接口,默认情况下采用JDK的动态代理实现AOP,但是可以强制使用CGLIB来实现AOP.<aop:aspectj-autoproxy proxy-target-class="true"/>
如果目标对象没有实现接口,必须使用cglib动态代理。
Spring中多线程并发安全如何处理?
当然大多数情况下,我们根本不需要考虑线程安全的问题,比如dao,service等,除非在bean中声明了实例变量。但是Controller经常会定义实例变量,这就涉及到了线程安全问题。
一般有两种解决办法:
1.Controller使用ThreadLocal,
2.将Controller的单例模式改为多例模式。
事务的隔离级别
事务的传播行为
Spring MVC框架
什么是springmvc?
Springmvc是一个基于mvc架构的用于简化web应用开发的应用开发框架,它是spring的一个模块,是表现层的框架.通过把model,controller和view分离,把复杂的web应用分成逻辑清晰的几个部分,简化开发.
Spring mvc的启动(加载)过程?
Spring的web容器启动的时候会去读取web.xml文件。
- 首先解析<context-param>键值对
- 创建一个application对象即ServletContext,用于全局共享
- 将<context-param>键值对放入ServeltContext中,web应用全局共享。
- 读取<listenter>标签,初始化创建监听器,一般使用的是ContextLoaderListener监听器,如果使用了该监听器,spring就会创建一个WebApplicationContext对象,这是一个ioc容器。将WebApplicationContext容器是放入到ServletContext全局共享,然后读取web.xml的context-param中的contextConfigLocation对应的xml配置文件,创建Bean。
- Listener创建完成后,如果还有Filter,就初始化创建过滤器。
- 读取<servlet>标签初始化创建servlet,一般使用的是DispatcherServlet.
- DispatcherServlet的父类FrameworkServlet重写了其父类的initServletBean方法,该方法会调用initWebApplicationContext()方法
- initWebApplicationContext()方法会创建一个当前servlet的ioc子容器,如果ServletContext中存在WebApplicationContext,就把他设置为父容器,如果不存在,就把父容器设置成null。(子容器可以访问父容器,但是父容器不能访问子容器)
- 读取<servlet>标签下的<init-param>中配置的xml文件并加载相关的bean。
- InitWebApplicationContext方法还会调用onRefresh方法创建Web应用相关组件。
Spring mvc执行流程(工作原理)?
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求后调用HandlerMapping处理器映射器.
- 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet.
- DispachterServlet通过HanderAdapter处理器适配器调用处理器
- 执行处理器(Controller)
- Controller执行完后返回ModelAndView
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewResolver视图解析器
- ViewResolver解析后返回具体的view
- DispatcherServlet对view进行渲染视图(即将模型数据填充至视图中)
- DispatcherServlet响应用户请求
转发和重定向的区别?
过滤器和拦截器的区别:
2、拦截器与过滤器的区别 :
1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
Mybatis框架
#{}和${}的区别?
#{}是预编译处理,${}字符串替换
#{}可以防止sql注入。
模糊查询like语句该怎么写?
Mybatis使用到的模式?
- 工厂模式
- 代理模式
- 创建者模式
- 责任链设计模式