文章目录
为啥要用Spring?
- 提供的IOC技术
- 对事务的支持
- 提供AOP技术
- 方便框架集成
Spring的模块
- Spring Core:提供IOC和依赖注入特性。
- Spring Context:提供一种框架式对象访问方法(基于Core封装包)。
- Spring Dao:提供JDBC的抽象层(基于Data Access Object)。
- Spring Aop:提供AOP的实现。
- Spring Web:提供针对Web开发的集成特性。
- Spring Web Mvc:提供Web应用的Model View Controller的实现。
注入方式有哪些?
- 构造函数依赖
- 属性依赖
- 注解依赖
Bean的作用域哪些?
- Singleton:默认,在容器启动时便创建对象。
- Prototype:原型,当调用getBean方法时才创建对象。
- Request:Web环境下使用,指当新会话创建时创建对象,请求结束便销毁对象。
- Session:Web环境下使用,指当新会话创建时创建对象,会话结束便销毁对象。
Bean的线程是安全的吗?
Bean的作用域是默认的,Spring没有对单例bean进行多线程的封装处理。
- 有状态——可以保存数据。
- 无状态——不可保存数据。
某种程度上bean是安全的,因为大部分Bean是无状态的(如dao类),若是bean有状态,就需要自己去保证线程安全了,如改变bean作用域为prototype,相当于每次请求bean都new Bean()出来。
使用prototype需慎重,频繁的创建和销毁bean会造成很大的性能消耗。
IOC是什么?
IOC:Inversion Of Control(控制反转)
DI:Dependency Injection(依赖控制)
你可以理解为将DI等价于IOC。
我的理解为:由原来自己手动处理依赖关系,在有框架后交给框架处理依赖关系,这种逻辑上的变化称为控制反转。
AOP是什么?
AOP:Aspect-Oriented Programming(面向切面编程)
从传统OOP中的类对象思考转而到切面思考,切面与目标对象是独立的,靠着Spring AOP模块自动整合(切面切入到目标)形成一个完整的功能。
我的理解为:把切面类的通知方法根据切点表达式找到目标对象的连接点方法通过代理技术进行织入形成一个Bean。
事务的实现
在配置类上添加@EnableTranscationManagement
注解。
事务隔离
有五大隔离级别,默认值为ISOLATION_DEFAULT(使用数据库的设置),其它四个隔离级别和数据库级别一致。
- ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库啥设置我就是啥设置。
Spring Mvc的组件
- 前置控制器——DispatcherServlet
- 映射处理器——HandlerMapping
- 处理器——Controller
- 模型和视图——ModelAndView
- 视图解析器——ViewResolver
Spring Mvc的流程
1、spring mvc将请求发送到前置控制器;
2、前置控制器到映射处理器里去查找,找出处理请求的处理器;
3、前置控制器再将请求提交到对应的控制器上;
4、在控制器进行业务上的处理后,将返回一个模型和视图;
5、前置控制器到模型和视图里去查找,找出指定的视图对象;
6、视图对象便负责渲染返回客户端。
说一下Spring里的注释吧
@CrossOrigin:为特定类或方法处理跨域请求。
@Controller:表示这个类是一个控制器。
@RestController:相当于@Controller+@RespondBody,很便利。
@RequestMapping:将 HTTP 请求映射到相应的类或者方法上。
@PathVariable:将方法参数绑定到url地址参数上。
@RequestParam:将请求参数绑定到方法参数上。
@RequestBody:读取Request请求的body部分数据,并将相应的数据绑定到要返回的对象和controller中方法的参数上。
@RespondBody: 将返回的对象写入到Response对象的body数据区,常用来返回JSON数据或者XML数据。
说一下过滤器和拦截器是怎样实现的?
过滤器:实现Filter
接口,并在接口方法里实现业务逻辑。
拦截器:实现HandlerInterceptor
接口,并在接口方法里实现业务逻辑。
说一下Filter和HandlerInterceptor的区别
1、底层实现方式不同:
Filter:基于回调函数实现。
HandlerInterceptor:基于Java反射机制(动态代理)实现。
2、使用范围不一样:
Filter:此接口类路径为javax.servlet.Filter,是Servlet规范定义中的,要依赖于Tomcat等容器,使它只能在web程序中使用。
HandlerInterceptor:它是个spring组件由spring容器管理,不依赖于Tomcat等容器,不局限于web程序中使用。
3、触发时机不同:
Filter:请求进入容器中后,在进入servlet前进行预处理,请求结束是在servlet处理完后。
HandlerInterceptor:请求进入servlet后,在controller前进行预处理,controller里渲染了对应的视图后请求结束。
4、注入Bean的时机不同:
设在过滤器和拦截器中都注入service,DeBug后会发现在拦截器中的service为null。
这是因为加载顺序不同导致的,拦截器受到Spring容器的管理,但加载时间在SpringContext之前。
解决方案:在注册拦截器之前,先将Interceptor 手动进行注入。
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Bean
public MyInterceptor getMyInterceptor(){
System.out.println("注入了MyInterceptor");
return new MyInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getMyInterceptor()).addPathPatterns("/**");
}
}
5、控制的执行顺序不同:
在实际开发过程中,会存在多个过滤器或拦截器同时出现的情况,有时希望某个过滤器或拦截器能优先执行,便涉及到它们的执行顺序了。
Filter:用@Order
注解控制执行顺序,值越小优先级越高。(也就是设置过滤器的级别)
HandlerInterceptor:它是默认注册顺序来的,值越小优先级越高。
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").order(3);
registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**").order(1);
registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**").order(2);
}