ioc(控制反转 inverse of control)是spring容器的核心,主要包含两个意思:控制,反转。就是某一接口实现类的选择控制权从调用类移除,转交给第三方决定。因为IOC难理解,所以后来Martin Fowler提出了DI(依赖注入 Dependency Injection)的概念以替代IOC,即让调用类对某一个接口实现类的依赖关系由第三方注入,以移除调用类对某一个接口实现类的依赖,实现解耦。
详细教程:https://jinnianshilongnian.iteye.com/category/206533?page=2
依赖注入,分为三种:
1. 构造函数注入
2. 属性注入
3. 接口注入
Bean生命周期:
通过getBean调用某一个Bean,共执行了以下操作来完成Bean的生命周期。
1. 调用 InstantiationAwareBeanPostProcessor 的 postProcessBeforeInstantiation 方法。
2. 构造函数实例化
3. 调用 InstantiationAwareBeanPostProcessor 的 postProcessAfterInstantiation 方法。
4. 调用 InstantiationAwareBeanPostProcessor 的 postProcessPropertyValues 方法。
5. 设置属性值
6. 调用 BeanNameAware 的 setBeanName 方法。
7. 调用BeanFactoryAware 的 setBeanFactory 方法。
8. 调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法。
9. 调用 InitializingBean 的 afterPropertiesSet()方法
10. 通过 init-method 属性配置的初始化方法。
11. 调用BeanPostProcessor的postProcessAfterInitialization()方法
12. 如果是单例singleton 对象加入到IOC容器中,否则原生prototype对象将bean交给调用者。
13. 调用 DisposableBean 的 afterPropertiesSet 方法。
14. 调用 destroy-method 属性配置的销毁方法。
ApplicationContext 与 BeanFactory 区别:
。。。。
BeanFactory 与 FactoryBean的区别:
BeanFactory,以Factory 结尾,表示它是一个工厂类接口,用于管理Bean的工厂,在Spring的BeanFactory是ioc容器的核心接口,它的职责:实例化、定位、配置应用程序中的对象及建立这些对象之间的依赖。
FactoryBean,以Bean结尾,表示它是一个Bean,不同于其他Bean的是:它实现了FactoryBean接口的Bean,根据Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject返回的对象,而不是FactoryBean本身,如果需要获取FactoryBean对象,请在ID前面增加一个&来获取。
1.2 AOP编程aop,面向切面编程,也就是把那些与业务无关,但是又被业务模块共同调用的逻辑或行为封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
使用场景:日志,权限,监控,事务,异常等,可防止恶意攻击(时间片控制调用次数),可防止sql注入。
SpringAop 通过pointcut(切点)指定在那些类的哪些方法植入横切逻辑,通过advice(增强)描述横切逻辑和方法的具体织入点(方法前,方法后,方法两端等)。此外,spring通过advisor(切面)将pointcut和advice两者组装起来。有了advisor的切面,spring就可以理用jdk或cglib(第三方生成库code generation library)的动态代理技术采用统一的方式为目标bean创建织入的代理对象了。
动态代理,jdk,cglib:
1. jdk动态代理是通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口,核心是invocationHandler接口和proxy类
2. cglib是一个代码生成的类库,可以在运行时动态生成某一个类的子类(派生类),注意,cglib是通过集成的方式来实现动态代理,因此如果类被标记为final,那么它是无法使用cglib来实现动态代理的。
注意事项:
1. 如果目标对象实现了接口,默认情况下spring会采用jdk动态代理来实现aop,也可以强制使用cglib来实现。
2. 如果目标对象没有实现接口,必须采用cglib来实现动态代理,spring会在两种方式自动切换。
3. 不管哪种方式,都不能使用private和final来做修饰。
4. jdk动态代理要比cglib代理执行速度快,但性能不如cglib好。
具体例子:1. SpringAOP 动态代理实现的两种方式 - xu_shuyi - 博客园
1.2.1 启动原理springmvc启动是从一个叫contextLoaderListener 开始的,它是一个servlet监听器,能够被web容器发现并加载,初始化contextLoaderListener之后,接着就是根据配置入contextConfigLocation和contextClass创建web容器了,如果你不指定contextClass参数值,则默认创建springweb容器类型为xmlWebApplicationContext,最后一步就是根据你配置的contextConfiglocation 文件路径去配置并刷新容器。
面试题(11)-- Spring MVC启动过程分析 - xu_shuyi - 博客园
1.2.2 请求原理dispatcherServlet初始化做了两件事情,第一根据web容器,就是xmlwebapplicationcontext创建一个专门为dispatcherservlet服务的web容器;第二将你在web.xml文件中对dispatcherservlet进行相关配置加载到新容器中。
SpringMVC工作原理 - 平凡希 - 博客园
2. spring boot


