Spring框架
轻量化的企业级框架
企业级应用指的是 大规模、性能和安全要求高、业务复杂、灵活多变 的大型 WEB 应用程序
Spring之父
Rod Johnson SpringFramework创始人, interface21 CEO。
Spring 是由Rod Johnson于2004年3月24日发布了第一个版本
Spring体系结构
Spring 体系结构包括Core、AOP、DataAccess、Web等模块
Spring Core:Spring框架的最基础部分,提供DI(依赖注入)特性。
Spring Web:为Spring在Web应用程序中的使用提供了支持。
Spring ORM:对主流ORM框架(Hibernate、Toplink等)进行集成。
Spring Context:Spring上下文,提供Bean容器的集合。
Spring AOP:基于Spring Core的符合规范的切面编程的实现。
Spring JDBC:提供了JDBC的抽象层,简化了JDBC编码。
Spring生态系统
Spring 生态系统由Spring Boot、SpringCloud、SpringData等子项目组成
Spring最新版本
Spring 目前的最新的稳定版本是5.0.7GA
ioc管理类,用解耦的方式造对象
低耦合的方法连接数据库
SpringIOC(控制反转):解耦 高内聚,低耦合编程思想 硬编码实现解耦: 1.不要直接new对象,通过反射创建 2.将需要创建的对象独立保存在资源文件中,动态加载
步骤:
1. 编写资源文件(driver、url、root、password)
2. 创建工具类
3. 加载文件
4. 通过资源文件key获取value
5. 获取连接
低耦合方式获取对象
代码编写逻辑:
1.创建各接口及各接口实现类,并写相关方法
2.编写资源文件,降低耦合性
3.创建加载资源文件的工厂类,以解耦方式创建实例对象
4.在相关接口实现类里,采用低耦合方式替换高耦合方式
5.编写测试类
Spring两大思想
一. IOC控制反转 DI依赖注入 IOC容器:springIOC搭建spring容器管理程序中的各个组件(class)让程序可以实现高内聚,低耦合的编程
二. AOP面向切面编程
spring环境搭建: 1.坐标 2.配置文件
SpringIOC
1.找到需要以解耦方式获取实例对象的类
2.将需要spring管理的类注入spring容器 <bean id="唯一标识" class="类"></bean>
3.向spring容器中索取java实例(解耦) 3.1.加载spring核心配置文件,获取spring容器对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml")
3.2.获取对象
Student student = (Student) applicationContext.getBean("student");
普通低耦合方式和springIOC方式的区别
普通 ------- springIOC
beans.properties ------- beans.xml
key=value ------- id=class
BeansFactory ------- ApplicationContext
getBean(key) ------- getBean(id)
SpringIOC解释
● IOC名词解释,作用是解耦,使用IOC容器管理项目组件之间的耦合关系
● IOC( Inversion of Control,中文释义:控制反转 ) 是Spring框架的核心思想之一, 主要用于解耦。IOC是指将创建对象的控制权转移给Spring框架进行管理。由Spring框架根 据配置文件或注解等方式,创建bean对象并管理各个bean对象之间的依赖关系。使对象之间 形成松散耦合的关系,实现解耦;
○ 控制 :指的是对象创建(实例化、管理)的权力
○ 反转 :控制权交给外部环境(Spring框架、IoC容器)**
SpringIOC关键字
BeanFactory(父) ApplicationContext(子)
ClassPathXmlApplicationContext======>通过加载主配置文件的相对路径,获取spring容器 FileSystemXmlApplicationContext=====>通过加载主配置文件的绝对路径,获取spring容器 AnnotationConfigApplicationContext========>加载配置类,获取spring容器
SpringAOP
概念
AOP(Aspect-Oriented Programming: 面向切面编程):
将那些与业务无关,却为业务模块所共同调用的逻辑(例如事务处理、日志管理、权限控制等)封装抽取成一个可重用的模块,这个模块被命名为“切面”(Aspect),便于减少系统的 重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性;
Spring AOP 基于动态代理实现: ○ 如果被代理的对象,已经实现某个接口,则 Spring AOP 会使用 JDK Proxy(反射),基于接口的方式,创建代理对象(JDK动态代理的核心是InvocationHandler接口和Proxy类); ○ 如果被代理的对象,没有实现某个接口,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib,基于继承的方式,生成一个被代理对象的子类来作为代理(Cglib动态代理的核心是MethodInterceptor接口和Enhancer类);
AOP通知类型
AOP将抽取出来的共性功能称为通知;通知类型:以通知在上下文中的具体位置作为划分 前置通知(Before) 返回通知(After-returning) 异常通知(After-throwing) 后置通知(After) 环绕通知(Around)
AOP连接点(Join point)
AOP将所有的方法都视为连接点,不管是接口里面的抽象方法,还是实现类里面的重写方法,都是连接点
AOP切点(Pointcut)
AOP将可能被抽取共性功能的方法称为切入点。切入点是连接点的子集
AOP目标对象(Target)
就是挖掉功能的方法对应的类生的对象,这种对象是无法直接完成最终工作的
AOP织入(Weaving)
就是将挖掉的功能回填的动态过程
AOP切面
切点+通知
SpringAOP+AspectJ实现步骤
1.添加依赖,aop与aspectj表达式的依赖 2.创建spring的主配置文件,bean内的命名空间要添加aop的 3.创建业务代码并编写日志记录代码(事务管理代码) 4.将业务层与日志记录层注入spring容器 5.aop:config--aop配置 aop:aspect--aop切面 aop:before--通知内容与通知类型
切点表达式配置语法
execution(修饰符 返回值 包名称.类名称.方法名称(参数列表)) eg:
execution(public void com.apesource.service.ServiceImp.findAll())
1.修饰符可以省略代表任意 execution(返回值 包名称.类名称.方法名称(参数列表)) 2.返回值可以使用“”代表任意 execution( 包名称.类名称.方法名称(参数列表)) 3.包名可以使用“”代表任意名称 execution( ...类名称.方法名称(参数列表)) 4.包名可以使用“..”代表任意个数 execution( ...类名称.方法名称(参数列表)) 5.类名与方法名可以使用“”代表任意 execution(* ....(参数列表)) 6.参数列表可以使用".."代表任意个数任意类型 execution( ....*(..)) 如果有参数 int======>int String===>java.lang.String
⭐️⭐️⭐️AOP实现语法
xml方式
运行结果
注解方式
1. 注解方式装配service
2. 注解方式装配通知类(日志类)
3. 编写spring配置文件,实现包扫描和开启aop动态代理