黑马SSM学习日记 | day02
昨天学习了spring的一些基本概念,IOC,DI之类的,不过都是用的手动注入的方式,今天跟着视频学,里面说的都是全面使用注解来加快开发。
注解开发定义bean
- 在spring2.x版本中,创建bean对象需要在对应的类上添加@Component注解,但是依旧需要在xml配置文件中添加需要扫描的包。
- 在spring3.x版本中,开启了纯注解的开发模式
- 首先是,配置xml文件不再需要了,只需创建一个配置类,添加Configuration和ComponentScan(扫描包)注解
- 然后定义bean
- 可以在对应的类上添加Component或其衍生注解
- 也可以在配置类中添加bean注解创建方法返回对象
- 在启动类中添加AnnotationConfigApplicationContext(xx.class),通过读取配置类来初始化容器
- 也可以添加PropertySource注解读取properties文件,需指定位置,且不能用通配符
依赖注入
引用类型注入
- 在需要注入对象的地方,使用autowired自动装配,不再像以前需要在xml文件中配置。
- Autowried不创建对象,只是注入对象,对象是由是spring容器创建的
- Autowired通过反射设置字段值,包括自由字段,不需要setter方法
- 自动装配默认使用无参构造器
第三方bean管理
- 在使用第三方bean注入的时候,我们无法在其源代码上添加Component注解,但是可以让其通过方法参数的形式注入,但是也要添加bean注解。
- 如果是简单类型的话,就直接使用value注入,一般和properties文件配合使用
spring整合mybatis
在未整合之前,要是mybatis是咋样的:
- 在未整合之前,使用mybatis需要手动创建SqlSessionFactory,还要自己管理事务,new SqlSession对象之类的,但是在spring整合mybatis之后,这些都由spring的替程序员做了,但是数据库连接的必要信息还是需要我们自己填写。SqlSessionFactoryBean就是在帮我们创建SqlSessionFactory,然后创建SqlSession对象,MapperScannerConfigurer是用来扫描mapper接口,注册到Spring容器中去的
整合之后,使用mybatis就只需要创建SqlSessionFactoryBean和MapperScannerConfigurer(都添加bean注解,交由容器管理),以及配置一些基本连接信息即可,总体看来,大大提升了开发速度。
SpringAOP
AOP
- 一种编程思想,面向切面编程,目的是在不侵入原代码的前提下增强代码功能
- aop底层是基于代理实现的,spring帮我们创建了代理对象,然后调用增强方法和原方法,实现方法增强
基础概念
- 连接点:在springaop中理解为,方法的执行
- 切入点:理解为需要实现增强的原方法
- 通知:springaop理解为具有功能的增强方法
- 通知类:定义通知的类
- 切面:描述切入点与通知的关系
操作
创建好通知类->定义好切入点和通知->绑定两者->添加注解让spring扫描该类,并当作切面;最后在配置类中添加切面自动代理的注解
通知类型
- 通知类型有五种,其中最重要的是环绕类型@Around。
- 利用ProceedingJoinPoint的proceed才能执行原始方法,且返回值要和原方法匹配
- 在这个AOP的过程中也可以获取方法名、方法参数、返回值等等
Spring事务
- spring事务有两种情况是默认回滚的,一种是RunTimeException,一种是Error;
- 如果要添加回滚的异常情况的话,就需要添加rollBackFor注解来指定报错类型
- 要让事务启用,需要在方法或类上添加Transactional注解,并在启动类上添加启用事务注解。
- 在涉及到多个事务的时候,如下的情况,这几个事务就需要事务传播行为来控制。
- 默认是REQUIRED,意为如果调用方法有事务,那么被调用方法的事务就加入调用方法的事务;如果没有就新建一个事务
- REQUIRED_NEW,意为不管调用方法是否有事务,被调用方法都会开启新事物。如果调用方法有事务,会先挂起该事务,等新事务完成之后再恢复。两个事务完全独立
@Service
public class OrderService {
@Transactional
public void createOrder() {
// 创建订单
orderDao.insert(order);
// 扣减库存
inventoryService.deductStock(); // 这个方法也有 @Transactional
// 记录日志
logService.addLog(); // 这个方法也有 @Transactional
}
}
总结心得
今天学的昏昏的,感觉一堆东西听不懂,mybatis 动态代理等等,但最终还是看文章和问AI啃下来了,只能说看明白是什么为什么要这样做,但涉及到底层的理论还得再加深,真的不想看源码啊啊!感觉现在这些东西就是在把我之前只会用的东西的机制解释了一下,之前我只会autowired,但是不清楚这个autowired背后的系列操作,容器 bean对象创建等等。。。还是学到了一些东西的,继续加油吧!!!
