自定义spring框架
1. 传统业务编码方式的缺点
1. 对象的创建和对象的使用强耦合,违反了对修改封闭,对扩展开放的封闭原则,代码可扩展性变差
1. spring引入了IOC和DI,解决了对象创建的问题
1. IOC:对象使用者将对象创建的权力移交给框架
2. DI: 框架在创建对象的过程中自动完成对象属性的装配
2. java面向对象编程的三大特性,封装、继承、多态使JAVA代码衍生了面向接口编程的纵向代码结构,但是对于通用的功能,如事务,日志等,存在重复编码的缺点
1. spring引入AOP横切解决通用功能的融入问题,AOP的实现方式为动态代理
2. 自定义spring框架的思路
1. IOC的实现,启动时即通过配置文件定义到需要创建对象的类,使用单例模式创建对象后放入全局map
2. 配置文件中定义id和类的全路径名,通过反射生成对象,构建id-object的k-v结构存入map
springIOC高级特性与源码解析
1. beanFactory和ApplocationContext的关系
1. 这两个类都是描述容器对象的,其中beanFactory是容器的顶级接口,定义了容器的规范
2. applicationContext是具体实现,分为多种实现模式,对应多种启动容器和创建bean的方式
2. springIOC容器启动的三种方式
1. 纯xml模式,使用ClassPathXmlApplicationContext/FileSystemXmlApplicationContext来加载xml文件并解析
2. xml+注解模式,xml文件中声明需要扫描的注解包
3. 纯注解模式,使用AnnotationConfigApplicationContext来加载配置类,并通过配置注解扫描加载包路径的bean
3. DI依赖注入,主要分为两种方式
1. xml模式,通过bean中的property子标签来进行属性装配
2. 注解模式,通过@Autowired(spring),@Value, @Resource(jdk,11已默认移除)等注解完成装配
4. Lazy-init懒加载
1. 默认bean都是即时加载,可以通过标签或者注解配置未懒加载,不过只针对于单例模式,因为原型模式都是懒加载的
5. springIOC容器中的bean创建的两种方式
1. 普通bean,调用构造器创建
2. 工厂bean,又称FactoryBean,通过工厂方法创建,
1. xml中,通过设置class为工厂类,并配置factory-method工厂方法属性,能够创建工厂bean
2. 注解中,通过@Configuration+@Bean注解,被注解的方法称为工厂方法,返回对象称为工厂bean,注解方式在springboot开发中通常用于生成框架组件对象
6. SpringBean的生命周期
1. bean信息装配阶段
1. 实例化bean
2. 设置属性值-依赖注入(工厂bean创建的对象一般都已经设置了属性值)
3. 三个接口实现,用于获取信息,(可实现可不实现,通常不建议实现,会导致耦合)
1. BeanNameAware接口,实现setBeanName方法获取bean名称
2. BeanFactoryAware接口,实现setBeanFactory方法获取bean的创建工厂(通常bean都是通过一个默认的工厂创建的)
3. ApplicationContextAware接口,实现setApplicationContext方法获取bean所属的容器对象
2. 后置处理阶段
1. spring提供了后置处理器,分别针对bean和beanFactory
1. BeanPostProcessor
2. BeanFactoryPostProcessor
2. 后置方法执行顺序
1. beanPostProcessor的postProcessBeforeInitialization方法
2. @postConstruct注解方法
3. 实现InitializingBean接口,实现afterPropertiesSet方法
4. xml中定义的init-method方法
5. beanPostProcessor的postProcessAfterInitialization方法
3. 完成阶段
1. 原型模式直接交给调用者
2. 单例模式放入缓存池-IOC容器
4. 销毁阶段 --只针对单例模式singleton
1. @PreDestroy注解方法
2. 实现DisposableBean接口,实现destroy方法
3. xml中定义的destroy-method方法
springAOP
1. AOP代理类的创建过程
1. 目标类先完成实例化,在执行到beanPostProcessor后置处理器的postProcessAfterInitialization方法时(bean对象创建的最后一步)生成代理对象,然后将代理对象放入单例池
2. 生成时默认优先选择jdk动态代理,不满足条件或显式设置强制cglib时使用cglib动态代理