自定义IoC&AOP框架
核心思想
IOC (Inversion of Control) 控制反转
- 创建管理对象的权利 转移给IOC容器,控制权反转
- IOC解决了对象之前的耦合问题
- 容器是一组 组件和过程的集合,包括BeanFactory,单例池,BeanPostProcessor等之间的协作
IOC 和 DI(Dependency Injection)区别
- 共同描述了对象实例化和依赖关系维护
- IOC站在对象的角度
- DI 站在容器的角度,容器把对象依赖的其他对象注入
AOP(Aspect oriented Programming)
面向切面编程,使用场景: 日志,权限校验,事务控制
横切逻辑代码,由于横切逻辑影响很多方法,最后构成面
事务
数据库事务实质是Connection的事务。事务绑定当前线程,避免拿到不同的Connection。
Spring高级应用
IOC
xml 配置
// java se
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
ApplicationContext context = new FileSystemXmlApplicationContext("/home/beans.xml");
// web,监听器加载xml
ContextLoaderListener
注解
// se
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
// web,监听器加载注解
ContextLoaderListener
BeanFactory ApplicationContext区别
顶层接口BeanFactory,ApplicationContext 是子接口
Bean标签属性
- 单例模式的bean对象⽣命周期与容器相同
- 多例模式的bean对象,spring框架只负责创建,不负责销毁。
lazy-Init 延迟加载
不想让⼀个singleton bean 在 ApplicationContext实现初始化时被提前实例化,需要时再实例化
xml
<bean id="testBean" class="cn.lagou.LazyBean" lazy-init="true" />
注解
@Lazy
FactoryBean
- Bean的类型: 普通Bean,FactoryBean
生成某一个类型的Bean实例,自定义Bean的创建过程(复杂Bean的定义)
使用场景:Spring框架⼀些组件中会使⽤,还有其他框架和Spring框架整合时使⽤
BeanFactoryPostProcessor
Bean对象实例化之后,BeanFactoryPostProcessor 做后置处理
循环依赖
定义:循环依赖其实就是循环引⽤,也就是两个或者两个以上的 Bean 互相持有对⽅
Spring中循环依赖场景有:
- 构造器的循环依赖(构造器注⼊)
- Field 属性的循环依赖(set注⼊)
循环依赖处理机制
单例 bean 构造器参数循环依赖(⽆法解决)
prototype 原型 bean循环依赖(⽆法解决)
单例bean通过setXxx或者@Autowired进⾏循环依赖(可以解决)
解决方法:
- Spring 的循环依赖的理论依据基于 Java 的引⽤传递,当获得对象的引⽤时,对象的属性是可以延 后设置的,但是构造器必须是在获取引⽤之前。
- 通过提前暴露⼀个ObjectFactory对象来完成的,放在三级缓存 singletonFactorys(未成形的Bean)
网友评论