Spring自动装配的发展历程

Spring所谓的自动装配,实质就是实现了对依赖注入的一个简化操作,而依赖注入就是Spring帮助你完成对象的组织关系的一种手段。随着Spring的不断发展,我已经无法搞清楚自动装配的本质和原理了。所以,下面就来梳理一下。
首先,要记住一个关键词:依赖注入。所有的手段都是为此服务的,而所有的发展都是为了更加简便,“智能”的实现这个目的。

1. xml手动配置<property>标签时代

这是Spring实现依赖注入最初的依赖注入的手段。很直观,如果要注入一个属性,需要配置一个属性名称,一个引用的名称。Spring去傻傻的根据配置完成依赖注入即可。

<bean id="cat" class="com.keqing.autowired.Cat"></bean>
<bean id="dog" class="com.keqing.autowired.Dog"></bean>
<bean id="p1" class="com.keqing.autowired.People">
    <property name="cat" ref="cat"/>
</bean> 

2. xml手动配置autowire标签属性时代

我们省略配置<property>标签这一步,通过配置标签属性autowire="byName",也可以完成上述的工作。这里隐含了一些约定俗成的规矩。第一,属性名称和setter方法的方法名一致;第二,引用类型的名称和setter方法的方法名一致。这个时代其实更像一个过渡的时代,用处不大,但是,为后面更智能的发展做好了铺垫。也更能够体现“约定大于配置”这个思想。

<bean id="cat" class="com.keqing.autowired.Cat"></bean>
<bean id="dog" class="com.keqing.autowired.Dog"></bean>
<bean id="people" class="com.keqing.autowired.People" autowire="byName"></bean>

3. xml配置全局自动装配时代

我们还可以省略单个的bean标签中配置标签属性autowired,通过配置统一的自动装配策略来实现我们进一步偷懒的想法。其实,我是写到这里才想到这个方式的,其实,路都是一步步走出来的,明白了过去的路径发展,就能推导出未来的发展方向。我还是有一点印象,就是有过这个配置。并且,也有Mybatis全局xml配置对我的影响。我就想Spring中应该也有类似的配置。我专门去查了一下,果然还有。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd"
        default-autowire="byName">

    <bean id="cat" class="com.keqing.autowired.Cat"></bean>
    <bean id="dog" class="com.keqing.autowired.Dog"></bean>
    <bean id="people" class="com.keqing.autowired.People"></bean>

</beans>

以上代码关键的地方在于default-autowire="byName"。有了这个配置,我们就不用在每一个bean标签中使用autowire标签属性来配置自动装配实现依赖注入了。但是,这个其实也是个过渡阶段,为我们的下一个阶段做准备。还是要提醒一句,实现简便和只能的前提是“约定大于配置”,就是这个思想才能推动简便和智能的。

4. xml配置注解驱动,类中配置注解特性时代

xml配置发展到这个地步,已经没有什么可玩的余地了。必须寻找新的手段来拓展发展边界,这是Spring发展的关键一步。其实,前面我们看到了很多约定俗称的重复代码,我们通过约定大于配置的手段,进一步简化了配置。而我们xml中剩余的配置都是关于对象创建的。关于自动装配,我们就没有进一步发展的空间了吗?我想应该是的。我们必须要提出一套完整的新方案来取代xml配置,来提高简便性。那就是注解。这个阶段显然是这套方案的一部分,也是一个过渡阶段。

<context:annotation-config></context:annotation-config>
<bean id="cat" class="com.keqing.autowired.Cat"></bean>
<bean id="dog1" class="com.keqing.autowired.Dog"></bean>
<bean id="people" class="com.keqing.autowired.People"></bean>

上面的xml中开启注解驱动


public class People {
    @Autowired
    private Dog dog;
    @Autowired
    private Cat cat;    
}

上面的java类中利用注解自动装配,实现了依赖注入。


5. 精简xml配置,省略bean标签配置

其实,自动装配发展到上面这一步,就已经完结了。但是呢,注解这是一整套方案,我呢,就把这一整套方案都捋一下,免得糊里糊涂,从这个阶段,到最后,其实都是整个Spring的发展方向。其实,从开始使用注解,就已经是星星之火了,可以燎原这也是大势所趋。刚开始学习的时候,人们还说,注解不便于管理,带来了复杂性,但是,现实都是打脸的。注解的使用当然是有弊端的,就是没有xml那样把一些固定的配置来集中管理,这一部分有点,java以后是否能够取代就不得而知了。使用注解的好处也是能够看出来的,不需要解析xml了,xml毕竟不是java体系本身的东西。如果利用反射去解析注解,那么都是自家技术应该更好,更方便的解析。注解也进一步减少了xml中的配置,当然在类中的注解配置可没有减少,但是,这就为Spring Boot的发展奠定了基础。

<context:annotation-config></context:annotation-config>
<context:component-scan base-package="com.keqing"></context:component-scan>
@Component
public class People {
    @Autowired
    private Dog dog;
    @Autowired
    private Cat cat;
}
@Component
public class Dog {
    
}
@Component
public class Cat {

}

上面,我们可以看到xml中的配置进一步压缩了,但是注解也在迅速膨胀中。

6. 省略xml配置

既然都走到这一步了,我们把配置都搬到了注解上,能不能彻底把xml干掉呢。我没有过这个想法,所以,我就不会发明Spring Boot。很多人也没有这个想法,所以SSM,SSH框架才能大行其道这么些年。其实,发展到第三步的时候,xml的气数已尽。后面和注解配置使用,都是一个过渡的阶段。要说注解真有什么好处,就是配置相对能够简单,配置信息总要去xml中去看,也是一件挺烦人的事情。而且配置信息就写在类中的脑门上也是比较清晰了。但是,我总感觉,注解这个玩意来配置一些固定套路的东西,实在是没有什么优势可言,是配置变得更加零散了。不利于我们去寻找维护。后续的Spring Boot就非要依靠全注解这个特性吗?肯定不是,xml也能够实现。Spring Boot更多的是对“约定大于配置”这个思想的良好实现。

@Configuration
@ComponentScan(basePackages = "com.keqing")
public class MyConfig {
    @Bean
    public People getPeople() {
        return new People();
    }
}

可以把xml中的配置全部搬迁到注解中来,这些配置都是等价的。
走到这一步,其实也是走到头了吧。Spring Boot能帮我们做的就是把这个注解配置类也帮我们屏蔽掉了,让我们使用的时候更加简单。但是,有些需要我们个性化配置的,我们还是需要配置文件去做的。

我们拿现在的全注解和以前的全xml配置比对,会发现不过是配置的大搬迁。该有的配置一个也不能少。注解当然多少也是带来了便利性,相对xml配置文件,节省了一些步骤和便于我们开发。但是注解的问题,我发现也没有xml配置那么直观,大量层层叠叠的注解更是看的人头疼,而且,注解也有架空方法名的问题,有了注解之后,方法名都显得没有作用了。这显然不是个好兆头。这是把java最底层面向对象思想的特性侵蚀掉了。

展望

后续的发展:

  1. 能不能解决注解带来的配置没有xml配置清楚的问题,能不能解决注解配置零散的问题。
  2. 注解消解了java中方法名称重要性的问题,能不能解决。
  3. Spring Boot能不能进一步发展,把“约定大于配置”这个思想进一步发挥到极致。其实,开发中还是有不少固定套路性质的代码没有被简化掉,比如开发web项目,其实,很有必要提出一套完整的解决方案出来精简代码。而不是让我们去整合Spring web,Mybatis,等等这些玩意,然后再编写整合之后,一些无聊的基础代码。其实,类似这种的问题,在gitee中有很多国内的开源项目就是什么后台管理系统,快速开发框架。我认为这才是下一步更加简单,智能的发展方向。比什么人工智能,机器学习靠谱多了。这也很符合上面技术演进的方向。因为高深的技术的发展方向必然是面向普通人开放的。从开始的博士等高学历人才才能从事开发工作,到现在技术普及到初高中就行。到将来技术肯定会演进到普通人拿来即用的程度,这是一个方向。
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容