# 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 源码解读 ```