越活越完蛋了,看着看着现在又想梳理梳理Spring基础,搞点原始真解吧,不过技术人每个阶段看相同东西的理解都是不同的,只是现在浮躁的技术中又有多少人能够一本书啃两遍以上呢,我也一样,徜徉于业务之中,所以技术是什么,永远记住,技术是服务于业务的,架构也是同样的道理,不要为了技术而技术,为了架构而架构
Spring有哪些模块
-
Spring Core
Core模块是Spring的核心类库,Spring的所有功能都依赖于该类库,Core主要实现IOC功能,Sprign的所有功能都是借助IOC实现的。
包含一些类如BeanFactory,ApplicationContext等。主要功能有:
- IoC容器:管理Bean的创建、初始化等生命周期
- 依赖注入:管理Bean之间的依赖关系,可以通过setter注入或构造器注入
- 事件发布:支持事件机制,如ContextStartedEvent等
-
Bean模块
bean相关,依赖查找,依赖注入
-
AOP
AOP模块是Spring的AOP库,提供了AOP(拦截器)机制,并提供常用的拦截器,供用户自定义和配置。俗称,面向切面编程,解耦,可重用
-
ORM
Spring 的ORM模块提供对常用的ORM框架的管理和辅助支持,Spring支持常用的Hibernate,ibtas,jdao等框架的支持,Spring本身并不对ORM进行实现,仅对常见的ORM框架进行封装,并对其进行管理
-
DAO模块
Spring 提供对JDBC的支持,对JDBC进行封装,允许JDBC使用Spring资源,并能统一管理JDBC事物,并不对JDBC进行实现。(执行sql语句)
-
WEB模块
WEB模块提供对常见框架如Struts1,WEBWORK(Struts 2),JSF的支持,Spring能够管理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器。
-
Context模块
这是在Core基础上构建的,提供了框架式的Spring应用支持。它继承了Core的所有功能,并添加了国际化、事件传播、资源加载和透明地创建上下文(比如Servlet容器)等功能。
-
MVC模块
WEB MVC模块为Spring提供了一套轻量级的MVC实现,在Spring的开发中,我们既可以用Struts也可以用Spring自己的MVC框架,相对于Struts,Spring自己的MVC框架更加简洁和方便。
-
Spring Expression
Spring表达式语言模块,主要用途:
- 注入bean属性值
- 在运行时查询和操作对象图
- 方法参数化表达式
- 条件化的配置文件逻辑等
核心特性
- IOC容器
- spring事件
- 资源管理
- 国际化
- 校验
- 数据绑定
- 类型转换
- spirng表达式
- 面向切面编程
版本关系
Spring优缺点
SpringMVC的执行流程
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。
实例化Bean的方法initializeBean,该方法在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory类下
依赖注入的三种方式
setter注入方式
public class UserService {
private UserRepository userRepository;
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
构造器注入
public class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
注解注入
public class UserService {
@Autowired
private UserRepository userRepository;
}
这三种方式各有优劣,构造器注入可以强制依赖初始化,Setter注入更灵活,字段注入没有侵入性但不易控制。需要根据实际场景选择最合适的依赖注入方式
我在想怎么样才能让博客更有趣,更简单,更易懂呢,这是个好问题,谁知道?