连续看 spring framework 两天了,总算对 spring 有一点点的了解了,也算是有那么一点点的收获吧,写点东西,也算是对理解概念做一番总结吧,初看 spring 的时候总是被它的两个主要概念 IoC 和 AOP 搞的晕头转向,于是先忽略这些抽象的概念,通过一些具体的例子来加强理解吧,看的是一本 Spring Guide 的电子书,好歹也是中文的,理解起来要快一点了。
一开始的时候是在搞 JdbcTemplate,这是一个很好理解的概念,但是程序怎么也调不通过,最后才发现,原来是对 spring 基础知识的缺乏而导致的,算了,直接跳过,进行后面的基础知识学习了。 JdbcTemplate 概念其实很好理解,提供了对 Jdbc 的一种封装,简化一些 Jdbc 操作的冗余代码,思路和 MS 的 DotNet Enterprise Library 中的 Data Access Application Block 类似,在 XML 文件中配置数据库的连接信息,将数据库操作封装成一个类,可以进行返回 ResultSet 和仅仅操作而不返回记录的操作。
用一段代码来表示其不返回记录的操作方式:
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update("UPDATE user SET age = 10 WHERE id = 'erica'");
再用一段代码来表示其返回记录的方式:(使用的是PreparedStatement)
final List userList = new ArrayList();
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.query(
"SELECT name, sex, address FROM user WHERE age > 18",
new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getString("name"));
user.setSex(rs.getString("sex"));
user.setAddress(rs.getString("address"));
userList.add(product);
}
}
);
spring 的一个核心概念就是 IoC (Inversation of Control) 被 Martin Fowler 成为 Dependency Injection,spring 的核心部分包含了一个 IoC 容器。说白了 IoC 就是由容器控制程序之间的关系,而非传统实现有程序操纵。控制反转就是将控制权由应用程序代码中转到了外部容器,控制权的转移即所谓的反转。在 spring 中,我们只需要写 Bean 的接口代码,具体子类的实现可以通过 XML 或者其它的配置实现,以后维护时只需要修改配置文件而不是修改源代码。这样我们就把很多原本在编译期完成的任务转移到运行期来进行,很大程度上的提高了程序的灵活性。spring 也是一个无侵入式的高扩展性框架,即无须代码中涉及 spring 的专有类,即可将其纳入 spring 进行管理,也就是说,当有一个更好的 IoC 容器出来时,不需付出太大的代价即可实现迁移,这在 EJB 这样的高侵入式框架中简直就是一个恶梦。
IoC 的核心组件是 Bean Factory,是一个针对多个 Bean 的管理容器,我们可以不用 new 来实例化即可使用一个对象。由于没有做太多深层次的研究,对这一概念理解还是很有限的。spirng framework 中,从 Bean Factory 扩展出了一个 ApplicationContext 的类,比 Bean Factory 提供了更为强大,但框架依赖的实现。
很多概念由于理解的很肤浅,还要继续理解下去:下面一段是我调试通过的一段程序,演示出如何使用ApplicationContext 的。
Action.java(接口)
package beantest;
public interface Action
{
public String execute(String str);
}
LowerAction.java
package beantest;
import org.springframework.context.*;
import org.springframework.context.support.*;
public class LowerAction implements Action {
private String message;
public String getMessage()
{
return message;
}
public void setMessage(String string)
{
message = string;
}
public String execute(String str)
{
return (getMessage()+str).toLowerCase();
}
}
UpperAction.java
package beantest;
public class UpperAction implements Action
{
private String message;
public String getMessage() {
return message;
}
public void setMessage(String string) {
message = string;
}
public String execute(String str) {
return (getMessage() + str).toUpperCase();
}
}
配置文件bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<description>Spring Quick Start</description>
<bean id="TheAction" class="beantest.LowerAction">
<property name="message">
<value>HeLLo </value>
</property>
</bean>
</beans>
使用 ApplicationContext 来操作他们。
public static void main(String[] args)
{
System.out.println("Hello!");
try
{
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
Action action = (Action) ctx.getBean("TheAction");
System.out.println(action.execute("Rod Johnson"));
}
catch(Exception e)
{
e.printStackTrace();
}
}
除此之外,spring framework 还提供了很多有用的东西,比如一个 MVC 框架,提供了持久层的封装,包括 Jdbc 封装和 ORM 的封装。当然还有很多好用的功能,正待发掘中。
参考资料:
Spring In Action (Manning)
Spring 开发指南
也欢迎有这方面兴趣的朋友来和我探讨了。