SSM框架
Spring + Spring MVC + MyBatis
:标准MVC模式
继 SSH (Struts+Spring+Hibernate)之后,主流的 Java EE企业级 Web应用程序开源框架
- spring:实现业务对象管理
- spring MVC:负责请求的转发和视图管理
- MyBatis:作为数据对象的持久化引擎
学习:关于SSM框架的优势
Spring
轻量级容器框架,业务对象管理
AOP
面向切面编程,预编译方式和运行时动态代理实现在不修改源码情况下给程序动态统一添加功能
代理模式
,建立在spring抽象事务管理之上的声明性事务管理- 支持用户自定义的切面
- 业务逻辑分离,低耦合
核心:横切关注点的分离和织入
场景:日志记录,性能统计,安全控制,事务处理
其他几个重要概念
切入点
切面
拦截器(Advisor)
- PointCutAdvisor:PointCut + Advice,
- IntroudtionAdvisor:Introduction,
AOP拦截方法级别,OOP拦截对象级别。
织入(Weaveing)
1.静态织入方式
- 编译期:AspectJ织入编译器
- 类加载期:加载到JVM时,类加载器(class loader)
2.动态代理技术
Spring AOP,核心是反射,ProxyFactory或ProxyFactoryBean-->BeanPostProcessor(自动代理)
其中,自动代理有2种
- BeanNameAutoProxyCreator
- DefaultAdvisorAutoProxyCreator
AOP代理(AOP Proxy)
- jdk动态代理
- cglib代理
学习:对AOP代理的理解示例
IOC
控制反转(Inversion of control),由容器创建和注入依赖对象,管理对象依赖关系
- 低侵入式设计
- 面向接口编程,对象动态组合
- 增加Bean可复用性,降低Bean之间耦合
学习:通俗易懂Ioc讲解
DI
依赖注入(Dependenc Injection),实现 Ioc思想的核心,对象之间依赖关系由容器在运行时决定
实现 DI的核心是反射:实例化类时,通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中
- 谁控制谁,控制什么
- 为何是反转,反转了什么
- 谁依赖谁,为什么需要依赖
- 谁注入谁,注入了什么
项目的运行和周期由 Ioc控制,事件的请求和反应由 DI控制
相对 Ioc而言,DI明确描述了“被注入对象依赖 IoC容器配置依赖对象”
学习:Ioc实例讲解
基本使用
spring IoC容器实例化Bean(工厂模式):BeanFactory,BeanDefinition,ApplicationContext
- setter方式实例化Bean
- 构造器实例化Bean
- 静态工厂方式实例化Bean
- 实例工厂方法实例化Bean
具体参见:https://www.jianshu.com/p/646c1f657144
spring DI实现依赖注入:
- Setter Injection:通过JavaBean属性注射依赖关系
- Constructor Injection:将依赖关系作为构造子参数传入
- 注解机制
SpringMVC
请求转发和视图管理
1.客户端发送请求到DispacherServlet(分发器)
2.由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller
3.Controller调用业务逻辑处理后,返回ModelAndView
4.DispacherSerclet查询视图解析器,找到ModelAndView指定的视图
5.视图负责将结果显示到客户端
- 处理映射器:将bean的name作为url进行查找
- 处理适配器:按要求的规则去执行handler
MyBatis
SpringBoot
springboot配置
<!-- SpingBoot相关jar包版本 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<!-- SpringBoot核心jar包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- web开发包:包含Tomcat和springmvc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>