spring底层实现原理

1. 什么是aop??
与oop(面向对象相比)相比较,传统的oop开发的代码逻辑是自上而下的,这些自上而下的过程会产生横切性问题。而这些横切性问题又与我们的主业务逻辑关系不大。
aop的编程思想是就是把这些横切性的问题和主业务逻辑进行分离,从而达到解耦的目的。
应用场景:日志管理,事务管理

技术本质: 如果代理对象不是接口则使用cglib proxy, 如果是接口则使用的是java proxy动态代理
代理发生在什么时候?
在初始化的时候进行代理的

为什么java 动态代理必须是接口?

spring中的transation底层是怎么实现的 spring底层原理是什么_业务逻辑


因为java是单继承多实现,它已经继承了Proxy,则只能代理接口。

2. IOC容器?
IOC也称为依赖注入(dependency injection, DI) 它是一个对象定义依赖关系的过程,也就是说,对象只通过构造函数参数对象实例构造或从工厂方法返回后在对象实例上设置的属性来定义它们所使用的其它对象,然后容器在创建bean时注入这些依赖,这个过程本质上是bean本身的逆过程,因此称为控制反转(ioc),通过直接构造来控制依赖项的实例化。

统一bean的构建,并自动维护bean的依赖关系实质上就是一个map

过程:
1.Ioc容器创建所有的bean
2.创建bean注入其依赖bean

spring注册Bean的原理解析

spring中的transation底层是怎么实现的 spring底层原理是什么_业务逻辑_02


在此要注意两个接口:BeanDefinition和BeanDefinitionRegistry接口BeanDefinition: bean定义 ,承载bean属性。

BeanDefinitionRegistry: bean定义注册器 ,bean的id作为key存map,id —BeanDefinition

spring中的transation底层是怎么实现的 spring底层原理是什么_业务逻辑_03


AliasRegistry(别名注册器): bean的name作为key注册

BeanDefinitionReader(Bean定义读取):读取配置文件

spring中的transation底层是怎么实现的 spring底层原理是什么_业务逻辑_04


BeanDefinitionReader存在的方法:

spring中的transation底层是怎么实现的 spring底层原理是什么_spring_05


BeanFactory(Bean工厂):生产bean

spring中的transation底层是怎么实现的 spring底层原理是什么_java_06


spring中的transation底层是怎么实现的 spring底层原理是什么_业务逻辑_07


DefaultListableBeanFactory此类实现了注册器和BeanFactory了解上述的接口,我们就可以写中间件,常见的中间件有mybatis-spring等,实现其后置处理器。

主要流程图:

spring中的transation底层是怎么实现的 spring底层原理是什么_业务逻辑_08

在bean的创建过程中,ioc做了什么事情?

(1)IOC底层是怎么判断返回FactoryBean或者返回getObject?

spring中的transation底层是怎么实现的 spring底层原理是什么_java_09


refresh():容器启动的方法

spring中的transation底层是怎么实现的 spring底层原理是什么_业务逻辑_10

读取配置文件:xml方式

ApplicationContext context = ClassPathXmlApplicationContext();
 context.getBean(user);

注解开发:
@Configuration: 使用在类名上面,告诉spring这是一个配置类。
@Bean : 使用在方法上,给容器中注册一个Bean, 类型为返回值的类型,id默认使用的是方法名, 当然可以在Bean(“person”)中指定id名称。
xml文件配置:

包扫描:只要标注了@Controller, @Service, @Repository,@Component

xml文件配置方式:<context:component-scan base-package=“com.learn”></context:component-scan>

注解方式:

@ComponentScan(value=“com.learn”,excludeFilters={
 @Filter(type=FilterType.ANNOTATION , classes={Controller.class, Service.class})
 } )

value:指定要扫描的包是lcom.learn

excludeFilters: 指定要过滤的组件, 类型为Filter[]数组,指定扫描的时候按照什么规则排除那些组件。
includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件。
type:指定过滤的规则;
FilterType.ANNOTATION: 按照注解
classes:过滤的哪些类型组件

后续继续更新…