Spring框架的底层学习
1.在学习Spring框架的时候,我们只了解基本使用,就是相当于demo,会使用即可,但是过一段时间就会忘记啊,怎么让自己对Spring框架掌握的特别好???这是一个问题,大多数Spring精通的人都在学习看源码。源码对于初学者来说,都有看不懂的意思,源码如何看呢?
2.Spring框架的基本概念要熟悉,基本概念熟悉之后,看源码可以事半功倍,比如DI,IOC容器,,,,
3.要看懂Spring框架是怎么设计的,为什么要这样设计,这样设计解决了什么问题?
下面我们就从Spring框架的基本概念:Ioc和Aop。
Ioc容器是怎么来的?干什么用的?可以解决什么问题?
1.我们在未使用Spring框架的时候,创建对象的实例,需要new B();
可以看出上述中,在一个类中需要依赖一个类,如果这个依赖有问题了,所以全部就有问题。附上代码:
public class demo01{
public static void main[String [] args){
A a = new A();
a.hello();
System.out.Println(a);
public class A(){
private int age;
private String name;
public A(int age,String name){
this.age=age;
this.name=name;
setter/getter省略
}
}
public class B{
public void say(){
System.out.Println("aidfhkja");
由此可见,依赖性太强,引入Ioc容器之后会解决上述问题。
类A和类B的属性直接交给Ioc容器管理,减少了耦合性,提高了内聚,同时Ioc反过来控制了A和B,即使A出现问题,也不影响B。
综上所述,Ioc容器就是由此产生的,用来控制反转的,也就是第三方服务的配置管理,解决了依赖问题,降低耦合性,提高了内聚。
Ioc又是怎么实现的?在内部里面用什么东西来实现Ioc的?
实现Ioc的方式是DI(依赖注入),即就是注入属性到Ioc容器里,就是说把对象的属性和实例注入到其他对象里。
DI的实现方式有哪几种了?
1.构造方法注入
2.setter/gether注入
3.接口注入
Ioc的源码:
通过源码可以看到Ioc的入口是从beanFactory接口启动的,一切都在bean中
1.Ioc是怎么启动的?怎么工作的,流程怎么样的?很复杂的问题?
需要看源码自己体会。带的问题去看源码比较容易入手。
beanFactory相当于一个工厂,里面可以有一个bean,bean用于启动这个工厂,就像配置里一样,细读源码发现顶级接口下面有很多子接口。
一切都是从refresh()方法里看,都是从这里开始的。
进去源码找到AbstractApplicationContext类中找到这个refresh方法,可以看到很多的细节。也就是Ioc容器初始化流程:
完成代码如下:
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
以上都是Ioc容器的底层,再就是一个Aop的面向切面编程,不过用的比较少而己。
Aop的相关术语需要了解清楚,我们才能看懂它的应用。
Aop和Ioc一样,支持三种配置方式,也是在Bean中完成的。
无非就是两种配置自由搭配组合,即注解和XML。
1.XML
这个不同于Ioc容器,如果不配置这些配置,回报错。
2.注解
3.XML+注解
Aop在实际开发中用的不是很多,对此Aop方面熟悉的不是很多,有条件的可以看源码代码。