`
阅读更多

下面的一系列的文章的所有内容主要来源于Spring2.5 Reference和传智播客Spring视频,文章中所有的例子都是基于Spring2.5学习和测试的。

Spring是一个开源的控制反转(Inversion of Control,IoC)和面向切面(AOP)的容器框架。它的主要目的是简化企业开发。

一。容器(Container)
  容器可以管理对象的生成、资源取得、销毁等生命周期,甚至建立对象与对象之间的依赖关系。Spring提供了容器功能,您可以使用一个配置文件(通常是XML),在当中确定对象名称、确定如何产生对象(Prototype方式或Singleton方式)。在启动容器之后,所有的对象都可以直接取用,不用再编写任何一行代码来产生对象,或是建立对象与对象之间的依赖关系。具体从Java的角度来说,容器就是一个Java所编写的程序,原先必须自行编写程序以管理对象,现在容器会自动帮你做好这一切。

二.控制反转(Inversion of Control,IoC)

public class CustomerMgrServiceBean{
	private CustomerDao customerDao = new CustomerDaoImpl();
	public void save(Customer customer){
		customerDao.save(customer);
	}
}

 如上所示代码,CustomerDaoImpl是在应用程序内部创建及维护的。而所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护由外部容器负责。这样控制权就由应用程序转移到了外部容器,控制权的转移就是所谓反转。当我们把依赖对象交给外部容器负责创建时,那么上面的CustomerMgrServiceBean类可以改成如下所示:

public class CustomerMgrServiceBean{
	private CustomerDao customerDao ;
  public  CustomerMgrServiceBean(CustomerDao customerDao){
      this.customerDao = customerDao;      
  }	
  public void save(Customer customer){
		customerDao.save(customer);
	}
}

 上面的代码是通过构造器参数,让容器将创建好的依赖对象CustomerDaoImpl注入进CustomerMgrServiceBean,当然也可以使用setter方法进行注入。所谓依赖注入(Dependency Injection)就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。

三.使用Spring的好处
1。降低组件之间的耦合度,实现软件各层之间的解耦。
2。可以使用容器提供的众多的服务,如:事务管理服务,消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务,也不需要处理复杂的事务传播。
3。容器提供单例模式支持,开发人员不再需要自己编写实现代码。
4。容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
5。容器提供了众多的辅助类,使用这些类能够加快应用的开发,如:JdbcTemplate,HibernateTemplate.
6。Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样便于应用的开发。

如果不用Spring的事务管理,对于下面的需求,Bean1和Bean2已经写好:

public void payment(){
    Bean1.update();//更新金额
    Bean2.save(); //记录操作日志
}

 如果我们不使用Spring,针对下面这两种业务需求,我们该如何做?
第1种可能的业务需求:要求Bean1.update()和Bean2.save()在同一个事务中执行。
第2种可能的业务需求:要求Bean1.update()的事务是否成功,都要记录操作日志

public class Bean1{
	public void update(){
	//中间省略了很多代码,只是表达意思
		Connection conn = null;
		conn.setAutoCommit(false);
		Statement.executeUpdate("update aaccount set amount=? where id=?");
	}
}
	public void save(){
	//中间省略了很多代码,只是表达意思
		Connection conn = null;
		conn.setAutoCommit(false);
		Statement.executeUpdate("insert into Log(content) values(?)");
	}
}

 在不修改原来代码的情况下,是不能实现需求的功能的。可能要将代码修改成如下所示,实现第一种需求,但想实现第二种需求就更复杂了:

public void payment(){	C
		Connection conn = null;
		conn.setAutoCommit(false);
    Bean1.update(conn);//更新金额
    Bean2.save(conn); //记录操作日志
   ....
}
public class Bean1{
	public void update(Connection conn){
	//中间省略了很多代码,只是表达意思
		Statement.executeUpdate("update aaccount set amount=? where id=?");	
} 
public class Bean2{
	public void save(Connection conn){
	//中间省略了很多代码,只是表达意思
		Statement.executeUpdate("insert into Log(content) values(?)");
	}
}

 如果使用Spring,我们只需要通过声明式的事务属性配置就可以轻松的实现这两种业务需求:

1:要求Bean1.update()和Bean2.save()在同一个事务中执行。
2:要求Bean1.update()的事务是否成功,都要记录操作日志。如下所示:

@Transactional(propagation=Propagation.Required)
public void payment(){
    Bean1.update();//更新金额
    Bean2.save(); //记录操作日志
}
public class Bean1{
@Transactional(propagation=Propagation.Required)
	public void update(Connection conn){
		Statement.executeUpdate("update aaccount set amount=? where id=?");
	}
} 
public class Bean2{
@Transactional(propagation=Propagation.RequiresNew)
	public void save(Connection conn){
		Statement.executeUpdate("insert into Log(content) values(?)");
	}
}

四。Spring到底应该是轻量级框架还是重量级框架

其实划分一个应用是属于轻量级还是重量级,主要应该看它使用了多少服务。
对于Spring容器,它提供了很多服务,但这些服务并不是默认为应用打开的,当应用需要某种服务,还需要指明使用该服务,如果应用使用的服务很少,如:只使用了Spring的核心服务,那么我们认为此时应用属于轻量级的,如果应用使用了Spring提供的大部分服务,这时就应该把它划入重量级。目前EJB容器就因为默认为应用提供了EJB规范中所有的功能,所以它应该划入重量级。

五。Spring需要的jar包

使用Spring需要的jar包:
dist\spring.jar
lib\jakarta-commons\commons-logging.jar
如果使用了切面编程(AOP),还需要下列jar文件
lib/aspectj/aspectjweaver.jar和aspectjrt.jar
lib/cglib/cblib-nodep-2.1_3.jar
如果使用了JSR-250中的注解,如@Resource/@PostConstruct,还需要下列的jar文件 lib/j2ee/common-annotations.jar

六。解决编写spring配置文件时,不能出现帮助信息的问题
由于spring的schema文件位于网络上,如果机器不能连接到网络,
那么在编写配置信息的时候就无法出现提示信息,解决方法有两种:
1。让机器上网,eclipse会自动从网络上下载schema文件并缓存在硬盘上。
2。手动添加schema文件,方法如下:
windows->preferences->myeclipse->files and editors->xml->xmlcatalog,点"add",在出现的窗口中的Key Type中选择URI,在location中选"File system",然后在spring解压目录的dist/resources目录中选择spring-beans-2.5.xsd,回到设置窗口的时候不要急着关闭窗口,应把窗口中的Key Type改为Schema location ,Key改为http://www.springframework.org/schema/beans/spring-beans-2.5.xsd。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics