Spring框架
Spring有春天、弹簧、跳跃和泉眼的意思。Spring是一个开源的框架,是为了解决企业应用程序开发复杂性由RodJohnson创建的。虽然Spring是为企业级应用推出的,但是所有的java系统开发都可以使用Spring,包括桌面应用程序和企业级Web应用。Spring总不是凭空而出现的,任何框架也是,前面我们所说的struts和hibernate都有他出现的原因,以及是哪些问题促使了人们开发出新的框架。那为什么使用Spring框架呢?
从抽象工厂开始说起
曾近我们在Dao层为了解决更换数据库的难题,我们自己动手写工厂,让工厂去创建从而在客户端调用时隐藏了具体的创建细节,这样我们就可以更换数据库了。在Service层也同样是可以用到抽象工厂,为了适应用户需求变动,我们在sevice层应用抽象工厂,让web调用只调用接口,具体创建放到工厂里,这样我们就可以通过更换不同的.class文件来更换不同的业务实现。下面我们就简单的通过一个程序来说明。
Dao层
UserDao接口代码如下所示。
public interface UserDao { public void addUser(String username,String password); } Dao层UserDao实现UserDaoMySqlImpl.java public class UserDao4MySqlImpl implements UserDao { @Override public void addUser(String username, String password) { System.out.println("UserDao4MySqlImpl.addUser()"); } }
Dao层UserDao实现UserDaoOracleImpl.java
public class UserDao4OracleImpl implements UserDao { @Override public void addUser(String username, String password) { System.out.println("UserDao4OracleImpl.addUser()"); } }
这样我们创建了Dao层的接口,并且给出了对于不同数据库驱动的不同实现。
业务逻辑层manager(在这里先不引入工厂)
Manager层接口UserManager.java
public interface UserManager { public void addUser(Stringusername,String password); }
Manager层实现UserManagerImpl.java
public class UserManagerImpl implements UserManager { @Override public void addUser(String username, String password) { //服务(对象)定位,由我们的应用程序负责服务(对象)定位.//主动 //UserDao userDao = new UserDao4MySqlImpl(); //如果想要换实现,就要可以换了. UserDao userDao = new UserDao4OracleImpl(); userDao.addUser(username,password); } }
在这里尚且没有使用抽象工厂+配置文件,来看我们的客户端调用。
public class client { /** * @param args */ public static void main(String[] args) { //TODO Auto-generated method stub //服务(对象)定位,由我们的应用程序负责服务(对象)定位. //因为自己产生了主动的查找.所以必须依赖,并且写死. UserManager userManager = new UserManagerImpl(); userManager.addUser("张三","123"); } }
我们如果要更换数据库需要打开UserManagerImpl类去更改不同的实现,同样在client调用如果要更改不同的业务也需要不同的UserManager实现。即便我们加上抽象工厂+配置文件同样同样需要在界面调service层使用和在调用Dao层使用,让程序变的更加复杂,每个项目都要去写,多个项目也是如此,当业务逻辑复杂的时候,我们就需要些多个工厂去创建不同的产品,并且在使用工厂的时候还要注意每次创建保证一个实例,这所有的一切一切,即便是工厂都是我们程序员手动去写的,这样就比较重复了,是我们去管理这些类,为什么不让机器去管理呢?
所以Spring应运而生,Spring封装了更多的重复和复杂,不但封装了工厂,并且封装了创建时出现的线程安全问题,Spring可以管理Connection,在使用hibernate的时候我们需要管理session,一线程一session,session连接我们lazy的有效期,spring提供一个Filter,我们不用再管理session的创建和销毁,spring帮我们去管理了。
下面大概了解一下Spring中将会时常提起的一些名词。
简单的来说,Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。
轻量级:大小与开销方面而言Spring是轻量的。
非侵入式:Spring应用中的对象不依赖于Spring的特定类。
控制反转:Spring通过一种称为控制反转(IOC)的技术促进了松耦合。当应用了IOC一个对象依赖的其他对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。
切面编程:Spring提供了切面编程的丰富支持,允许分离应用的业务逻辑与服务。
容器:Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建—一个可配置的原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例,以及它们是如何关联的。
框架:Spring可以将简单的组件配置,组成为复杂的应用,在Spring中应用对象被声明式组合,典型地是在一个XML文件里,Spring提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了我们。
大概知道这些名词吧,后续的文章会应用实例详细的说明Spring的功能。
下篇我们将把上述的例子用Spring来实现,从而对比出Spring的IOC强大之处。