1.Spring的bean的作用域?
在Spring容器中,提供了5种bean的作用域类型,通过配置文件中的scope属性来设置作用域范围
- singleton(默认):使用该属性定义bean时,IOC容器仅创建一个bean实例,所有对该bean的请求,都会返回同一个实例
- prototype:使用该属性定义bean时,IOC容器可以创建多个bean实例,每次返回的都是一个新的实例
- request:该属性仅对http请求产生作用,使用该属性定义bean时,每次http请求都会创建一个新的bean
- session:该属性仅用于Http Session,同一个session共享同一个bean实例,不同的session使用不同的实例
- global-session:作用域类似于标准的http session的作用域,不同的是仅仅在基于portlet的web应用中才有意义
2.Spring和Spring MVC区别
Spring是IOC和AOP的容器框架,Spring MVC是基于Spring功能之上添加的MVC 模式的Web开发框架,并且依赖于Spring
3.Spring的特点
-
非侵入式:所谓的非侵入式是指Spring框架的API不会在业务逻辑里出现,方便从Spring框架移植到其他框架
-
容器:Spring作为一个容器,可以管理对象的生命周期,对象之间的依赖关系
-
IOC:控制反转,即创建被调用者的实例不是由调用者完成,而是由Spring容器完成,并注入调用者,当应用了IOC,一个对象依赖的其他对象会通过被动的方式传递进来,而不是这个对象创建或查找,即不是对象从容器中查找依赖,而是容器在对象初始化的时候,不等对象主动请求就将依赖传递给他。
-
- 原理:是通过java的反射技术实现的,通过反射可以获取类的所有信息,再通过xml文件和注解描述类与类之间的关系,由此可以构建出对象和依赖的关系
-
AOP:即面向切面编程,指拓展功能不修改源代码,将功能代码从业务逻辑代码中分离出来,例如日志记录、事务处理、性能统计等
-
-
特点:采用横向抽取机制,取代了传统纵向继承体系重复性代码
-
底层实现:动态代理
-
-
JDK动态代理:只能对实现了接口的类生成代理,而不是针对类原理实在运行期间创建一个接口的实现类来进行代理
-
- 定义一个实现接口InvocationHandler的类
- 通过构造函数注入被代理类
- 实现invoke()方法,再这个方法里写入逻辑
- 使用Proxy.newProxyInstance()产生一个代理对象
- 通过代理对象调用各种方法
-
CGLIB动态代理:针对类实现代理,对是否实现接口无要求,原理是对指定的类生成一个子类,覆盖其中的方法,因为是继承,所以所以被代理的类不能定义为final
-
- 定义一个实现了MethodIntecetor的类
- 实现其interceptor()方法,在其中调用proxy.invokeSuper()方法
-
-
4.Spring IOC启动过程
- 资源定位(classpath、filesystem等)
- 载入,将bean定义转换为内部数据结构BeanDefination
- 向IOC容器注入bean
5.Spring MVC流程
在web.xml中部署DispaterServlet,并配置springmvc.xml等文件;
将映射文件请求到处理器HandlerMapping;
HandlerMapping会把请求映射为HandlerExecutionChain类型的handler对象;
将handler对象作为参数传递给HandlerAdapter的实例化对象,调用其handler方法会生成一个ModelAndView对象;
通过ViewResolver视图解析器,将上一步骤中生成的ModelAndView解析为View;
DispatcherServlet根据获取到View,将视图返回给用户。
6.Spring循环依赖及解决方法
循环依赖其实就是循环引用,即两个以上的bean相互持有对方,最终形成闭环。
Spring中循环依赖的场景有:
- 构造器中的循环依赖(无法解决,会抛出异常)
- field属性中的循环依赖(采用提前暴露对象的方法解决)
7.Mybatis中#{}和${}的区别
#{}:以预编译的形式,将参数以字符串的形式设置到sql语句中,防止sql注入,相当于编译好sql语句再去取值
${}: 取出的值直接拼接到sql语句中,会有安全问题,相当于取值以后再去编译
8.Spring MVC如何接受参数(https://blog.csdn.net/qq_33721382/article/details/82931388)
- @RequestParam注解
- @PathVariable注解
- Spring MVC自动匹配(形参自动匹配key名相同的参数值)
- Spring 自动装箱(实体类接收参数)
9.@Autowired 和 @Resource
-
相同点:都是在做bean的注入时使用
-
不同点:
-
- @AutoWired为Spring提供的注解,@Resourse为J2EE提供的注解
- @AutoWired按照类型注入(by type),而@Resourse既可以按类型(by type)注入,也可以按照名字(by name)注入,默认是按照name注入
10.Spring bean的生命周期
- 实例化,构造函数构造对象
- 装配,为属性赋值
- 回调
- 初始化
- 就绪
- 销毁
11.Spring事务隔离级别
-
default:使用数据库的隔离级别
-
Read Uncommited
-
Read Commited
-
Repeatable Read
-
Serializable
12.Spring的事务传播行为
13.Spring中BeanFactory和FactoryBean的区别
BeanFactory定义了IOC容器最基本的形式,是IOC容器的定义规范
而FactoryBean是一个把bean,但是不是一个普通的bean,可以通过FactoryBean来为实例化bean定制一些逻辑,比如常规的去实例化一个bean,那么可能需要对其每个属性单独配置,比较繁琐;但是可以通过使用Factorybean来完成这个实例化,传参的时候直接传一个字符串,用逗号分隔开来,这样在实例化的时候就可以一步到位了;之所以FactoryBean可以做到这点,主要就是因为它的getObject()方法,可以返回指定的任意对象,这样使得它更加灵活