注解 替代 xml 标签
传统web开发的困惑
-
层与层之间耦合比较紧密,比如业务里面创建数据库对象,操作
-
通用的事务功能耦合
解决思路:找第三方创建对象
beanfactory快速入门
bean工厂
在beans.xml中配置bean,bean的id还有class
然后创建工厂对象,读取xml,获取对应id的bean
DI 依赖注入,添加setUserDao接收注入的对象,修改beans.xml,在配置set的名称
ApplicationContext 快速入门
bean容器
封装了beanfactory,更后期的接口
拓展了beanfactory,拓展了监听功能,国际化功能等
又继承了bf,又维护了bd的引用
区别
原始bf:在getbean的时候,才会创建bean对象
ac,容器一创建,就讲bean都实例化并初始化好
常用Application,
- ClassPathXmlApplication
- FileSystemXml
- Annotation
基于XML方式Bean的配置
默认使用id,然后就是name,最后才是全限定名。没有id的话,name的第一个就是id
scope类型为singleton,单例模式,加载完配置文件创建后一直在,如果为prototype,那就是getbean才创建,不会存到单例池
lzay-init ,get的时候创建,然后放到单例池
创建方法,销毁方法
指定关闭方法
另一种初始化方法,实现InitializingBean接口
实例化-》属性设置-》afterpropertieseSet-》初始化方法
bean实例化流程
spring的bean工厂后处理器
bean的生命周期
实例化 将singleton的bean通过反射进行实例化
初始化 对bean实例的属性进行填充,以及执行Aware接口方法,执行BeanPostProcessor方法,执行InitializingBean接口的初始化方法,执行自定义初始化init方法等
完成阶段 存储到单例池 singletonObjects中
初始化阶段
循环依赖问题
简单来说就是 A依赖B,B依赖A。
就是使用三级缓存方案,完整的bean存到一个位置,半成品的bean存到一个位置
singletonObjects,一级缓存,完整Bean
earlySingletonObject,二级缓存 ,被引用的半成品
singletonFactory,三级缓存,未被引用
生命周期
标签与注解对应
下面三个实质上就是component,名字不同,好区别不同层
一般使用Autowired,优先根据类型,次根据名称
Resource使用很少
如果注解加在字段上,通常Autowird和Qualifier配合使用,解决有多个同类型bean的问题
如果加在方法参数上,可以省略Autowired
AOP
AOP配置的两种语法:
advisor,通过实现接口来确认通知的类型
aspect,通过配置确认通知的类型,更加灵活
基于AOP的声明式事务控制
以转账为例
编程式事务控制: 在转账方法中,手动管理事务,开始时调用connection.setAutoCommit(false),执行扣款和入账操作后,根据结果决定调用commit()或rollback()。
try {
connection.setAutoCommit(false);
// 扣款操作
// 入账操作
connection.commit();
} catch (Exception e) {
connection.rollback();
}
声明式事务控制: 通过@Transactional注解管理事务,无需手动控制。
@Transactional
public void transferMoney(Account from, Account to, BigDecimal amount) {
// 扣款操作
// 入账操作
}