Spring是什么
spring是一个开源的java框架,集成了各种主流的技术包括web mvc,orm,ejb,rmi,javamail等
他就象一个粘合济,在实际项目中,将前后台程序粘合在一起,构建出一个完整的系统。
spring中的各个组件也可独立使用,你可以在你的项目中选择性的使用spring提供的某一部分功能
Spring的核心是ioc和aop
什么是IOC
Inversion of Control,控制反转或反转控制,其和另外一个概念DI-Dependency Injection依赖注入
等价。
到底如何来理解IOC?
IOC确切的说,他是一种思想、概念,跟OOP是一种编程思想一样,他是在大量的项目实践中总结出来了
的一种精妙地程序设计思想。在原先的程序设计中,我们通常是通过new XXX(),其中,XXX就是某个类
的名称,在没有ioc思想引入时,我们程序中大量充斥着new XXX()这样的代码。这些代码都需要我们程
序员手工编写。而引入了ioc思想之后,对象的管理全部交给Spring这个容器来管理,当我们程序需要
对应类的对象时,我们直接从Spring容器里面获取,换句话说,就是Spring容器把产生好的对象交给了
我们的程序,这种方式就叫做注入(就跟医生拿着可怕的针管将液体注入到我们的屁股上一样,为什么
要注入,还不是你的屁股需要嘛!因为你需要,所以我给你,这就是DI)
而IOC的深层含义就是,将原先对象产生的主动权交给了Spring容器,由Spring容器来为我们完成对象的
new的过程,并将对象在我们需要时交给我们。
Spring正是IOC思想的一个完美产物和实践者!
什么是aop
Aspect Oriented Programming,面向方面编程,它也是一种编程思想,它是对OOP编程思想的一种升华
OOP强调的是对象,而aop强调的是面(不是饺子)
那么,什么是面?
如果拿我们的教室做比方,那么教室的前门和后窗就是一个面,一个截面,通过这样的截面,将我们这块
空间分成了室内、窗外和门外三部分。
如果拿我们吃的汉堡做比方,那么汉堡的夹心的前后就是一个面,一个截面,通过这样的截面,将我们的
普通面包分成了面包上层、夹心、面包下层。
如果。。。
还是拿我们的程序代码来说,
如果我们的dao用jdbc实现,那么在dao的每一个方法里都充斥着这样的代码,
打开连接
执行sql语句
关闭连接
那么,这时,我们就可以在执行sql前后做出一个截面,通过这样的截面,将我们的程序代码分开,将打开
连接和关闭连接交给AOP去做,我们程序员只关注执行不同sql语句部分,避免了在dao的每个方法中都要编
写重复的打开连接和关闭连接代码。
如果我们的dao用hibernate实现,那么在dao的每一个方法里都充斥着这样的代码
打开session
执行session动作
关闭session
同理,我们就可以在执行session动作前后做出一个截面,通过这样的截面,将我们的程序代码分开,将打开
session和关闭session交给AOP去做,我们程序员只关注执行session动作,避免了代码的重复岂不更好
这就是AOP,好好理解吧,那可是个漫长的思想体验过程!祝你好运!
-----------------------------------------------------------------------------------------------------------------------------------------------
spring的另外一个入门概念
一、 Spring诞生
Spring是一个开源框架,目前在开源社区的 人气很旺,被认为是最有前途的开源框架之一。她是由Rod Johnson创建的,她的诞生是为了简化企业级系统的开发。说道Spring就不得不说 EJB,因为Spring在某种意义上是EJB的替代品,她是一种轻量级的容器。用过EJB的人都知道EJB很复杂,为了一个简单的功能你不得不编写多个 Java文件和部署文件,他是一种重量级的容器。也许你不了解EJB,你可能对“轻(重)量级”和“容器”比较陌生,那么这里我简单介绍一下。
1、什么是容器
“容 器”,这个概念困扰我好久。从学习Tomcat开始就一直对此感到困惑。感性的来讲,容器就是可以用来装东西的物品。那么在编程领域就是指用来装对象 (OO的思想,如果你连OO都不了解,建议你去学习OO先)的对象。然而这个对象比较特别,它不仅要容纳其他对象,还要维护各个对象之间的关系。这么讲可 能还是太抽象,来看一个简单的例子:
代码片断1:
可 以看到这里的Container类(容器)在初始化的时候会生成一个Speaker对象和一个Greeting对象,并且维持了它们的关系,当系统要用这 些对象的时候,直接问容器要就可以了。这就是容器最基本的功能,维护系统中的实例(对象)。如果到这里你还是感到模糊的话,别担心,我后面还会有相关的解 释。
2、轻量级与重量级
所谓“重量级”是相对于“轻量级”来讲的,也可以说“轻量级”是相对于重量级来讲的。在Spring出现 之前,企业级开发一般都采用EJB,因为它提供的事务管理,声明式事务支持,持久化,分布计算等等都“简化”了企业级应用的开发。我这里的“简化”打了双 引号,因为这是相对的。重量级容器是一种入侵式的,也就是说你要用EJB提供的功能就必须在你的代码中体现出来你使用的是EJB,比如继承一个接口,声明 一个成员变量。这样就把你的代码绑定在EJB技术上了,而且EJB需要JBOSS这样的容器支持,所以称之为“重量级”。
相对而言“轻量级”就是 非入侵式的,用Spring开发的系统中的类不需要依赖Spring中的类,不需要容器支持(当然Spring本身是一个容器),而且Spring的大小 和运行开支都很微量。一般来说,如果系统不需要分布计算或者声明式事务支持那么Spring是一个更好的选择。
二、 几个核心概念
在我看来Spring的核心就是两个概念,反向控制(IoC),面向切面编程(AOP)。还有一个相关的概念是POJO,我也会略带介绍。
1、POJO
我 所看到过的POJO全称有两个,Plain Ordinary Java Object,Plain Old Java Object,两个差不多,意思 都是普通的Java类,所以也不用去管谁对谁错。POJO可以看做是简单的JavaBean(具有一系列Getter,Setter方法的类)。严格区分 这里面的概念没有太大意义,了解一下就行。
2、 IoC
IoC的全称是Inversion of Control,中文翻译反向控 制或者逆向控制。这里的反向是相对EJB来讲的。EJB使用JNDI来查找需要的对象,是主动的,而Spring是把依赖的对象注入给相应的类(这里涉及 到另外一个概念“依赖注入”,稍后解释),是被动的,所以称之为“反向”。先看一段代码,这里的区别就很容易理解了。
代码片段2:
代码片段3:
代码片段4:
-----------------------------------------------------------------------------------------------------------------------------------------------
,Spring在其中是一个非常重要的框架
,Spring在其中是一个非常重要的框架 我 们 在使用ssh整合项目的时候,Spring在其中是一个非常重要的框架,它在其中可以说是一个最核心的框架,提到spring我们不得不提它的IOC容器 的功能了!它是一个大工厂,可以在其中产生和管理很多的bean,下面,请随阿堂一起来好好看看spring的容器功能方面的介绍,这对于我们在解决 ssh框架整合中的问题,进行测试时是非常有用的!
bsp;我们在使用ssh整合项目的时候 1.spring容器
Spring 有两个核心接口BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子 接口,它们代表了Spring容器,Spring容器是产生Bean的工厂,用于管理容器中的Bean。Bean是Spring管理的基本单位,在 spring的J2EE应用中,所有的组件都是Bean。Bean包括数据源、Hibernate的SessionFactory、事务管理器等。
,它在其中可以说是一个最核心的框架,提到
应 用中的所有组件,都处于spring的管理下,都被spring以Bean的方式管理,spring负责创建Bean实例,并管理其生命周期。 Spring里的Bean是非常广义的概念,任何Java对象和Java组件都被当成Bean处理,甚至这些组件,并不是标准的JAVABEAN。
Bean在spring容器中运行,无须感受Spring容器的存在,一样可以接受spring的信赖注入,包括Bean属性的注入、合作者的注入、信赖关系的注入等。
spring容器负责创建Bean实例,所以需要知道每个Bean的实现类,JAVA程序的实现面向接口编程,无须关心Bean实例的实现。但Spring容器必须能精确知道每个Bean的实现类,因此Spring配置文件必须精确配置Bean的实现类。
,Spring在其中是一个非常重要的框架
Spring容器最基本的接口就是BeanFactory.BeanFactory负责配置、创建、管理Bean,它有一个子接口ApplicationContext,因此也称为Spring上下文。Spring容器负责管理Bean与Bean之间的信赖关系。
spring我们不得不提它的IOC容器的
BeanFactory接口包含如下基本的方法:
,它在其中可以说是一个最核心的框架,提到 public boolean containsBean(Stringname),判断Spring容器是否包含id为name的Bean定义
public Object getBean(String name)返回容器id为name的bean
public Object getBean(String name,ClassrequiredType)返回容器中id为name,并且类型为requiredType的Bean,它在其中可以说是一个最核心的框架,提到
public Class getType(String name)返回容器中id为name的Bean的类型
调用者只需使用getBean方法即可获得指定Bean的引用,无须关心Bean的实例化过程,即Bean实例的创建过程完全透明。
BeanFactory有很多实现类,通常使用spring我们不得不提它的IOC容器的 org.springframework.beans.factory.xml.XmlBeanFactory 类。但对于大部分J2EE应用而言,推荐使用ApplicationContext.ApplicationContext是BeanFactory的子接口,其常用实现类是
org.springframework.context.support.FileSystemXmlApplicationContext和
,Spring在其中是一个非常重要的框架
org.springframework.context.support.ClassXmlAplicationContext.
创 建 BeanFactory实例时,必须提供Spring容器管理的Bean的详细配置信息。Springr的配置信息通常采用XML配置文件来设置,因此, 创建BeanFactory实例时,应该提供XML配置文件作为参数。XML配置文件通常使用Resource对象传入
&n
Resource接口用于访问配置文件资源
,它在其中可以说是一个最核心的框架,提到 大部分j2ee应用,可在启动web应用时自动加载ApplicationContext实例,接受Spring管理的Bean无须知道ApplicationContext的存在,一样可以利用ApplicationContext的管理。
,它在其中可以说是一个最核心的框架,提到 对于独立的应用程序,也可以通过如下方法来实例化BeanFactory
,Spring在其中是一个非常重要的框架 //搜索当前文件路径下的beans.xml文件创建Resource对象
InputStreamResource isr=new FileSystemResource(is);
//以Resource对象作为参数,创建BeanFactory的实例 &n
XmlBeanFactory factory=new XmlBeanFactory(isr);
spring我们不得不提它的IOC容器的 或者采用如下方法
&n
//搜索CLASSPATH路径,以CLASSPATH路径下的beans.xml文件创建Resource对象
ClassPathResource res=new ClassPathResource("beans.xml");bsp;我们在使用ssh整合项目的时候
//以Resource 对象作为参数,创建BeanFactory实例
XmlBeanFactory factory=new XmlBeanFactory(res);
,它在其中可以说是一个最核心的框架,提到
如果应用里有多个属性配置文件,则应该采用BeanFactory的子接口ApplicationContext来创建BeanFactory的实例,ApplicationContext通常采用如下两个实现类。
,它在其中可以说是一个最核心的框架,提到
FileSystemXmlApplicationContext,以指定路径的XML配置文件创建ApplicationContext
ClassPathXmlApplicationContext,以CLASSPATH路径下的XML配置文件创建ApplicationContext
,Spring在其中是一个非常重要的框架
bsp;我们在使用ssh整合项目的时候 如果需要同时加载多个XML配置文件,可以采用如下方式
//搜索CLASSPATH路径,以CLASSPATH路径下的applicationContext.xml 和service.xml文件创建ApplicationContext &n
ClassPathXmlApplicationContext appContext=newClassPathXmlApplicationContext(
new String[]{"applicationContext.xml","service.xml"});
spring我们不得不提它的IOC容器的 //事实上,ApplicationContext是BeanFactory的子接口,支持强制类型转换
BeanFactory factory=(BeanFactory) appContext;
,Spring在其中是一个非常重要的框架
当然,也可以支持从指定的路径来搜索特定文件加载:
spring我们不得不提它的IOC容器的
//以指定路径下的applicationContext.xml和service.xml文件创建Applicationcontext &n
FileSystemXmlAplicationContext appContext=new
FileSystemXmlApolicationContext(
new String[]{"applicationContext.xml","service.xml"},Spring在其中是一个非常重要的框架
)
//事实上,ApplicationContext是BeanFactory的子接口,支持强制类型转换
BeanFactory factory=(BeanFactory) appContext;
spring我们不得不提它的IOC容器的
,Spring在其中是一个非常重要的框架 2.使用ApplicationContext
很 多时候,并不是直接使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例。因此,有时候也称 Spring容器为Spring上下文。ApplicationContext是BeanFactory接口的子接口,它增强了BeanFactory的 功能。
ApplicationContext允许以声明方式操作容器,无须手动创建它。可利用如ContextLoader的支持类,在web应用启动自动创建ApplicationContext。当然,也可以采用编程方式创建ApplicationContext
,Spring在其中是一个非常重要的框架
ApplicationContext继承MessageSource接口,因此提供国际化支持资源访问,比如URL和文件,Spring在其中是一个非常重要的框架
事件传递
载入多个配置文件
ApplicationContext包括 BeanFactory的全部功能,因此建议优先使用ApplicationContext,除了对于某些内存非常关键的作用,才考虑使用BeanFactoryspring我们不得不提它的IOC容器的