本博客包含多个文档和书籍的翻译,但有能力者推荐阅读英文原版

Java Spring 5框架学习笔记

Coding Alan 1个月前 (06-04) 280次浏览 0个评论 扫描二维码

下载最新稳定版

https://repo.spring.io/release/org/springframework/spring/

IOC

IOC 控制反转,降低耦合度,把对象创建和对象调用都交给 Spring

IOC 底层原理:XML 解析、工厂模式、反射

Spring 提供 IOC容器的两种实现方式(接口):

  • BeanFactory:一般由Spring 内部使用;加载配置文件时不创建对象,使用时创建
  • ApplicationContext:BeanFactory的子接口,一般由开发人员使用;加载配置文件时即创建对象
    • ClassPathXmlApplicationContext
    • FileSystemXmlApplicationContext

Bean管理

  • Spring 创建对象
    Bean 属性:id(唯一标识)、class(类全路径)、name(标识,可加特殊符号,不常用)
  • Spring 注入属性
    DI 依赖注入,一种注入方式是使用 set 方法,另一种是使用配置文件

    此外还有有参构造

    p 名称空间注入,简化xml 配置

Bean管理XML方式

XML 注入其它类型属性

外部 bean

内部 bean 和级联赋值

XML注入集合属性

注入对象

集合类型提取和注入

Spring 有两种 Bean,一种是普通Bean,另一种是 FactoryBean;普通Bean 配置文件中所定义类型(class 属性)即为返回类型,工厂 Bean 可以为不同(通过实现FactoryBean接口并在 getObject 方法中定义,如下例中对 MyBean 返回 Course对象)。

Bean 的作用域:Bean 可以创建单实例或多实例,默认为单实例,通过 scope 进行设置,单实例为 singleton,多实例为 prototype

单实例、多实例通过实例化多个对象打印地址进行比对

Bean 的生命周期

  1. 通过构造创建Bean 实例(无参构造)
  2. 对 Bean 的属性设置值或对其它 Bean 的引用
  3. 调用 Bean 的初始化方法(自行配置:xml 中的init-method属性)
  4. 使用 Bean
  5. 关闭容器时,调用销毁方法(自行配置:xml 中的destroy-method属性,并且需要执行 context.close()方法)

第3步Bean 的初始化前(postProcessBeforeInitialization)后(postProcessAfterInitialization)分别有一个后置处理器

XML自动装配

根据属性名称(byName)或属性类型(byType)由 Spring 自动匹配进行注入(xml中 bean 标签添加 autowire 属性)

外部属性文件

Bean管理注解方式

格式:@注解名称(属性名称=属性值, 属性名称=属性值…)

  • @Component
  • @Service
  • @Controller
  • @Repository

通过设置use-default-filters为 false 可不使用默认的 filter(全部导入),如下例中只读取 Controller 注解的类,对应的还有context:exclude-filter用于排除规则

基于注解方式实现属性注入

  • @Autowired:根据属性类型进行自动装配
  • @Qualifier:根据属性名称进行自动注入
  • @Resource:可以根据类型,也可以根据名称进行注入
    直接使用@Resource 为按类型注入,@Resource(name = “userDaoImpl”)为按名称注入;这种方式由 JAVA 扩展包所提供,因此 Spring 官方更推荐使用上面两种
  • @Value 注入普通类型属性

完全注解开发

即不使用 XML 配置文件

AOP

面向切面编程,对业务逻辑各个部分进行隔离,降低耦合度,提高程序可重用性。

AOP底层使用动态代理:有接口时使用 JDK 动态代理,无接口使用 CGLIB 动态代理。

  • JDK 动态代理
    java.lang.reflect.Proxy: newProxyInstance,有三个参数:

    • 类加载器
    • 增强方法所在类实现的接口,支持多个接口
    • 实现接口的 InvocationHandler,创建代理对象、增强的方法

  • CGLIB 动态代理

AOP术语

  • 连接点:类中可以被增强的方法
  • 切入点:实际被增强了的方法
  • 通知(增强):实际增强的逻辑部分,有前置通知(Before)、后置通知(AfterReturning)、环绕通知(Around)、异常通知(AfterThrowing)和最终通知(After)
  • 切面:把通知应用到切入点的过程

在 Spring 框架中基于 AspectJ 实现 AOP 操作,可基于 XML配置文件实现,也可基于注解方式实现,通常使用后者。

切入点表达式语法结构:
execution([权限修饰符][返回类型][类全路径][方法名称]([参数列表])),可使用星号 * 表示所有

基于注解方式实现AOP

有多个增强类对同一方法进行增强时,可使用@Order(数字类型值)设置优化级

完全使用注解开发

基于 XML配置文件实现AOP

例创建类 Book,包含方法 buy,增强类 BookProxy 包含前置方法 before(名称可自定义),配置文件示例如下:

JdbcTemplate

配置文件:

Service

Dao

Entity

Test

查询

批量操作batchUpdate

事务操作

ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

Spring 实现事务:

  • 编程式事务管理
  • 声明式事务管理(常用)
    • 注解(常用)
    • XML

注解声明式事务管理

@Transational 注解可添加到类上,也可添加到方法上

声明式事务管理@Transational的主要参数

  • propagation:事务传播行为,即多事务之间方法调用如何管理事务
    传播行为含义
    REQUIRED如果有事务在运行,当前的方法就在这个事务内运行,否则就开启一个新的事务,并在自己的事务内运行,默认传播行为
    REQUIRED_NEW当前方法必须启动新事务,并在自己的事务内运行,如果有事务正在运行,则将它挂起
    SUPPORTS如果有事务在运行,当前的方法就在这个事务内运行,否则可以不运行在事务中
    NOT_SUPPORTED表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager
    MANDATORY当前的方法必须运行在事务内部,如果没有正在运行的事务,就会抛出异常
    NEVER当前方法不应该运行在事务中,如果有运行的事务,就抛出异常
    NESTED如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。
  • isolation:事务隔离级别
    脏读、不可重复读、虚读/幻读,MySQL中的默认隔离级别为可重复读
    隔离级别脏读不可重复读幻读
    READ UNCOMMITED
    (读未提交)
    READ COMMITED
    (读已提交)
    REPEATABLE READ
    (可重复读)
    SERIALIZABLE
    (串行化)
  • timeout:超时时间,默认值-1,不超时,单位为秒
  • readOnly:是否只读
  • rollbackFor:回滚
  • noRollbackFor:不回滚

XML 声明式事务管理

完全注解声明式事务开发

Spring5新功能

参见https://cntofu.com/book/95/33-what-new-in-the-spring-framework.md

  1. 整个Spring5框架的代码基于Java8,运行时兼容JDK9,许多不建议使用的类和方法在代码库中删除
  2. Spring 5.0框架自带了通用的日志封装;Spring5已经移除Log4jConfigListener,官方建议使用Log4j2
  3. 核心容器支持@Nullable注解
  4. 核心容器支持函数式风格GenericApplicationContext

log4j2.xml

手动输出日志

测试

 

喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址