耦合的概念:

传统的开发中,通常会在main方法或者业务中根据需要创建对应的对象。
1
2
3
4
public static void main(String []args){
Obj o = new Obj();
....
}

​ 这样的结果就是程序中(不同类之间)的耦合非常大,而带来的问题就是不利于程序后期的维护(试想,当我们因为业务改变而需要修改Obj类或者改为创建新的类时,我们不得不修改源程序,而这违背了面向对象程序设计的开闭原则)。

现在思考如何解决这个问题呢?

  1. 通过反射来加载类(class.forName,我们在加载数据库驱动时经常会这样做)
  2. 通过加载配置文件读取全限定类名[使用propities.getClassLoader.getResourceAsStream相关命令]

tip:有些同学会疑问,这样依然需要写类名,仍然会有耦合。注意,降低耦合并不等于完全消除耦合。

而Spring就是一个完成这样功能框架。[ Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架 —–摘自百度百科]

关于控制反转:控制反转的主要作用是降低耦合,为什么叫做控制反转呢?我们将在下文中提到。

关于 bean:编程英语中bean通常指的是可重用组件,而在Java中一般指类。

Spring如何使用呢?

  1. 创建bean.xml [可参考官网, 最小仅需要id和class属性。]

一个简单的bean.xml的例子:

1
<bean id="accountService" class="top.4fan.dy.service.impl.AccountServiceImpl"></bean>
  1. 创建对应的所需要获得的对象对应的类文件。
  2. 在需要的位置(比如main)通过如下方式获得需要的对象:
1
2
3
4
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml")
//一下两种方法无本质区别
Obj o1 = (Obj)ac.getBean("xml里边的id");
Obj o2 = ac.getBean("xml里边的id",xxx.class);//这种方法不需要强转

ApplicationContext类有三个常用的实现类(我们以上仅用到一种,其它的用法场景如下):

  • ClassPathXmlApplicationContext :加载类路径下的配置文件【配置文件必须在类路径下】

  • FileSystemXmlApplicationContext:加载磁盘上任意有权限[指操作系统级别的权限]的文件

  • AnnotationConfigApplicationContext:读取注解创建容器

​ 所有的ApplicationContext类都有立即加载的特征,即``new xxxApplicationContext时即创建对象。与之相对应的另一种用于获得对象的XmlBeanFactory`类则在需要时创建对象。对于未使用到的另外两个常用类,可以参考Spring文档。

所以最后一个问题,为什么叫做控制反转呢?

​ 在传统的代码中,我们通过自己创建对象并控制对象的生命周期(初始化……销毁),而使用Spring时,对象的生命周期则由Spring管理,即我们把对象的控制权交给了Spring容器。

tip:如果你对面向对象程序设计中的设计模式部分比较熟悉的话,你可以将Spring理解为一个工厂模式的实现。

接口命名规范demo:IAccountService