在学习Spring之前,需要回忆一下工厂模式。下面会演示一段代码,自己体会。之所以要工厂模式是因为他有一个好处,很像Spring的用法。在实际开发中,new对象对于一个开发人员来说是一件非常需要小心谨慎的事情,也很考验人。new对象需要考虑的因素比较多,所以不要轻易去new,最好去调用。在工厂模式中,它将一些功能类封装起来,开发者只需去调用。在Spring中有个控制反转(IOC)和这个很像,可以自己体会一下。
一、工厂模式回顾(代码实例)
public class Test { public static void main(String[] args) { //未用工厂模式 要在这里自己创建(如下一行) //TV tv= new TV(100,50,"绿色","熊猫"); //我们负责创建这个对象的实例 ,产生了依赖 TV tv1 =TVFactory.createTV(); //使用工厂,可以解耦合 TV tv2 =TVFactory.createTV(); System.out.println(tv1==tv2); //false tv1.play(); tv2.play(); } } class TV { private int height; private int width; private String color; private String pinpai; TV(int height,int width,String color,String pinpai){ this.height=height; this.width=width; this.color=color; this.pinpai=pinpai; } void play(){ System.out.println("电视机外观:"); System.out.println(pinpai+" " +height + width+color ); System.out.println("--电视开始播放----"); System.out.println("播放美国的节目...."); } } class TVFactory { //生产电视 public static TV createTV(){ TV tv= new TV(100,50,"绿色","熊猫"); return tv; } }
二、Spring 简介
Spring 是一个 开源的、控制反转 (inversion of control -> IOC ) 的面向切面( AOP ) 的容器框架,它主要的目的是简化企业开发。
使用Spring 的好处:
1.降低组件之间的耦合度,实现软件各层之间的解耦;
2.可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播;
3.容器提供单例模式支持,开发人员不再需要自己编写实现代码;
4.容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能;
5.容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate;
6.Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发;
Spring 负责管理容器中所有的组件, 这些组件统称为 Bean , 在Spring 的概念里,一切都是Bean,其实Spring就是面向Bean的编程(BOP,Bean Oriented Programming )。组成Spring的模块(组件)都可以单独存在 主要模块如下:
1)Srping Core (核心容器)
Supporting utlities
Bean container
核心容器: 提供Spring 框架的基本功能,核心容器的主要给件是BeanFactory,它是工厂模式的实现。BeanFactory 例用控制反转(IOC) 模式将应用程序的配置和依赖规范与实际的应用程序代码分开。
2)Spring Context (上下文的一个配置文件)
Application Context
Ui Support
validation
JNDI EJB supprot and remodeling Mail
Spring 上下文是一个配置文件,向Spring框架提供上下文信息。Spring 上下文包括企业服务,例如
JNDI 、EJB、电子邮件、国际化、校验和调度功能。
3)Spring AOP
Source-level
metadata
AOP infrastructure
通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了Spring 框架中。所以,可以很容易地使Spring框架管理的任何对象支持AOP 。Spring AOP 模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用Spring AOP ,不用依赖EJB 组件,就可以将声明性事务管理集成到应用程序中。
4)Sping DAO
Transaction infrastructure
JDBC support
DAO support
DBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的DAO 异常层次结构。
5)Spring ORM
Hibernate Support
IBatis support
JDO Support
Spring 框架插入了若干个ORM 框架,从而提供了ORM的对象关系工具,其中包括JDO 、Hibernate 和iBatis SQLMap 。 所有这些都遵从Spring 的通用事务和DAO 异常层次结构。
6) Spring WEB
WebApplicationContext
Multipart resolver
Web Utilites
Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。另外,这个模块还提供了一些面向服务支持。例如:实现文件上传的multipart请求,它也提供了Spring和其它Web框架的集成,比如Struts、WebWork。
7) Spring MVC
Web Mvc
framework
JSP/velocity
PDF/Export
Spring为构建Web应用提供了一个功能全面的MVC框架。虽然Spring可以很容易地与其它MVC框架集成,例如Struts,但Spring的MVC框架使用IoC对控制逻辑和业务对象提供了完全的分离。它也允许你声明性地将请求参数绑定到你的业务对象中,此外,Spring的MVC框架还可以利用Spring的任何其它服务,例如国际化信息与验证。
Spring带来了复杂的J2EE开发的春天。它的核心是轻量级的IoC容器,它的目标是为J2EE应用提供了全方位的整合框架,在Spring框架下实现多个子框架的组合,这些子框架之间可以彼此独立,也可以使用其它的框架方案加以代替,Spring希望为企业应用提供一站式(one-stopshop)的解决方案
三、Spring 中的重要概念
1) IOC (控制反转)
应用本身不负责依赖对象的创建和维护,而是交给其他程序去创建, 这样,控制权就由应用转到了外部容器,控制权的转移, 就叫控制反转。
//例子: public class UserAcrion{ private IUserDao dao =new UserDaoImpl(); //创建一个dao对象 //业务方法 public String execute(){ dao.addUser(user); } }
//反转形式的 public class UserAcrion{ UserAcrion(IUserDao dao){ this.dao=dao; } private IUserDao dao; //业务方法 public String execute(){ dao.addUser(user); } } //其他程序调用的时候 IUserDao dao=new UserDaomysqlImpl(); //其他程序控制这个对象的创建 new UserAcrion(dao);
2) DI (依赖注入)
当我们把依赖对象交给外部容器负责创建, 上面的程序可以改成
public class UserAcrion{ private IUserDao dao; //依赖对象 ...要生成 set 方法 public String execute(){ dao.addUser(user); } }
在程序运行期,动态的由外部容器(Srping),将依赖对象注进来,称为依赖注入。
3) AOP (Aspect Oriented Programming) 面向切面编程
例如:Struts2 中拦截器
可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。