继Struts 2之后,我学习了 Spring ,然初次接触,就被其强大的功能及多处优点所吸引,故对其进行深入学习,分享总结如下:
一、Spring的下载:
Spring框架官方网站http://www.spring.gov.sg/Pages/homepage.aspx,该网站即可完成Spring框架的下载。
二、Spring的安装:
Java程序则只需将Spring解压文件夹下的disk目录下的spring.jar添加到ClassPath下。如果开发Web应用则只需将spring.jar拷贝到Web应用的WEB-INF目录下的lib目录下。如果应用需要使用到其他第三方的JAR,则还需将其添加到ClassPath下或拷贝到Web应用的WEB-INF目录下的lib目录下。
三、Spring的优点:
(1)
Spring能有效地组织你的中间层对象。
(2)Spring能消除在许多工程中常见的对Singleton的过多使用。
(3)Spring能消除各种各样自定义格式的属性文件的需要,使配置信息一元化。
(4)Spring能够帮助我们真正意义上实现针对接口编程。
(5)在Spring应用中的大多数业务对象没有依赖于Spring。
(6)使用Spring构建的应用程序易于单元测试。
(7)Spring支持JDBC和O/R Mapping产品(Hibernate)
(8)MVC Web框架,提供一种清晰,无侵略性的MVC实现方式。
(9)JNDI抽象层,便于改变实现细节,可以方便地在远程服务和本地服务间切换。
(10)简化访问数据库时的例外处理。
(11)Spring能使用AOP提供声明性事务管理,可以不直接操作JTA也能够对事务进行管理。
(12)提供了JavaMail或其他邮件系统的支持。
(13) 轻量级,非侵入式:基于Spring开发应用时新建的类一般都无须继承Spring中的类。
(14) 反向控制:又称为依赖注入和IoC。使用方向控制,对象被动接收依赖类而不是自己去创建或者查找其所以来的对象。
(15) 面向切面:又称为AOP。使用面向切面编程,可以将业务逻辑从系统服务中抽取出来,实现内聚开发。应用对象只实现业务逻辑,而不会去负责其他的系统级关注点。
(16) 容器:Spring中包含并且可以管理应用对象的配置和生命周期,配置Bean如何被创建或者是如何被关联。
(17) 框架:可以将简单的组件配置组合成复杂的应用。
(18) Spring是免费的、是开放源代码的。
(19) Spring拥有众多社区支持。
四、Spring依赖注入方式:
使用Spring的依赖注入可以为对象注入属性值。Spring的依赖注入分为两种,一种是通过Set方法注入依赖,一种是通过构造函数注入依赖。
1)用其他的Bean注入(interfaceinjection)
接口注入指的就是在接口中定义要注入的信息,并通过接口完成注入。结合前面的示例,其具体步骤如下:
(1)编写一个接口IBusiness,各种数据库的注入将通过这个接口进行。
(2)任何想要使用数据库实例的类都必须实现这个接口,业务逻辑类Business实现这个接口IBusiness。Business.java的示例代码如下:
//******* Business.java**************
this.db = db;
}
……
//根据注入的数据库类,从×××数据库中获取数据
public void getData() {
……
db.getData();
……
}
}
(3)编写测试类TestBusiness。TestBusiness.java的示例代码如下: //******* TestBusiness.java**************
public class TestBusiness {
private Business business = new Business();
……
//根据注入的数据库类,从Oracle数据库中获取数据
public void getData() {
……
business. createDI (new OracleDataBase());
business.getData();
……
}
}
如果要完成依赖关系注入的对象,必须实现IBusiness接口。
2)通过Set方法注入依赖(setter injection)
Set注入指的就是在接受注入的类中定义一个Set方法,并在参数中定义需要注入的元素。为了让类Business接受DataBase的注入,需要为它定义一个Set方法来接受DataBase的注入。Business.java的示例代码如下:
//******* Business.java**************
public class Business {
private DataBase db;
public void setDataBase(DataBase db) {
this.db = db;
}
……
//根据注入的数据库类,从×××数据库中获取数据
public void getData() {
……
db.getData();
……
}
}
3) 使用构造函数注入依赖(constructor injection)
构造注入指的就是在接受注入的类中定义一个构造方法,并在参数中定义需要注入的元素。为了让类Business接受DataBase的注入,需要为它定义一个构造方法,来接受
DataBase的注入。Business.java的示例代码如下:
//******* Business.java**************
public class Business {
private DataBase db;
public Business (DataBase db) {
this.db = db;
}
……
//根据注入的数据库类,从×××数据库中获取数据
public void getData() {
……
db.getData();
……
}
}
五、Spring的自动装配:
自动装配包含如下四种类型:
1) byName:在IoC容器中寻找与Bean中属性名相同的id对应的Bean,如果找不到相符合的Bean,则该属性没有被装配上。
2) byType:在IoC容器中寻找与Bean中属性相同类型的Bean,如果找不到相符合的Bean,则该属性没有被装配上。如果找到多个相符合的Bean,则会抛出异常。
3) constructor:在IoC容器中寻找与Bean中构造函数参数一致的一个或多个Bean。如果存在不确定的Bean,则会抛出异常。
4) autodetect:自动模式,首先尝试使用constructor来自动装配,然后使用byType方式。