【Spring】谈谈自己对Spring的简单理解

关于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源码的解析

【SpringBoot】SpringBoot源码解析第一章 SpringBoot的构造方法-CSDN博客

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值