一个新的开始有些时候会让你更加的欣喜!
参考书籍《Spring Action Fourth Edition》
前言:
Spring不仅仅局限于服务器开发,任何的Java应用都能够在简单性、可测试性和松耦合方面从Spring中获益。Spring为了简化Java开发采取了以下四个策略:
● 基于POJO的轻量级和最小侵入编程;
● 通过依赖注入和面向接口实现松耦合;
● 基于切面和惯例进行声明式编程;
● 通过切面和模板减少样板式代码。
一、DI 和AOP是Spring的核心特性
Spring的依赖注入 (Dependency injection,DI)
Spring尽量避免因自身的API而弄乱应用代码,Spring不会强迫你实现Spring规范的接口或者继承Spring规范的类。相反在基于Spring构建的应用中,他的类通常没有任何痕迹表明你使用了Spring。最坏的情况下,一个类使用Spring的注解。
DI 依赖注入能够将相互写作的软件组件之间保持松散耦合。DI 注入有两种基本的方式,基于XML文件配置的注入和基于Java配置类的注入。Spring的面向切面编程(aspect-oriented programming,AOP)
面向切面的声明式的编程能够允许你把遍布应用的各部分的功能分离出来形成可以重用的组件。面向切面的编程往往被定义为促使软件系统实现关注点分离的一项技术。系统由不同的组件构成,每个组件各负责一块特定的功能。除了实现自身的核心功能之外,这些组件还承担着额外的职责。诸如日志、事务管理和安全这样的服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常称为横切关注点,因为它们会跨越多个组件。
AOP能够使得一些常见的重复的非核心业务模块化,并且以声明的方式将它们应用到他们需要影响的组件中。这样带来的好处就是这些组件具有更高的内聚性并且更好的关注自身的业务,完全不需要了解涉及系统服务所带来的复杂性。 总是 AOP能够确保POJO的简单性。
相关的程序的源码:关于DI 和AOP的测试代码请点击链接http://download.csdn.net/detail/zhangyifei521/9610482
二、使用模板消除 样板式代码
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Temp {
/**
* 不使用模板 *
* @param id
* @return
*/
// 许多JavaAPI,例如JDBC,会涉及编写大量的样板式代码
public Knight getEmployeeById1(long id) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
Statement dataSource = null;
conn = dataSource.getConnection();
stmt = conn
.prepareStatement(“selectid,firstname,lastname,salaryfrom”
+ “employeewhereid=?”); // 查询员工
stmt.setLong(1, id);
rs = stmt.executeQuery();
BraveKnight knight = null;
if (rs.next()) {
knight = new BraveKnight(new RescueDamselQuest()); // 根据数据创建对象
knight.name = rs.getString(“name”);
}
return knight;
} catch (SQLException e) {
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
}
}
if (stmt != null) { // 收拾残局
try {
stmt.close();
} catch (SQLException e) {
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
}
}
return null;
}
/**
* 使用模板的方法实现 更加关注逻辑实现
* @param id
* @return
*/
public Knight getEmployeeById2(long id) {
return jdbcTemplate.queryForObject(
"select id,firstname,lastname,salary" + // SQL查询
"from knights whereid=?", new RowMapper<BraveKnight>() {
public BraveKnight mapRow(ResultSet rs, int rowNum)
throws SQLException { // 将结果映射为对象
BraveKnight bk = new BraveKnight(new RescueDamselQuest());
bk.name=rs.getString("name");
return bk;
}
}, id);
}
}
三、Spring自带的应用上下文
ClassPathXmlApplicationContext—从类路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当作类资源。
FileSystemXmlapplicationcontext—读取文件系统下的XML配置文件并加载上下文定义。
XmlWebApplicationContext—读取Web应用下的XML配置文件并装载上下文定义
AnnotationConfigApplicationContext:从一个或者多个基于Java配置类加载Spring应用上下文
AnnotationConfigWebApplicationContext:从一个或者多个基于Java配置类加载Spring Web应用上下文。
四、Spring模块
Spring中有多个Jar文件,Spring框架包括20不同的模块,每个模块都会以二进制类库、源码Jar和Javadoc构成。根据不同的模块功能可以划分为6类不同的功能。如下图所示:
1. Spring核心容器
2. SpringAOP模块
3. 数据访问和集成
4. Web与远程调用
5. Instrumentation
6. 测试Testing