spring-framework学习

在面试别人时,我经常会问面试者,spring 的两大核心特性是什么。听到的人很多人就直接回答,IOC跟AOP。我会接着问,什么是IOC,什么是AOP。听到的答案总是不是令我非常满意。于是乎我作为菜鸟的我想探索spring框架。

1、IOC,中文之意控制反转。在讲控制反转前,首先要介绍另外一个名词--DI,dependent inject,依赖注入。依赖的意思是,“没有它”不行。写字需要笔,那么写字依赖笔这个事物,吃饭需要筷子,那么我们吃饭就依赖筷子。同样的,在编程中,如果一个类A中,引用了另外一个类B,那么我们说A依赖B。A依赖B类的对象往往是通过A的构造函数传进来进行赋值,或者通过setB()方法来赋值,这两种方式就是我们说的将依赖注入,将B注入到A中。故spring 的注入方式会有两种,一种是构造方法注入,一种是set方法注入。类A依赖类B这种方式对于扩展性不好,哪一天类B需要修改,因为类A依赖B,所以涉及到类A的对象的相关方法都要改。往极端地说,假设项目存在着1000对这样的依赖,1000个都需要修改。对于升级的程序员来说,那将是一场噩梦。所以我们要寻找一种方式,让我们在升级或者修改时,尽量减少代码修改工作。于是我们就设计类A依赖接口C,类B是实现接口C的一个具体的类,A从原来依赖具体类变成了依赖接口C,依赖接口的好处就是,只要你传进来是接口C的子类,那么我代码都可以运行。如果你哪一天你传进来的不是类B的对象,而是类D的对象,类D也是实现接口C的具体的类,类A不需要做任何的修改就可以完成升级。

我们都知道IOC底层是通过反射实现的。反射是什么?反射就是通过类名,不需要通过new关键字,就可以获得一个java对象。有人问,直接new不行吗。答案是肯定的。但是如果我们使用一个对象,该对象初始化时非常复杂的,极端地说,假设初始化这个对象需要1000行代码,那么我们每次new这个对象时,要使用这个对象,每次都要写1000代码,代码就会很臃肿。于是我们就想着要是有一个类专门用来创建这种对象就好了。于是就有了工厂类,所谓的工厂模式就产生了。工厂模式刚才说的,有专门的方法进行返回初始化复杂的类对象,要获得新的对象时,只是要调用该工厂类对应的方法就好。假设原来项目中,有1000个地方需要新建这个复杂的类,那么原来的方式创建则需要1000*1000行代码,经过使用工厂类,那么现在只需要1000+1000行代码。代码量大大修改。假设复杂类有一天,初始化有修改,原来的方式,要修改1000*1000个地方,想象一下有多恐怖。上面回答了,直接new对象不好的地方。回答反射的问题上来,我们不要new的方式就可以获得java对象,只要提供类名。然后就可以获得java对象。这里非常关键的点就在于只需要提供类名。提供类名的方式有几种,一种是硬编码,直接在代码中提供类名,一种是在配置文件中提供,通过读取配置文件,获得类名。配置文件的文件格式又可以是多种多样的,你可以使用properties文件格式也是使用xml文件,但归根结底都是文本文件,最后还是通过解析文件,将类型读取到你的程序,完成某个类的实例化操作。spring就是通过xml的方式定义某个类的对象。一开始对于bean 的理解我老是搞不清楚是什么意思,中文意思豆子,但是在java程序中是什么意思,一直搞不明白,后来寻找答案,有人说bean就是对象;我部分赞同这样的说法,毕竟对象时一个非常抽象的概念。对象可以用来指各种各样的东西。除了依赖的对象可以定义在xml文件,被依赖的对象也可以定义在xml文件。这里说的定义,可以理解为描述某个对象初始化时,哪些属性初始值是多少,初始值的类型是什么,依赖的其他的类对象是什么类型等等。spring通过解析这个配置文件,解析到了java类,依赖关系,通过类名,依赖关系将通过反射获得一系列的对象,这些对象此时此刻会存到一个容器中,等待被使用。这里出现一个词容器。java的标准类库中也有容器的概念,有时候又称为集合。spring的容器比标准的集合更加多的功能,spring的容器可以完成对配置文件的解析,解析配置文件通过反射得到的一系列对象有可以存在容器中,spring实现存对象的类实际也是通过java标准集合set ,map等容器类存的,简单的说如果一个bean唯一,我们需要提供唯一的name,那么我们可以联想到使用map来存这个对象,以name为键,以对象为值存在map集合中,spring容器持有这个map对象,即可完成对java bean的管理。

说了这么多,其实自己都不知道自己在讲什么,后面继续优化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值