文章目录
前言
- 直接截图,不用自己一个一个敲,怎么快怎么来,然后代码项目,自己把他注释掉,自己在敲一遍。
其他
Spring加载properties
替换配置中value值,从properties中进行读取。
- 按照下述最标准的格式进行书写,可以同时类路径下方的所有的文件
**<context:property-placeholder location="classpath😗.properties" system-properties-mode="NEVER"/>*
- 创建对应的properties
- 在配置中申请一个新的命名空间context
- 直接复制对应的两行,然后修改对应关键字即可
- 使用属性占位符读取properties中的属性
- 使用和properties同样名称的jdbc进行索引即可
- 运行效果如下
容器
创建容器
获取bean
BeanFactory
- BeanFactory是ApplicationContext最顶级的接口 ,创建对象全是延迟加载
容器总结
- 容器接口
-
Bean相关
-
注入相关
注解
注解开发对定义bean
- 衍生注解
纯注解开发
- 使用congfig类替代配置xml
- 创建容器的方式也改变了,是通过注解创建容器,不是通过配置创建的容器的。
Bean管理
Bean作用范围
Bean生命周期
注解开发依赖注入
- 使用注解进行自动装配
- 简单类型如何进行注入
- 如何加载外部的properties中的属性值
第三方bean管理
第三方bean管理
- 使用独立的配置类加入核心配置
第三方bean注入
注解开发总结
Spring整合
整合mybatis
- 核心对象是SqlSessionFactoryBuilder,这个工厂用来用来创建不同的session链接,主要设置来自于配置文件
- Mybatis主要是负责SqlSessionFactory对象的
整合Junit
AOP
AOP核心概念
- 面向切面编程,Aspect Oriented Programming,面向切面编程,一种编程范式,知道开发者组织程序结构
- 作用 :在不惊动原始设计的基础上,为其进行功能增强。
- Spring理念:无入侵式编程,并没有改变代码,但是代码的功能发生了变化
具体概念如下
AOP入门案例
- 结合之前的代码进行分析,主要是制作共性功能,也就是通知类和通知的制作
- 具体定义流程
AOP工作流程
- 获取bean执行方法
- 获取bean,调用方法并执行,完成操作
- 获取的bean是代理对象时
AOP核心概念
-
目标对象:
- 原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的
-
代理
- 目标对象无法直接完成工程,需要对其进行功能回填,通过原始对象的代理对象实现。
代理模式补充
设计模式
- 开闭原则
- 对扩展开放,对修改关闭
- 里氏替换原则
- 调用一个父类的方法可以成功,那么替换成子类的调用也应该可以完全成功
结构型模式
接口模式
- 如果要求传入的接口是A接口,但是传入的是B接口,需要创建一个能够将B接口转为A接口的东西。
- 这里是想用线程调用接口runnable的,但是这里实现的是callable接口,就需要创建一个类,将callable转成runnable。
- 下述是实现了runnable接口,然后转成在run函数里面调用了runnable接口的call函数
代理模式
- 调试器是将接口A转成接口B,但是代理模式是在接口A外面再套一层壳,为了执行权限检查等特定功能
- 下述就是对接口A增加了权限检查的功能
- 编程原则:
- 职责清晰:一个类只负责一件事
- 易于测试:一次只检查一个功能
c
public class AProxy implements A {
private A a;
public AProxy(A a) {
this.a = a;
}
public void a() {
if (getCurrentUser().isRoot()) {
this.a.a();
} else {
throw new SecurityException("Forbidden");
}
}
}
常见的代理方式
-
远程代理
- 本地的调用者持有的接口实际上是一个代理,这个代理负责把对接口的方法访问转换成远程调用,然后返回结果。Java内置的RMI机制就是一个完整的远程代理模式。
-
虚代理
- 它让调用者先持有一个代理对象,但真正的对象尚未创建 。如果没有必要,这个真正的对象是不会被创建的,直到客户端需要真的必须调用时,才创建真正的对象。
- JDBC的连接池返回的JDBC连接(Connection对象)就可以是一个虚代理,即获取连接时根本没有任何实际的数据库连接 ,直到第一次执行JDBC查询或更新操作时,才真正创建实际的JDBC连接
后面有点负责,不过先跳过,先弄明白这章再说
AOP切入点表达式
语法格式
- 下述是两种写法,一种是接口写法,还有一种是实现类的写法
- 下述.是零个或者多个,但是*是必有一个
- 第三种子类说明是不常用的
- 书写技巧
- 切入点描述通常使用接口,主要是为了降低耦合性,不要指定具体的描述类
AOP的通知类型
- 重点是环绕通知around,通过该通知能够实现前置通知和后置通知。
- 必须要增加对于原始方法的调用,实现隔离操作。
- 因为没有办法预知原始方法是否会抛出异常,所以需要处理异常。
测量业务层接口万次执行效率
- 在cofig中摊开AOP的注解文件
- 创建对应的AOP文件,同时定义方法
- 这个方法有一个问题,就是没有办法根据输出定位到具体的方法,所以需要输出具体around方法的名称。
- 最终修改如下
AOP通知获取数据
获取参数
使用before获取参数,传入JointPoint对象,进行获取
c
@Before("pt()")
public void before(JoinPoint jp){
Object[] args = jp.getArgs();
System.out.println(Arrays.toString(args));
System.out.println("before advice...");
}
输入校验
- 可以获取参数,并进行检查,然后对参数进行处理,不需要对于每一个参数都执行相应的操作
c
@Around("pt()")
public Object around(ProceedingJoinPoint pjp) {
Object[] args = pjp.getArgs();
System.out.println(Arrays.toString(args));
args[0] = 666;
System.out.println(Arrays.toString(args));
Object ret = null;
try {
ret = pjp.proceed(args);
} catch (Throwable t) {
t.printStackTrace();
}
return ret;
}
获取返回值
- 下述参数比较特殊,需要在配置中进行说明
- 第一个参数必须是JointPoint
- 第一个参数必须是JointPoint
获取异常
案例------百度网盘密码数据兼容处理
AOP总结
- 切入点的描述
- 切入点描述的技巧
- 通知的五种类型
- 获取参数的相关方法
Spring事物
Spring事物简介
设置方法
- 声明事物的属性
- 定义事物管理器
- 外部资源注入
- 到spring的配置文件中,使用注解注入
方法总结
Spring事物角色
Spring事物属性
事物配置
- 默认一般只有运行时异常才会回滚,其他不会回滚,所以需要加上
实例:转账业务追加日志
事物传播行为