Spring Framework系统框架

该框架是Spring4版本官网公布的,现在Spring已经是5版本,但是官网没有更新最新的系统结构图。

学习顺序是1-2-3-4

学习路线

本套课程的学习路线

视频链接:黑马程序员2022版SSM

核心概念

IOC入门案例

DI入门案例

applicationContext.xml

1.导入Spring的坐标 Spring-context

2.配置bean

3.获取IOC容器

4.获取bean

5.删除业务层中使用new的方式创建的dao对象

6.提供对应的set方法

总结分析:

Bean的基础配置

bean的别名配置

bean作用范围配置

spring创建的bean默认是一个单例实例。类似于new的对象都是一个对象,内存地址都一样

用scope可以配置 是否单例

表现层对象:servlet

业务层对象:service

数据层对象:dao

工具对象:util

封装实体的域对象:domain

Bean实例化(3种)

构造方法

静态工厂

需要在配置文件种指名工厂类和创建bean的方法

实例工厂与FactoryBean

FacotryBean

bean的生命周期

依赖注入DI

setter注入

构造器注入

总结

依赖自动装配

集合注入

案例-数据源对象管理

德鲁伊连接池和C3P0连接池的poml配置和application-context.xml配置

加载Properties文件

添加命名空间

xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
"

application-context.xml配置文件

jdbc.properties文件

注意点

1:system-properties-mode=“NEVER” 就不会和系统冲突,系统优先级更高

2:读取当前工程中多个properties文件

3:读取当前工程中自己设置的properties文件以及加载的jar包中的properties文件

总结

容器

按照bean类型获取bean只能对应一个,否则会报错

核心容器总结

注解开发

1:@Component
    代替Spring-application.xml核心配置文件中的<bean>标签中的类

2:@Controller、@Service、@Repository是@Component的衍生注解

   @Contorller:用于表现层bean定义
   @Service:用于业务层bean定义
   @Repository:用于数据层bean定义

Spring3.0版本之后支持了纯注解开发,使用java类代替配置文件,开启了Spring快速开发的模式

在一个类中,
@Configuration:表示这个类代替了application.xml配置
@ComponentScan({"",""}):表示<context:component-scan>扫描的依赖包

注解开发bean作用范围和生命周期

@Scope("singleton"):表示创建的bean是单例模式的
@Scpoe("prototype"): 表示创建的bean不是单例的

@PostConstruct: 构造方法后
@PreDestroy: 销毁前

注解开发依赖注入

注解开发管理第三方bean

下面是上面的优化,上面会导致配置类臃肿,所以建议需要什么配置就写一个配置类,然后使用@Import()注解来导入给SpringConfig类

注解开发为第三方bean注入资源

注解开发总结

AOP

连接点:所有方法

切入点:哪些方法需要追加功能的,匹配通知的方法,叫切入点

通知:各个方法共用的功能,叫通知。通知存在于通知类中。

切面:切面描述的是通知共用的功能与所对应切入点的关系。在哪些切入点上执行哪些通知叫切面

AOP入门案例

1:pom.xml中导入坐标

3:制作共性功能,通知

4:定义切入点
  在通知类中,定义一个空的private方法,在其上添加注解@Pointcut("execution(返回值类型 包名.类.方法)")

示例:
@Pointcut("execution(void com.itheima.dao.BookDao.update())")
private void pt(){}

在通知方法上,使用注解@Before("pt()")表示在pt()方法指向的切入点(com.itheima.dao.BookDao.update())之前执行。

5: 添加@Component 表示将该bean交给Spring
   添加@Aspect 表示该为AOP切面

6:在配置类中添加@EnableAspectJAutoProxy注解 

@EnableAspectJAutoProxy 启动了@Aspect 中的功能
@Aspect的功能是将切入点 通知定义好了

入门案例总结

AOP工作流程

1: Spring容器启动
2:读取所有切面配置中的切入点
  (截图中黄色部分,虽然ptx()方法也做了切入点@Pointcut,但是下面并没有声明通知类型 
   比如 @Before("方法()"))

AOP切入点表达式

AOP通知类型

环绕通知

返回后通知:发生异常之后,不会运行

写一个通知类的步骤

1: @Component
2: @Aspect
定义的一个通知类

3: @Ponitcut("execution(返回值类型 包.方法(参数))")
定义的通知空方法

4:@Around("类名.通知空方法()")
定义加强的通知方法
public Object runSpeed(ProceedingJoinPoint pjp){

    Objection ret = pjp.proceed();
    return ret;
}

AOP通知获取数据

//注解中的returing和形参需要保持一致
@AfterReturing(value = "pt()",returing="ret")
public void afterReturning(String ret){

}

案例-百度网盘密码数据兼容处理

AOP总结

Spring事务简介

事务:可以简单理解为对一个数据进行增删改,要么成功然后数据变化,要么失败数据保持不变。

不理解的,可以继续看数据库相关的讲解。

Spring开启事务,使用注解版本,需要三步
1:定义的service接口的方法,添加@Transactional注解
2:在jdbcConfig.java配置类中,设置事务管理器 DataSourseTransactionManager
3:在SpringConfig.java中,开启注解式事务驱动。@EnableTransactionManagement

Spring事务角色

一开始outMoney和inMoney各自有一个事务,transfer()方法也有一个事务。一共三个事务。

加入spring管理之后,spring将transfer()方法的事务 管理outMoney 和 inMoney .

事务属性

rollbackFor={NullPointExecption.class} 表示遇到了NullPointExection异常,会开启事务。

添加了propagation=Propagation.REQUIRES_NEW,