关于spring的解析有很多,我也浅浅分享下自己对spirng的理解
1、spring ioc的理解
简单来说,spring做的就是管理bean
在spring项目中,我们把提供bean的一方简称为供方,把使用bean的一方简称为需方;供方通过@Component等注解或xml文件提供生成bean的材料和入口,需方通过@Autowired等注解指明需要的bean,spring在中间扮演着bean工厂的角色,它从供方收集好bean,然后提供给那些有bean需求的需方,如果所需的bean又依赖于其他的bean,则通过递归的方式从最底层开始将需要的bean都生成好,这就是ioc的一个大体流程
2、spring ioc解决的问题
那么spring解决了什么问题呢,我们可以看下这个场景
A类中有成员b,调用A类的funcA方法时也会调用成员b的funcB方法,而B类中有成员c,调用B类的funcB方法时也会调用成员c的funcC方法...
# bean对象
class A {
private B b;
public A(B b){
this.b = b;
}
void funcA(){
b.funcB();
}
}
class B {
private C c;
public B(C c){
this.c = c;
}
void funcB(){
c.funcC();
}
}
class C {
...
}
# 调用A类的funcA方法
...
C c = new C(d);
B b = new B(c);
A a = new A(b);
a.funcA();
如果我们想要调用A类中的funcA方法,就需要先新建好A对象,而A对象的构造方法依赖B对象,所以又得先新建好B对象,而B又依赖C,依次类推
可以看到如果嵌套的层数够多,这个初始化的过程就会变得非常复杂,手动new一个实体类的成本会无限增加,代码也会变越来越臃肿。
下面看看spring的解决方法
# bean对象
@Component
class A {
@Autowired
private B b;
void funcA(){
b.funcB();
}
}
@Component
class B {
@Autowired
private C c;
void funcB(){
c.funcC();
}
}
@Component
class C {
...
}
# 调用A类的funcA方法
@Autowired
private A a;
{
a.funcA();
}
spring通过反射生成A类对象a,然后在初始化时发现A类中的b成员也是注入的,则找到提供b成员的供方,也就是被@Component修饰的B类,通过反射生成B类对象b,然后B类又找到成员c的供方,依次类推
spring的处理方法和上面手动new的不同之处在于不需要我们手动初始化一大堆成员变量,spring将生产bean的过程从我们手中隐式的转移了到了工厂内,只需要我们定义好供需关系,就能很快创建出一个复杂的bean,这让bean的生产变得高效,并且有效降低了代码间的耦合
3、spring源码相关内容
这期先分享下自己对spring的理解,有空再做一个spring源码的解析