spring小结
1. 什么是spring
- 是一个框架,核心技术是ioc,aop,实现解耦合。
- spring是一个容器,容器中存放的是java对象,需要做的是把对象放入到容器中。
2. 怎么使用spring
- spring是一个容器,把项目中用的对象放入到容器中
- 让容器完成对象的创建,对象之间关系的管理(属性赋值)
- 我们在程序中,从容器中获取要使用的对象
3. 怎么样的对象放入容器中
dao
类,service
类,controller
类,工具类- 使用xml配置文件,使用
<bean>
- 注解
- 使用xml配置文件,使用
- spring中的对象默认都是单例的,在容器中叫这个名称的对象只有一个
4. 不放入到spring容器中的对象
- 实体类对象,实体类数据来自数据库
servlet
,listener
,filter
等
5. 使用spring框架的步骤
加入依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.5.RELEASE</version> </dependency>
创建类:接口,实现类,没有接口的类
创建spring的配置文件,使用
<bean>
声明对象我们使用容器中的对象,通过
ApplicationContext
接口和它的实现类ClassPathXmlApplicationContext
的方法getBean()
6. 核心技术
ioc
:控制反转- 理论,思想,概念:指导开发人员在容器中,代码之外管理对象,给属性赋值,管理依赖
ioc
技术实现使用的di
(依赖注入):开发人员在项目中只需要提供对象的名称,对象的创建、查找、赋值都由容器内部自己实现spring使用的
di
的技术,底层使用的是反射机制di
给属性赋值:- set注入:spring调用类的set方法实现属性赋值
- 简单类型的set注入,
<property name="属性名" value="属性的值"/>
- 引用类型的set注入,
property name="属性名" ref="bean的id"/>
- 简单类型的set注入,
- 构造注入:spring调用有参数构造方法
<constructor-arg>
的name属性,name表示构造方法的形参名<constructor-arg>
的index属性,index表示构造方法形参的位置,从0开始
- set注入:spring调用类的set方法实现属性赋值
aop
:面向切面编程- 底层是动态代理
- jdk动态代理
- 使用jdk反射包中的类实现创建代理对象的功能
- 要求:目标类必须实现接口
- cglib动态代理
- 使用第三方的工具库,实现代理对象的创建
- 要求:目标类必须能够继承,不能是final
- 原理:就是继承,子类就是代理
- jdk动态代理
- aop:看作是动态代理的规范化,把实现动态代理的步骤进行了一个规范,定义
- aop作用:
- 在目标类不修改源代码的情况下,增加功能
- 减少重复的代码
- 专注业务功能的实现
- 解耦合:业务功能和日志,事务这些非业务功能的耦合
- 什么时候考虑使用aop技术
- 当你要给一个系统中存在的类修改功能,但是原有类的功能不完善,但是你还有源代码,使用aop增加功能
- 要给项目中的多个类,增加一个相同的功能,使用aop
- 给业务方法增加事务,日志输出
- aop的实现框架
spring
实现了aop,实现方式是接口aspectj
框架- 使用注解可以实现aop的功能
- 使用xml配置文件中的标签实现aop功能
- aop中的概念
aspect
:切面,表示给业务方法增加的功能,一般日志输出,事务,权限检查等是切面pointcut
:切入点,是一个或多个JoinPoint
的集合,表示切面功能执行的位置advice
:通知,也叫增强,表示切面执行的时间,在方法前,方法后等等
aspectj
框架的使用- 表示切面的执行时间,使用的通知注解
@Before
:前置通知,在目标方法之前先执行切面的功能@AfterReturning
:后置通知,在目标方法之后执行的,能够获取到目标方法的返回值@Around
:环绕通知,在目标方法前和后都能增强功能,控制目标方法的访问,修改返回值@AfterThrowing
:异常通知,在目标方法抛出异常后执行的通知@After
:最终通知,总是会被执行的代码@Pointcut
:定义和管理切入点的辅助注解- 代理的使用方式
- 如果目标类有接口,框架使用jdk动态代理
- 如果目标类没有接口,默认使用的cglib动态代理
- 有接口也可以强制使用cglib动态代理
- 表示切面位置的切入点表达式:
execution(访问修饰符 返回值 包名.类名.方法名称(方法的参数) 异常)
- 表示切面的执行时间,使用的通知注解
- 底层是动态代理
spring整合mybatis
整合的想法:使用spring的ioc核心技术,把mybatis框架中使用的对象交给spring统一创建和管理。spring是容器,存放你项目中要是用的各种对象,例如Service对象,Dao对象,工具类对象等等。
交给spring的mybatis对象
数据源DataSource,使用阿里公司的
Druid
连接池SqlSessionFactory对象,使用的
SqlSessionFactoryBean
在内部创建的SqlSessionFactoryDao代理对象,使用的
MapperScannerConfigurer
,在这个类的内部,调用getMapper()
,创建接口的Dao对象
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!