什么是Spring?
Spring是一个轻量级的,非侵入性的,针对企业级开发的免费开源框架;
Spring5的结构体系分为四层
- Test层:Test之所以在最底层,意思是上面的所有内容都可以进行Test单元测试;
- Core Container层,核心容器层;
- AOP、Aspectj、
- Data:数据访问层;
- Web应用支持;
Spring框架的好处?
- 轻量:非侵入性的,所依赖的东西少,部署简单;
- 控制反转:将Bean的创建交给Spring来管理,通过依赖注入,将依赖主动的注入的Bean中,无需关系依赖的具体实现;
- 面向切面编程AOP:Spring提供了面向切面的编程,可以将业务逻辑和具体服务分开;
- 事务管理:Spring提供更方便的事务管理功能,声明式事务;
- 松耦合:通过简单的xml或注解配置即可实现依赖注入,且无需关系具体实现;
- 便于集成其他框架;
什么是IOC,Spring是如何实现的?
IOC,Inversion of Control(控制反转)
- IOC是一种设计思想,在Java开发中,将你设计好的对象交给SpringIOC容器来管理,而不是通过代码显示的创建对象
- 把创建和查找依赖对象的控制权交给IOC容器,由IOC容器进行注入,组合对象。这样对象与对象之间就是松耦合的,便于测试和功能复用
- 使程序的整个体系结构可维护性,灵活性,可拓展性都变得更好
DI(依赖注入)
- 依赖注入,是IOC容器装配,注入对象的一种方式
- 依赖注入,通过简单的配置就可以注入需要的资源,完成自身的业务逻辑,不需要关心资源的出处和具体实现
Spring如何实现IOC?
- 基于XML配置文件
- 基于注入配置
- 基于注解+Java代码显示配置
什么是AOP?Spring如何实现的?
Spring中Bean的生命周期
bean生命周期(5步)
- 通过无参构造器创建bean实例;
- 为bean对象注入属性(调用set方法);
- 调用bean的初始化方法(需要我们手动配置);Bean标签的init-method属性
- bean对象可以使用了(对象获取到了);
- 当容器关闭的时候,调用bean对象的销毁方法(手动配置,手动调用)Bean标签的destroy-method属性
bean的生命周期(7步)
- 通过无参构造器创建bean实例;
- 为bean对象注入属性(调用set方法);
- 把bean实例传递到bean后置处理器的方法;postProcessBeforeInitialization()
- 调用bean的初始化方法(需要我们手动配置);
- 把bean实例传递到bean后置处理器的方法;postProcessAfterInitialization()
- bean对象可以使用了(对象获取到了);
- 当容器关闭的时候,调用bean对象的销毁方法(手动配置,手动调用)
Spring常用的注入方式有哪些?
在XML中配置
- 节点注册:在bean节点内通过标签的属性直接注入,一般注入一些工厂bean什么的东东
- bean的注入:
1.set方法注入(property标签)
2.构造器注入(constructor-arg标签)
3.级联注入(级联注入需要先获取对象,在注入,所以要有get方法和set方法)
4.p名称空间注入(需要引入p名称空间)
5.注入字面量量,集合,带特殊字符的属性
注解方式
1.bean的注册:
- @Component //注册所有bean
- @Controller //注册控制层的bean
- @Service //注册服务层的bean
- @Repository //注册dao层的bean
2.bean的注入
- @Autowired 作用于 构造方法、字段、方法,常用于成员变量字段之上。
- @Autowired + @Qualifier 注入,指定 bean 的名称
- @Resource JDK 自带注解注入,可以指定 bean 的名称和类型等
BeanFactory和ApplicationContext有什么区别?
BeanFactory是IOC的底层实现(程序员不推荐使用,留给Spring自用)
ApplicationContext
Spring主动装配Bean的方式有哪些?
基于xml配置bean的装配方式:
- no:默认,不进行自动装配,需要手动设置ref属性装配bean;
- byName:根据名称进行自动装配(bean的id和bean的property相同)
- byType:根据类型进行自动装配;
- constructor:根据构造函数进行自动装配,参数是通过byType进行自动装配;
- autodetect:自动探测,如果有构造函数就根据构造函数自动装配,否则就是要byType;(已弃用)
基于注解的方式进行自动装配:
- @Autowired:根据类型进行自动装配(可以标注在构造方法,setter方法,参数,成员变量,注解上)
- @Qualifier:根据bean的名称进行自动装配;需要配合@Autowired一起使用
- @Resource:即可根据类型进行自动装配,也可根据名称自动装配(指定value属性);
- @Value:注入配置信息,字面量;
Spring事务的实现方式有哪些?
- 编程式事务:在代码中手动调用commit()、rallback();等事务相关的方法;
- 基于xml方式声明事务;
- 基于注解@Transactional声明事务,需要在Spring核心配置文件中开启事务注解能力;
- 基于Aspectj AOP配置(注解)事务;
介绍一下SpringMVC
SpringMVC是一种基于java实现的请求驱动型的轻量级Web框架;
SpringMVC通过一套注解,让一个简单的Java类成为处理请求的控制器,无序实现任何接口,同时还支持Restful风格的请求设计;
SpringMVC的六大组件:
-
前端控制器(DispatcherServlet)
用户发送的请求会被前端控制器拦截,并进行分发处理,是整个SpringMVC的核心控制器,DispatcherServlet的存在极大的降低了组件之间的耦合性; -
处理器映射器(HandlerMapping)
HandlerMapping 的主要作用就是将请求的URL映射到到具体的处理器(Controller),之后会生成处理器对象与处理器拦截器(处理器链ExecutionChain)并返回给DispatcherServlet; -
处理器适配器(HandlerAdaptor)
HandlerAdaptor拿到DispatcherServlet发送过来的ExecutionChain,会通过反射调用处理器方法执行,最后将结果返回给DispatcherServlet(可能是Json数据,可能是ModelAndView对象); -
处理器(Handler)
每一个Controller都是一个处理器 -
视图解析器(ViewResolver)
ViewResolver 的作用就是生成 View 视图并返回,接收 DispatcherServlet 转发来的 ModelAndView,首先将View中的逻辑视图名转换成物理视图名(即页面的具体地址,)再生成 View 视图对象,最后将 Model 数据填充到 View 中,返回视图给 DispatcherServlet;最后 DispatcherServlet 在响应给用户; - 视图(View)
SpringMVC的执行流程?
- 用户发起请求, DispatcherServlet 进行拦截;
- DispatcherServlet 将拦截到的请求转发给 HandlerMapping;
- HandlerMapping 将请求的URL映射到具体的处理器,期间可能会经过多个处理器拦截器,最后得到 ExecutionChain,返回给 DispatcherServlet;
- DispatcherServlet 拿到 ExecutionChain 后会将其转发给 HandlerAdaptor;
- HandlerAdaptor 接受 DispatcherServlet 转发来的 ExecutionChain 后,会通过反射的方式逐个调用具体的 Handler;
- Handler 会返回一个 ModelAndView 对象(或 Json );
- HandlerAdaptor 会 ModelAndView 对象转发给 DispatcherServlet,然后 DispatcherServlet 会将其转发给 ViewResolver;
- ViewResolver 接收 DispatcherServlet 传递的 ModelAndView,会先将 View 中的逻辑视图名转换成物理视图名,最后 ViewResolver 将视图提交给 DispatcherServlet;
- DispatcherServlet 接收到 ViewResolver 提交的 View 后,会将 Model 中的数据渲染给 View 视图,最后响应给用户;