Spring的作用
Spring的核心是控制反转(IoC)和面向切面(AOP)。
反转控制降低了,类于类之间的耦合
public class Service{
private Dao dao = new DapImpl();
...
}
如上面的service类,当创建一个service类的时候,必然也会创建一个Dao实现类,这种叫做强耦合,为了减少类与类间的耦合,当使用Spring的Ioc时,上面的service类可能这样写
public class Service{
private Dao dao = null;
public Dao setDao(Dao daoImpl){
this.dao = daoOmpl;
}
...
}
上面两个写法在于,Service中的成员变量dao怎样赋值,第一种写法在一创建service时就创建了一个dao实现类,第二种方法是通过set方法来进行赋值。第二种写法通过spring中数据注入来进行赋值,后面将结合例子介绍。同时这两种写法的更大的区别在于,第二种方法大大降低了service类和dao类的耦合,不再是一创建service就得也创建Dao类。
再简单的说就是,先把程序中所需要的类全部窜在一个容器里,当我们需要的时候从这个容器中获取。
IOC
IOC(Inversion Of Control):反转控制
是将组件间的依赖关系从程序内部提到外部来管理。使用IOC可以降低程序间的耦合,如何降低耦合,如上面简单介绍的那样。以前我们要使用一个类的实例时,我们都是通过new来获取一个实例,这是一种主动的模式,相当于我们需要时我们去创建一个实例,当当使用IOC时,这种创建的主动权和创建的时机将由我们自己交由第三方来控制,我们由需要时创建变成需要时获取。
接下来用一个例子来进一步介绍IOC和接下来的AOP。
IOC准备
导入spring开发包,导入依赖
导入相应的包之后,创建业务层和持久层
程序目录结构:
业务层
持久层:
接下来开始写配置文件
在resources文件下创建一个xml文件
1、在xml文件中加入相应的约束
2、让spring管理资源,在配置文件中配置service和dao
测试
bean标签
作用:用于配置对象让spring来创建。默认情况下它调用的是类中的无参构造方法,如果类中没有无参构造函数则不能创建成功。
属性:
id:给对象在容器中提供一个唯一的标识,容器根据id来获取对应的对象。
class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
scope:指定对象的作用范围。取值有 singleton:默认值,单例的;prototype:多列的;这两个常用,还有其他值。
由上面的例子知道,在Service有一个成员变量AccountDao,在Service中并没有对它进行赋值,只是提供了一个set方法,在测试方法中也没有调用set方法进行赋值,但可以测试成功,那么accountDao是怎么被赋值的?接下来介绍spring的依赖注入。
依赖注入
DI(Dependency Injection)。它是spring框架核心IOC的具体表现。
在上面的例子中Service要实现具体的操作需要通过对象accountDao,但在Service并没有显示的创建dao对象。
依赖注入简单的说就是通过spring给类中的成员变量赋值,不用我们去辅助,这是降低程序间耦合的主要操作。
在这里我们注意到在配置service的bean标签里还有一个
property标签,通过配置这个标签spring会自动给accouDao赋值。property标签是通过调用set方法来变量赋值,所以我们提供了一个set方法。这里还有其它集中注入方法:
property标签:通过调用set方法对变量进行赋值,类中需提供set方法。
属性:
name:找的是类中set方法后面的部分
ref:给属性赋值的类型是其他bean类型(一个类,如service中的accountDao)
value:给属性赋值是基本数据类型和String类型
constructor-arg标签:通过构造方法给成员变量赋值,需要提供带参构造函数
属性:
index:指定参数的在构造函数参数列表的索引位置
type:指定参数在构造函数中的数据类型
name:指定参数在构造函数中的数据类型
(以上三个都是找给谁赋值)
value:它能赋的值是基本数据类型和 String 类型。
ref:它能赋的值是其他 bean 类型,也就是说,必须得是在配置文件中配置过的 bean。
以上两个标签都在bean标签内部使用
以上两种是常见使用方法。还有其他类型变量的的注入方式,比如集合类对应的是不同的标签。
(以上若有错误,或不顺的地方,欢迎指教)