spring笔记
spring全家桶:spring springmvc springboot等等…
spring存在两大核心对象IOC,AOP
IOC(inversion of control)
控制反转 是一个理论概念或者思想
描述的是:把对象的创建,赋值,管理工作都交给代码之外的容器实现
也就是对象的创建时有其他外部资源完成
控制:创建对象 对象的属性赋值 对象之间的关系管理
反转:把原来的开发人员管理和创建对象的权利转移给代码之外的容器实现,由容器代替开发人员管理对象,创建对象,给对象赋值
正转:由开发人员在代码中使用new构造方法创建对象 开发人员主动管理对象
容器:可以是一个服务器软件 也可以是一个框架 spring就是一个容器
为什么使用ioc
目的是减少对代码的改动,也能实现不同的功能,实现解耦合
IOC技术实现
DI就是IOC技术的实现
DI(dependency injection):依赖注入只需要在程序中提供要使用的对象名称就可以了,只与对象如何在容器中创建,渎职,查找 都是容器内部自己帮你实现的 不需要你管理
spring就是使用的di实现的IOC功能 spring底层创建对象 使用的是反射机制
使用注解的di:通过注解完成java创建对象 属性赋值
di实现的两种方式:
1.在spring的配置文件中 使用标签和属性完成 叫做基于xml的di实现
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="MyStudent" class="com.one.service.bao3.Student" autowire="byName">
<property name="name" value=""/>
<property name="age" value="20"/>
</bean>
<bean id="school"class="com.one.service.bao3.school">
<property name="name" value=""/>
<property name="address" value=""/>
</bean>
</beans>
将对象在xml中完成创建赋值 id是唯一标识 class是你要赋值的对象
autowire是当你对象存在引用类型时添加的 比如 学生引用学校
需要添加引用类型注入 将两个简单类型关联
2.使用spring中的注解 完成属性的赋值 叫做基于注解的di实现
di语法分类:
1.set注入(设值注入):spring调用类的set方法 在set放可以实现属性的赋值
2.构造注入 spring调用类的有参数构造方法 创建对象 在构造方法中完成赋值
使用步骤:
1.加入maven依赖 关于spring的依赖
2.在类中加入spring注解 不同的地方使用不同的注解
3.在spring的配置文件中 加入一个组件扫描器的标签 用来说明注解在你的项目中的位置
常用注解:
1.@Component
2.@Respotory
3.@Service
4.@Controller
5.@Value
6.@Autowired
7.@Resource
AOP
1.动态代理:
jdk动态代理 时使用proxy method InvocationHandler创建代理对象
jdk动态代理需求目标类必须有实现接口
cdlib动态代理:属于第三方工具 创建代理对象 原理是继承 通过继承目标类 创建子类 子类就是代理对象 需求目标类不能是final的 方法也不能是final
动态代理作用:
1.在目标类源代码不改变的情况下 增加功能
2.减少代码的重复
3.专注业务逻辑代码
4.解耦合 让你的业务功能和日志 事务非业务功能分离
aop面向切面编程
基于动态代理实现 可以使用以上两种代理方式
aop就是动态代理的规范化 把动态代理的实现步骤方式都定义好了让开发人员用一种统一的方式就是用的动态代理
切面:给你的目标类增加的功能就是切面 像是日志 事务都是切面
切面的特点:一般都是非业务方法 独立使用的
oop:面向对象编程
怎么理解面向切面的编程?
1.需要在分析项目的功能是 找出切面
2.合理的安排切面的执行时间 (在目标方法前 还是目标方法后)
3.合理的安排切面的执行的位置 在哪个类 哪个方法增加的增强功能
切面三要素
1.切面的功能代码 切面用来干什么
2.切面的执行位置 使用point表示切面执行的位置
3.切面执行时间 使用advice表示时间 在目标方法之前还是之后
术语
1.aspect 切面
2.joinpoint 连接点 连接事务方法和切面位置 就某类的中业务方法
3.pointcut 切入点 指多个连接点方法的集合 多个方法
4.目标对象 给那个类的方法增加功能 这个类就是目标对象
5.advice 通知 通知表示切面功能执行的时间
AOP实现
aop是一个规范 是动态代理的一个规范 一个标准
aop技术的实现框架:
1.spring:spring内部实现了aop规范化 但是我们项目中一般不使用spring的aop实现 因为这不内置的比较笨重
2.aspectj 一个开源的专门做aop的框架 spring继承了aspectj框架
实现方法:1.使用xml 2.注解 常用
学习aspectj框架的使用:
1.切面执行时间 advice
常用注解:
1.@Before 在方法执行前加入的切面
2.@AfterReturning 后置切面 在方法执行以后运行的切面
3.@Around 环绕切面 类似于jdk的动态代理里面的 InvocationHandler
4.@AfterThrowing 抛出异常
5.@After 最终切面 在后置切面还要往后的地方执行的注解
执行步骤:
1.创建maven项目
2.加入依赖
3.创建目标类 接口 和他的实现类
要做的事:给类中方法增加功能
4.创建切面类:本质就是一个普通类
1.在类的上面加@aspect
2.在类中定义方法 方式就是切面要执行的功能代码
在方法的上面加入aspectj中的通知注解例如:@before
需要执行切入点表达式execution()
5.创建spring的配置文件 声明对象 把对象交给容器管理
声明对象使用注解或者xml
1.声明目标对象
2.声明切面对象
3.声明aspectj框架中的自动代理生成器标签
自动代理生成器:用来完成代理对象的自动创建功能
6.创建测试类:从spring中获取到目标对象 执行方法