Spring简介
Spring 是一个轻量级的Java 开发框架,Spring主要用来开发Java应用,Spring 可以被看作是一个大型工厂。
Spring工厂的作用就是生产和管理 Spring 容器中的Bean,控制反转Spring IOC和面向切面编程Spring AOP,Spring 致力于Java应用各层的解决方案。
Spring优点
Spring优点主要表现会如下4点:
1)方便解耦
Spring的主要作用就是为代码解耦,降低代码间的耦合度。
Spring 提供了IOC控制反转,由容器管理对象,对象的依赖关系,现在由容器完成。
2)AOP 编程的支持
通过 Spring 提供的 AOP功能,方便进行面向切面的编程。
3)支持声明式事务处理
通过配置就可以完成对事务的管理,无需手动编程,让开发人员可以从繁杂的事务管理代码中解脱出来,从而提高开发效率和质量。
4)方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,相反 Spring 可以降低各种框架的使用难度,Spring 提供了对各种优秀框架,比如:Struts、Hibernate、MyBatis、SpringBoot等的直接支持。
Spring整体结构
Spring有七大功能模块,分别是Spring Core,AOP,ORM,DAO,MVC,WEB,Context。
Spring IOC
Spring IOC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。
传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试,有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,如下图所示:
上图引入了IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器。
所以,IOC借助于“第三方”实现具有依赖关系的对象之间的解耦,使程序更优良。
Spring依赖注入
Spring的依赖注入,我们一般使用@Autowired注解来完成,关于依赖注入一般有三种方式:
属性注入、构造器注入、setter方法注入:
1.属性注入
属性注入是大家最为常见也是使用最多的一种注入方式了,代码如下:
@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; //... }
2.Set注入
这种注入方式通过set方法完成注入,所以在类中必须要给属性设定set方法。
@Service public class UserServiceImpl implements UserService { private UserMapper userMapper; @Autowired public void setUserMapper(UserMapper userMapper) { this.userMapper = userMapper; } }
3.构造器注入
构造器注入是官方推荐的方式,如下:
@Service public class UserServiceImpl implements UserService { private final UserMapper userMapper; @Autowired public UserServiceImpl(UserMapper userMapper) { this.userMapper = userMapper; } }
Spring注解
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:
1、如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大,如果按需求分开.xml文件,那么.xml文件又会非常多。
2、在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率。
为了解决这两个问题,Spring引入了注解,通过”@XXX”的方式,比如:@Autowired、@Required等等,让注解与Java Bean紧密结合。
既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。
Spring事务
Spring 本身并不实现事务,Spring事务 的本质 还是 底层数据库 对事务的支持,没有 数据库 事务的支持,Spring事务就不会生效。
Spring 事务 提供一套抽象的事务管理,并且结合 Spring IOC 和 Spring AOP,简化了应用程序使用数据库事务。
Spring事务有两种方式:编程式事务管理和声明式事务管理,这两种方式。
1.编程式事务管理
Spring框架提供了两种编程式事务方式:
- 使用TransactionTemplate
- 使用PlatformTransactionManager
Spring团队通常建议使用TransactionTemplate进行程序化事务管理。
TransactionTemplate采用与其他spring模板相同的方法,它使用一种回调方法,使应用程序代码可以处理获取和释放事务资源,让开发人员更加专注于业务逻辑。
@Autowired private TransactionTemplate transactionTemplate; public void testTransaction() { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { try { // .... 业务代码 } catch (Exception e){ //回滚 transactionStatus.setRollbackOnly(); } } }); }
2. 声明式事务
声明式事务不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明,或通过基于@Transactional注解的方式,便可以将事务规则应用到业务逻辑中。
如下所示,只需加入@Transactional注解的方式:
@Transaction public void insert(String userName){ this.jdbcTemplate.update("insert into t_user (name) values (?)", userName); }
Spring生命周期
Spring生命周期主要分为以下4大阶段:实例化、属性赋值、初始化阶段、销毁阶段。
第一步:实例化阶段
第二步:Bean属性赋值
第三步:初始化阶段
第四步:销毁阶段
Spring MVC
Spring MVC 基于 MVC 模式,因此理解 Spring MVC 需要先对 MVC 模式有所了解。
可以用如下的图形来表示MVC三者之间的关系:
SpringMVC 全名叫 Spring Web MVC,是⼀种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级Web 框架。
SpringMVC是Spring体系结构的一部分,如下图所示:
SpringMVC核心组件
SpringMVC五大组件,如下图所示:
1.前端控制器 DispatcherServlet
DispatcherServlet本质上是一个Servlet,相当于一个中转站,所有的访问都会走到这个Servlet中,再根据配置进行中转到相应的Handler中进行处理,获取到数据和视图后,在使用相应视图做出响应。
2.处理器映射器 HandlerMapping
HandlerMapping本质上就是一段映射关系,将访问路径和对应的Handler存储为映射关系,在需要时供前端控制器查阅。
3.处理器适配器 HandlerAdapter
本质上是一个适配器,可以根据要求找到对应的Handler来运行。
由于 Handler 涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发 Handler。
4.视图解析器(ViewResolver)
本质上也是一种映射关系,可以将视图名称映射到真正的视图地址。前端控制器调用处理器适配完成后得到model和view,将view信息传给视图解析器得到真正的view。
5.视图渲染(View)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)。
本质上就是将handler处理器中返回的model数据嵌入到视图解析器解析后得到的页面中,向客户端做出响应。
SpringMVC五大组件关系,如下图所示:
- DispatcherServlet 控制器入口 负责分发请求
- HandlerMapping 负责根据请求 找到对应的控制器
- Controller 真正处理请求的控制器
- ModelAndView 封装数据信息和视图信息的
- ViewResolver 视图处理器 通过处理找到对应的页面
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》