# SpringDemo
**Repository Path**: sanwen87/spring-demo
## Basic Information
- **Project Name**: SpringDemo
- **Description**: Spring入门基础
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-04-14
- **Last Updated**: 2022-08-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 目录
## 说明
```
demo01-demo19 和 dbpool 基于Spring 5.2.15.RELEASE
AnnotationDemo - AnnotationDemo 基于Spring 4.3.28.RELEASE
https://www.bilibili.com/video/BV1W7411R74F?p=1
```
## dbpool01
```
c3p0数据库连接池演示
```
## dbpool02
```
druid数据库连接池演示
```
## dbpool03_JDBCTemplate
```
JDBCTemplate 使用详解
```
## demo01
```
注册驱动的耦合性介绍
Class.forName("com.mysql.jdbc.Driver") --解耦
DriverManager.registerDriver(new com.mysql.jdbc.Driver()) --耦合度高
```
## demo02
```
BeanFactory 自定义工厂生成 Bean
```
## demo03
```
两种容器的区别:
ApplicationContext容器在创建时就把Bean给创建了,这点不同于BeanFactory容器
两种容器的源码探究分析(基于xml配置文件方式)
```
## demo04
```
spring入门首次引入注解使用案例、通过beans.xml配置文件配置扫描标注注解的Bean类。
Spring的IOC底层是如何将依赖的对象注入进来的- 源码探究(基于注解研究源码)。在demo02中我们自己实现注入并不成功。
```
## demo05
```
beans.xml 中配置了数据源,Dao层使用注解注入 数据源相关对象。 达到xml配置和注解混合使用目的。
```
## demo06
```
1、完全舍弃beans.xml 配置文件,使用SpringConfiguration 和 JdbcConfiguration配置类代替了配置文件,在创建容器时,
采用的是AnnotationConfigApplicationContext方式。
2、Spring整合Junit,为Junit提供的 SpringJUnit4ClassRunner
```
## demo07
```
在此案例之前的所有案例,操作数据库的事务都是绑定在Dao层,java.sql.Connection创建并绑定一个和数据库连接会话事务。
但是,我们的业务可能需要很多的业务逻辑绑定在一个事务中,因此,绑定在Dao层面的事务是不行的,需要在Service层面绑定事务。
因此就产生了 ConnectionUtil 这个工具类,用于将一个业务里面的逻辑绑定在一个和线程相关的Connection连接上。
```
## demo08
```
动态代理实现事务控制演示:
后期会有通过spring的AOP实现事务控制的版本演示
通过 BeanFactoryProxy 这个Bean的代理工厂生成支持事务的Bean对象,内部通过动态代理,
将事务逻辑封装起来,从而达到解耦业务层业务逻辑与事务逻辑。
```
## demo09
```
基于xml的AOP测试
```
## demo10
```
基于xml的AOP 前、后、异常、最终的四种通知演示
```
## demo11
```
基于xml的AOP 环绕通知演示
```
## demo12
```
基于注解的AOP演示
* 本示例会演示方式1这种情况:
* 方式1.容器通过beans.xml配置启动,AOP通过注解实现
* --扫描Bean组件让Spring管理
* --开启注解AOP功能
* Logger通知类上标注@Component、@Aspect --分别代指这是一个组件和切面
*
* 方式2.容器和AOP都通过纯注解实现
* 删除beans.xml
* 在我们自己的SpringConfiguration类上标注注解@EnableAspectJAutoProxy --开启注解AOP功能
* Logger通知类上注解同方式1.
```
## demo13
```
JdbcTemplate的使用
案例demo07使用dbutils工具类,允许外界提供Connection连接对象来对事务控制
runner.query(connectionUtil.getThreadConnection(),
"select * from tb_account where name=?",
new BeanListHandler(Account.class), accountName);
案例demo13使用jdbctemplate工具类,没有允许从外界传递Connection连接对象的机会,是如何做到事务控制的?
jdbcTemplate.query("select * from tb_account where id=?", new BeanPropertyRowMapper(Account.class), 1);
上面的疑问,可以私下读读源码,看看Spring是如何解决的。
```
## demo14
```
通过spring的AOP实现事务控制的演示 - 基于xml + dbutils
```
## demo15
```
通过spring的AOP实现事务控制的演示 - 基于注解 + dbutils
```
## demo16
```
Spring 声明式事务控制环境搭建
1、Spring自己也提供了事务管理器-PlatformTransactionManager(替代我们自己的txManager)
2、Spring的事务管理器也是基于AOP的,只不过是人家自己写的AOP,它既可以使用编程方式实现,也可以使用配置的方式实现。
3、Spring的声明式事务控制相关的API都在tx包中
4、PlatformTransactionManager:规约了commit() 和 rollback(),是Spring的声明式事务管理器,管理TransactionDefinition。
5、DataSourceTransactionManager实现了上面的规约接口
6、TransactionDefinition代表Spring的事务,里面定义了事务名称,隔离级别,传播行为,超时时间,是否只读等
7、事务隔离级别:反映事务提交并发访问时的处理态度
7.1、ISOLATION_DEFAULT: 默认级别,归属下列某一种(Spring使用数据库默认类型)
7.2、ISOLATION_READ_UNCOMMITTED:可以读取未提交数据
7.3、ISOLATION_READ_COMMITTED:只能读取已提交数据,解决脏读问题(Oracle默认级别)
7.4、ISOLATION_REPEATABLE_READ:是否读取其他事务提交修改后的数据,解决不可重复读问题(MySQL默认隔离级别)
7.5、ISOLATION_SERIALIZABLE:是否读取其他事务提交添加后的数据,解决幻读问题
8、事务的传播行为
8.1、REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)
8.2、SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
9、事务具体的运行状态
9.1、void flush() -刷新事务
9.2、boolean hasSavepoint() -获取是否存在存储点
9.3、boolean isCompleted()获取事务是否完成
9.4、boolean isNewTransaction()获取事务是否为新事务
9.5、boolean isRollbackOnly() 获取事务是否回滚
9.6、void setRollbackOnly()设置事务回滚
```
## demo17
```
Spring 声明式事务控制 - 基于xml配置实现
```
## demo18
```
Spring 声明式事务控制 - 事务基于注解配置实现,IOC基于xml配置
```
## demo19
```
Spring 声明式事务控制 - 纯注解版实现
/**
* Spring纯注解版事务演示
* 1、主配置类开启Spring扫描业务包 @ComponentScan("com.sann.demo")
* 2、主配置类上引入数据源配置文件和事务相关配置文件 @Import({JdbcConfig.class, TransactionConfig.class})
* 3、主配置类上开启事务支持 @EnableTransactionManagement
* 4、数据源配置文件里面配置 DataSource和JdbcTemplate对应Bean,注入容器
* 5、事务相关配置文件里面配置事务管理器PlatformTransactionManager并注入容器
* 6、业务层需要事务支持的方法或者类上标注事务注解 @Transactional
*/
```
## AnnotationDemo
```
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MainConfig.class)
@Autowired
ApplicationContext context; --测试类由以上两个注解,之后就可以这样自动注入Spring上下文环境进行测试
@Configuration + @Bean 配置要注入Spring的Bean
@ComponentScan 指定位置扫描Spring的基本注解入Spring容器
```
## AnnotationDemo02
```
@Conditional 注入前先条件判断,符合条件的注入容器
@Import 快速注入第三方Bean入Spring容器
1、默认通过指定的字节码,注入该字节码对应的Bean
2、指定实现ImportSelector的选择器类字节码,注入该选择器返回的Bean
3、指定实现ImportBeanDefinitionRegistrar的注册器类字节码,注册该注册器注册的Bean
4、通过FactoryBean 工厂注入Bean
```
## AnnotationDemo03
```
Bean 生命周期演示:
@Bean(initMethod = "init", destroyMethod = "destroy") --指定初始化和销毁方法
public Car car(){
return new Car();
}
@Component -- 组件实现初始化和销毁接口
MyBean implements InitializingBean, DisposableBean
@Component --组件添加JSR250规范注解
public class Dog {
@PostConstruct
public void init(){
log.info("Dog @PostConstruct 初始化方法被调用......");
}
@PreDestroy
public void destroy(){
log.info("Dog @PreDestroy 销毁方法被调用......");
}
}
@Component --组件实现Bean后置处理器
MyBeanPostProcessor implements BeanPostProcessor{
}
```
## AnnotationDemo04
```
@Configuration
@PropertySource("classpath:/pro.properties") // 加载配置文件资源
public class MainConfigOfPropertyValue {
```
## AnnotationDemo05
```
BeanPostProcessor 源码解读
```