Spring核心——设计模式与IoC

“Spring”——每一个Javaer开发者都绕不开的字眼,从21世纪第一个十年国内异常活跃的SSH框架,到现在以Spring Boot作为入口粘合了各种应用。Spring现在已经完成了从web入口到微服务架构再到数据处理整个生态。

一切都从IoC开始

早期的Spring并没有这么多亮瞎眼的项目,仅仅是围绕着core、context、beans以及MVC提供了一个简单好用搭建网站级应用的工具。那个时候完全是一个与J2EE的繁杂多样对抗简单便捷的小清新。Srping之父Rod的一本《J2EE Development without EJB》宣告J2EE那么名堂完全没多大用处。经过这么多年的发展,事实也证明除了Servlet、JDBC以及JSP似乎其他东西可有可无。后来Vertx、WebFlux等Reactive机制框架的出现,以及前后端分离开发的盛行,似乎Servlet也可有可无了、jsp也快消失了。所以现在Oracle干脆把J2EE这个烫手山芋直接丢给开源社区了。

Rod的轮子理论造就了Spring的2大核心概念——IoC(Inversion of Control)和beans。Spring IoC和Beans的概念度娘、谷哥一搜一大把,在此就不重复介绍了。个人认为IoC和Beans最基本的实现思想来自于设计模式的几大原则,它之所以这么好用并且深入人心就是体现了设计模式的精髓。

依赖倒转原则:Spring的介绍Framework文档的开篇就提到反向依赖注入(DI——dependency injection ),其目标是让调用者不要主动去使用被调用者,而是让被调用者向调用者提供服务。IoC和beans的配合完美实现了这个过程,一个@component注解添加一个bean到Ioc容器,一个@autowired注解Ioc容器会找到对应的类注入进来。

接口隔离原则:Ioc不仅仅根据class类型注入bean,他还会根据接口类型自动装配注入一个bean。

里氏代换原则:在接口隔离的原则的基础上我们可以利用XML配置文件来制定装配的服务。例如javax.sql.DataSource是Java里提供数据库链接服务的接口,世面上有各种各样开源或闭源的工具实现了DataSource接口,例如c3p0和druid。我们想要切换他们仅仅需要像下面这样添加或删除一个bean(当然先要引入Jar包):

<!-- c3p0 -->
<bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
     <property name="driverClass" value="com.mysql.jdbc.Driver"/>
     <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/c3p0jdbctemplate"/>
     <property name="user" value="admin"/>
     <property name="password" value="123456"/>
</bean>
<!-- druid -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
     <property name="url" value="jdbc:mysql://localhost:3306/c3p0jdbctemplate" />
	 <property name="username" value="admin"/>
	 <property name="password" value="123456"/>
</bean>

聚合复用原则:SpringFramework号称非侵入式框架,我们在使用的过程中也很少有继承的情况,基本上所有的特性都是通过注解(Annotation)来实现,需要某一项服务也是将其注入后使用。虽然我们在开发的过程中为了实现一些高级功能会继承重写某些方法后,然后再将我们的新类添加到Ioc中,但是Spring本身并不太鼓励这样去实现。

除了前面4项原则,迪米特法则开闭原则并没有太直观的体现。对于迪米特法则来说Ioc机制本身就实现了调用者与被调用者之间不会直接发生依赖关系(new创建)。而开闭原则,Spring框架本身那么多构建类都是按照这个原则开发的——新功能用新的类实现&#

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值