
Spring
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,