Spring框架的底层学习

                                                                  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方面熟悉的不是很多,有条件的可以看源码代码。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值