企业级应用
现代企业级应用是以Web服务器为中心,通过网络把服务器和客户端浏览器联系在一起的应用。
-
Web支持
基于Internet网络(浏览器)
-
高并发支持
同时受到大量HTTP请求,系统需要快速响应
-
事务支持
支持事务完整性(对于多个系统还需要支持分布式事务)
-
安全支持
受保护的资源获得安全保护(如防御黑客攻击)
-
交互支持
多个系统之间进行交互(如程序与数据库系统交互,与邮件服务器交互等)
-
集群支持
提供系统可用性和可伸缩性,企业级应用应该很容易随业务的需求而扩展
-
分布式支持
查找和调用分布式服务
Spring
Spring 是分层的 JavaEE 应用一站式轻量级开源框架,以控制反转(Inverse of Control,IoC)和面向切面编程(Aspect Oriented Programming,AOP)为内核,提供了表现层Spring MVC、持久层 Spring JDBC 以及业务管理等众多的企业级应用技术。
Spring的特点
-
方便解耦,简化开发(核心)
通过Spring提供的IoC容器,可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的的过度程序耦合
-
AOP编程的支持(核心)
通过Spring提供的AOP功能,用户可以方便地进行面向切面编程,许多不容易传统面向对象编程(OOP)实现的功能都可以通过AOP轻松应对
-
声明式事务的支持(核心)
通过Spring的声明式事务灵活地进行事务管理,提高开发效率和质量
-
方便程序测试
可以用非容器依赖的编程方式进行几户所有的测试工作
-
方便集成各种优秀框架
Spring不排斥各种优秀框架,并提供对各种优秀框架(如Struts、MyBatis、Hibernate等)
-
降低JavaEE API的使用难度
Spring为很多难用的JavaEE API(如JDBC、JavaMail、远程调用等)提供了一个简单封装
-
Spring源码是经典的学习范例
Spring的源码设计合理、结构清晰,处处体现出对Java设计模式的灵活运用以及Java技术的深度挖掘
Spring 体系结构
Spring 框架由 1800 多个类组成,整个框架按其所属功能可以划分为 5 个主要模块
Spring 大家族
Spring 开源组织以 Spring 为中心逐渐推出更多应对企业级开发各种场景和需求的框架,慢慢形成了一个庞大的大家族,如下:
IoC核心概念
IoC(控制反转)就是应用本身不负责依赖对象的创建及维护,依赖对象的创建以及维护是由外部容器负责,这样控制权就由应用程序转移到了外部容器,控制权的转移就是所谓的反转。控制权转移带来的好处就是降低了业务对象之间的依赖程序(低耦合、高内聚)。
DI核心概念
DI(Dependency Injection,依赖注入)可以向某个对象动态的注入它所依赖的其他对象。
依赖注入的方式
- 构造器注入
- 方法注入
- 接口注入
Spring IoC 容器支持构造器注入和方法注入
从上图可以看到,通过使用 Spring IoC 容器可以达到三层架构降低耦合度的效果,让三层之间不存在依赖之间,它们都依赖于 IoC 容器。
IoC容器
Spring IoC 容器是指实现IoC(控制反转)和DI(依赖注入)概念的一个Spring组件,开发者使用IoC容器可以获得IoC/DI带来的降低耦合度和简化开发特性
Bean
Spring中使用Bean来表示应用组件,一个Bean组件可以是任何形式的简单Java类实例,Spring中使用IoC容器来管理Bean的生命周期(Bean的创建和销毁)
BeanFactory(Bean工厂)
- BeanFactory是Spring框架最核心的接口,它提供了高级IoC的配置机制;BeanFactory使管理不同类型的Java对象成为可能。
- BeanFactory是Spring框架的基础设施,属于地测封装组件,专供Spring框架内部使用
ApplicationContext(应用上下文)
- ApplicationContex 是建立在 BeanFactory 基础之上,提供了更多面向应用的功能。一般称 BeanFactory 为IoC 容器,而称 AppliecationContext 为应用上下文。
- ApplicationContext 面向 Spring 框架的开发者,属于上层封装组件,专供开发者使用
- 通过 ApplicationContext 应用上下文案例调用其 getBean() 方法从 IoC 容器中即可获取 Bean 对象实例。
启动IoC容器
Spring有三种启动IoC容器的方式
-
ClassPathXmlApplication(相对路径)
从类路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当做类资源
ApplicationContext ctx = new ClassPathXmlApplicationContext("包路径/beans.xml")
- FileSystemXmlApplicationContext(绝对路径)
ApplicationContext ctx = new FileSystemXmlApplicationContext("文件路径/beans.xml")
-
XmlWebApplicationContext(Web配置路径)
读取Web应用下的XML配置文件并加载上下文定义
装配 Bean
装配 Bean 是指在 Spring IoC 容器中创建 Bean 组件和建立 Bean 组件之间的依赖关系的过程,即实现 IoC(控制反转)和 DI(依赖注入)。
Spring 支持三种装配 Bean 的方式:
- 基于 XML 配置装配 Bean
- 基于注解装配 Bean
- 基于 Java 类装配 Bean
使用注解装配 Bean
- 开启注解
<!--Spring IoC 容器需要在 Spring 配置中开启注解(默认禁用注解)-->
<context:annotation-config />
<!--Spring IoC 容器需要自动检测 Bean(扫描 Java 类中 Bean 组件) -->
<context:component-scan packages=“包路径”/>
-
定义Bean组件注解
@Component
标示 Java类 为 Spring Bean 组件(通用注解)
@Controller
标示三层架构中表现层的 Java 类为 Spring Bean 组件
@Service
标识三层架构中业务逻辑层的 Java 类为 Spring Bean 组件
@Repository
标识三层架构中数据访问层或持久层的 Java 类为 Spring Bean 组件
-
Bean 组件依赖注入注解(DI)
@Autowired
- 可用于标注 setter 方法
- 可用于标注构造器
- 可用与直接标注属性(常用)
@Resource
使用与 @Autowired 注解相同
@Qualifier
明确指定需要自动装配的Bean组件
AOP 概念
AOP (Aspect Oriented Programming 的缩写,翻译为面向方面或面向切面编程),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术)
- AOP 是 OOP的延续和有益补充,也是 Spring 框架中的一个重要内容,是函数式编程的一种衍生泛型
- 利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可用性,同时提高了开发的效率
- 在 Spring 中提供了 AOP 的丰富支持,允许通过分离应用的业务逻辑与系统级服务和事务管理进行内聚性的开发
AOP 与 OOP 区别
- OOP(面向对象编程)针对业务处理过程中属性和行为进行抽象和封装,以复用代码、降低系统复杂度
- AOP(面向切面编程)针对业务处理过程中的切面进行横向提取,以隔离业务,降低业务之间的耦合度
AOP 使用场景
- 日志记录
- 性能统计
- 安全控制
- 事务处理
- 异常处理
- 其他功能
AOP 术语
-
连接点(Joinpoint)
AOP 插入代码的特定位置(方法调用前、方法调用后、方法调用前后、抛出异常)
-
切点(Pointcut)
AOP 定位或查找连接点的方式(一个切点可以匹配多个连接点)
- 增强(Advice)
AOP 插入到连接点的一段程序代码(前置增强、后置增强、环绕增强和抛出异常增加)
- 引介(Introduction)
特殊的增强(可以为类添加一些属性和方法)
- 织入(Weaving)
插入代码的过程(AOP 有三种织入方式:编译器织入、类装载器织入、动态代理织入)
- 切面(Aspect)
由切点和增强或引介组成(Spring AOP 是负责实施切面的框架)
Spring AOP 框架
Spring AOP 是使用纯 Java 实现 AOP,它不需要专门的编译过程,也不需要特殊的类装载器,它在运行期通过代理的方式向目标类织入增强代码。Spring AOP 使用了两种代理机制:JDK 动态代理和CGLib 动态代理,它们是 Spring AOP 底层技术。
Spring AOP 支持两种使用方式:
- 基于 XML 配置文件
- 基于注解
注解
<!--开启 AOP 注解开关-->
<aop:aspectj-autoproxy />
@Aspect 注解:放置于切面类上,用于注解定义一个切面
@Before 注解:放置于切面类方法上,用于注解实现前置增强
@After 注解:放置于切面类方法上,用于注解实现后置增强
@Around 注解:放置于切面类方法上,用于注解实现环绕增强
@AfterThrowing 注解:放置于切面类方法上,用于注解实现抛出异常增强
Spring AOP 切点表达式
切点表达式 = execution (返回值类型+包名+类名+方法名+参数个数)
切点表达式支持三个通配符:
- 符号(*):代表任意字符,匹配上下文中的一个元素
- 符号(..):代表任意字符,可以代表多个元素,但是在表示类的时候不能单独使用,必须和 * 配合;在代表形参的时候可以单独使用
- 符号(+):代表按类型匹配指定类的所有类(包括子类),只能跟在类名的后面
举例:
execution(* com.dt..Dog.b(..))