spring是一个分层的JavaSE/EE funll-stack(一站式)轻量级的开源框架,它是为了解决企业应用开发的复杂性而创建的,它的核心是控制反转(IOC)和面向编程(AOP).
## 方便解耦,简化开发(高内聚低耦合) spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给spring管理。spring工厂是用于生成bean # 支持Aop编程 spring提供了面向切面编程,可以方便的实现对程序权限拦截,运行监控,日志记录等功能。 声明式事物的支持 通过对事物的配置就可以完成对事物的管理,而无需手动编程 方便程序测试 spring对Junit4支持,可以通过注解方便的测试spring程序 方便集成各种优秀框架 spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架如:Struts、Hibernate、MyBatis、Quartz等)的直接支持 降低JavaEE API的使用难度 Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
2.1 Aop概述 aop是一种设计思想,是软件设计领域的面向切面编程,它是一种基于oop之上的一种编程规范,是面向对象编程的一种补充和完善。它以通过预编译方式和运行期动态代理的方式,实现不修改源代码的情况下给程序动态统一添加额外功能的一门技术。
2.2 应用场景: 实际项目中通常会把系统分为两个部分,一部分是核心业务,一部是非核心业务。非核心业务一般通过特定的方式切入到系统中,这种特定的方式就是借助aop进行实现的。 aop基于ocp(开闭原则)在不改变原系统核心业务代码的的基础上添加一些扩展功能并可以控制“对象”的执行。例如aop用于项目中的日志处理,事务处理,权限处理,缓存处理等。
2.3 aop的代理机制以及应用场景 假如目标对象(被代理对象)实现接口,则底层可以采用JDK动态代理机制为目标对象创建代理对象(目标类对象和代理类对象会实现共同接口) 基于JDK代理方式实现
假如目标对象没有实现接口,则底层会采用CGLIB代理机制为目标对象创建代理对象,(默认创建的代理类好继承目标对象的类型)基于CGLIB代理方式实现 2.4 aop相关术语分析 切面(Aspect)是一个概念,是横切面对象,一般为一个具体类对象(可以借助@Aspect) 通知(Advice)就是抽取的共性功能组成的代码逻辑(方法),放在通知类里(一个类里可以放多个通知(Advice)方法)。通知有位置区分(放在逻辑代码前称为前置通知,放在逻辑代码后称为后置通知)也叫通知类型. 连接点(joinpoint):目标对象里的方法,一般指被拦截到的方法。 切入点(pointCut)多个连接点的一个定义,一般可以理解为多个连接点集合 举例:我们可以简单的将机场的一个安检口理解为连接点,多个安检口为切入点,安全检查过程看成是通知。 目标对象(Target Object)有切入点方法的对象 Aop代理(Aop proxy)spring代理的目标对象 aop的jar包 org.springframework.boot spring-boot-starter-aop 动态代理可以在配置文件(applicatiion.properties)中进行如下配置: spring.aop.proxy-target-class=false(默认为jdk代理,false为CGLIB代理)
2.5 切入点表达式增强 bean表达式一般应用于类级别,实现粗粒度的切入点定义,案例分析: bean(“userServiceImpl”)指定一个userServiceImpl类中所有方法。 bean(“ServiceImpl")指定所有后缀为ServiceImpl的类中所有方法。 说明:bean表达式内部的对象是由spring容器管理的一个bean对象,表达式内部的名字应该是spring容器中某个bean的name。 within表达式(了解) within表达式应用于类级别,实现粗粒度的切入点表达式定义,案例分析: within(“aop.service.UserServiceImpl”)指定当前包中这个类内部的所有方法。 within("aop.service.”) 指定当前目录下的所有类的所有方法。 within("aop.service…") 指定当前目录以及子目录中类的所有方法。 execution表达式(了解) execution表达式应用于方法级别,实现细粒度的切入点表达式定义,案例分析: 语法:execution(返回值类型 包名.类名.方法名(参数列表))。 execution(void aop.service.UserServiceImpl.addUser())匹配addUser方法。 execution(void aop.service.PersonServiceImpl.addUser(String)) 方法参数必须为String的 addUser方法。 execution( aop.service….(…)) 万能配置。
@annotation表达式(重点) @annotaion表达式应用于方法级别,实现细粒度的切入点表达式定义,案例分析 @annotation(anno.RequiredLog) 匹配有此注解描述的方法。 @annotation(anno.RequiredCache) 匹配有此注解描述的方法。 其中:RequiredLog为我们自己定义的注解,当我们使用@RequiredLog注解修饰业务层方法时,系统底层会在执行此方法时进行日扩展操作。 2.6 切面的优先级设置 切面的优先级需要借助@Order注解描述 数字越小优先级越高,默认优先级比较低。 如:@Order(1)的优先级高于@Order(2) 2.7关键对象的术语