Spring初探
Spring是什么
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能有EJB完成的事情。然而,Spring的用途不仅限于服务器的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
n 目的:解决企业应用开发的复杂性
n 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
n 范围:任何Java应用
Spring特点
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布,并且Spring所需的处理开销也是微不足道的,此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象在初始化时不等对象请求就主动将依赖传递给它。
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务()管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已,它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事物支持。
容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独地示例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式的组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给你。
准备工作:
Ø 下载SpringFramework,并解压到指定目录。
Ø 在IDE(此用MyEclipse)中新建一个项目,并将Spring.jar、commons-loggin.jar将其相关类库加入项目。
构建Spring基础代码
示例基础代码包括:
1、 GreetingDao接口:
GreetingDao接口定义了一个sayGreeting()方法
package cn.csdn.dao;
public interface GreetingDao {
void sayGreeting();
}
2、 GreetingDao接口的一个实现GreetingDaoImpl
package cn.csdn.dao;
public class GreetingDaoImpl implements GreetingDao {
private String say;
public GreetingDaoImpl() {}
public GreetingDaoImpl(String say) {
this.say = say;
}
public void setSay(String say) {
this.say = say;
}
@Override
public void sayGreeting() {
// TODO Auto-generated method stub
System.out.println("我说的是:"+say);
}
}
GreetingDaoImpl中定义了一个私有的say变量。
3、 GreetingService接口—继承GreetingDao接口:
package cn.csdn.service;
import cn.csdn.dao.GreetingDao;
public interface GreetingService extends GreetingDao{}
4、 GreetingService接口的一个实现GreetingServiceImpl
package cn.csdn.service;
import cn.csdn.dao.GreetingDaoImpl;
public class GreetingServiceImpl implements GreetingService {
private GreetingDaoImpl greetingDaoImpl;
public GreetingServiceImpl() {}
public GreetingServiceImpl(GreetingDaoImpl greetingDaoImpl) {
this.greetingDaoImpl = greetingDaoImpl;
}
public void setGreetingDaoImpl(GreetingDaoImpl greetingDaoImpl) {
this.greetingDaoImpl = greetingDaoImpl;
}
@Override
public void sayGreeting() {
greetingDaoImpl.sayGreeting();
}
}
GreetingServiceImpl中定义了一个GreetingDaoImpl类型的变量。
5、 Spring配置文件(bean.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<!—定义一个bean对象-->
<bean id="greetingDaoImpl" class="cn.csdn.dao.GreetingDaoImpl">
<!--bean的一个属性,并为其赋值-->
<property name="say" value="Spring 春天"></property>
</bean>
<!—定义一个bean对象-->
<bean id="greetingServiceImpl" class="cn.csdn.service.GreetingServiceImpl">
<!--bean对象的属性,因其是GreetingDaoImpl 类型的,所以用到了fef属性-->
<property name="greetingDaoImpl" ref="greetingDaoImpl"></property>
</bean>
</beans>
文件位于src下,名为applicationContext.xml
6、 测试代码(这里用Junit测试)
import org.junit.Test;
import org.springframework.*;
import cn.csdn.service.GreetingServiceImpl;
public class GreetingText {
@Test
public void test(){
//解析applicationContext.xml 文件
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取JavaBean对象,需要强制造型
GreetingServiceImpl gsi=(GreetingServiceImpl) ac.getBean("greetingServiceImpl");
//调用方法
gsi.sayGreeting();
}
@Test
public void test2(){
Resource resource=new FileSystemResource("src/applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(resource);
GreetingServiceImpl gsi=(GreetingServiceImpl) factory.getBean("greetingServiceImpl");
gsi.sayGreeting();
}
}
输出结果:我说的是:Spring 春天
我们将applicationContext.xml中的配置稍加修改
<bean id="greetingDaoImpl" class="cn.csdn.dao.GreetingDaoImpl">
<property name="say" value="Spring 春天22222"></property>
</bean>
再次运行测试代码,看到:
结果:我说的是:Spring 春天22222
示例完成!
看出了什么?
仔细观察一下上面的代码,可以看到:
1、 我们的所有程序代码中(除测试代码之外),并没有出项Spring中的任何组件。
2、 GreetingDaoImpl和GreetingServiceImpl的属性均由Spring通过读取配置文件applicationContext动态设置。
3、 客户代码(这里就是我们的测试代码)仅仅面向接口编程,而无需知道实现类的具体名称。同时,我们可以很简单的通过修改配置文件来切换具体的底层实现类。
上面所说的这些,对于我们的实际开发有何帮助?
首先,我们的组件不需要实现框架指定的接口,因此可以轻松的将组件从Spring中脱离,甚至不需要任何修改(这在基于EJB框架实现的应用中式难以想象的)。
其次,组件间的依赖关系减少,极大改善了代码的可重用性。
上面的例子中,我们通过Spring,在运行期动态将字符串“我说的是:Spring 春天”注入到GreetingDao实现类的say属性中。
Spring通过依赖注入模式,将依赖关系从编码中脱离出来,从而大大降低了组件之间的耦合,实现了组件真正意义上的即插即用。这也是Spring最具有价值的特性之一。
面向接口编程
即使没有Spring,实现面向接口的设计也不困难。Spring对于面向接口设计的意义,在于它为面向接口编程提供了一个更加自然地平台。基于Spring开发,程序员会自然而然倾向于使用接口来定义不同层次之间的关联关系,这种自发的倾向性,来自于Spring所提供的简单舒适的依赖注入实现。Spring使得接口的定义和使用不再像传统编程中那么繁琐(传统编码过程中,引入一个接口,往往也意味着同时引入一个Factory类,也许还有一个额外的配置文件及其读写代码)。
总结:
Spring是一个从实际项目开发经验中抽取的,可高度重用的应用框架。
分享到:
相关推荐
标题中的“spring 初探”表明我们即将探讨的是Spring框架的基础知识。Spring是Java企业级应用开发中最常用的一个开源框架,由Rod Johnson发起,旨在简化应用程序的开发,提高组件之间的解耦。 首先,Spring框架的...
标题中的“Spring初探共18页.pdf.zip”表明这是一个关于Spring框架的压缩文档,共有18页PDF内容。从标签“Spring初探共18页.pdf”我们可以推测,这份资料可能是一个关于Spring框架基础入门的学习资料,适合初学者。 ...
- **Spring 初探**:Spring的核心在于依赖注入(DI)和面向切面编程(AOP),提供了一个轻量级的容器来管理对象的生命周期和相互依赖关系。 - **Spring 体系**:包括Core Container(核心容器)、Data Access/...
在Spring初探部分,首先涉及到的是准备工作,包括安装必要的开发环境和配置工具,为构建Spring基础代码做准备。接下来,指南会介绍Spring的基础语义,特别是依赖注入(Dependency Injection,简称DI)的概念及其在...
#### Spring初探与准备工作 Spring框架的核心在于其独特的依赖注入(DI)机制。DI允许开发者将组件之间的依赖关系外部化,从而实现组件间的解耦合,使得代码更加模块化和可测试。为了开始使用Spring,首先需要准备...
SpringCloud服务拆分初探与案例解析 cloud-demo第一次 SpringCloud服务拆分初探与案例解析 cloud-demo第一次 SpringCloud服务拆分初探与案例解析 cloud-demo第一次 SpringCloud服务拆分初探与案例解析 cloud-demo第...
1. **Spring初探** 在这一章中,我们将从Spring框架的基础出发,介绍其诞生背景和主要目标。我们会讲解Spring如何简化Java应用的开发,以及它提供的依赖注入(Dependency Injection, DI)机制,这是Spring的核心...
#### Spring初探:基础知识与构建环境 ##### 准备工作 在着手Spring Framework的开发之前,开发者需要搭建好必要的开发环境。这包括但不限于安装Java开发工具包(JDK),配置开发环境(如IDEA或Eclipse),并确保具备...
#### Spring初探:框架入门 - **准备工作**:在开始使用Spring框架之前,需要进行一系列的准备工作,包括环境搭建、框架下载和配置。Spring框架通常通过Maven或Gradle等构建工具进行管理,确保项目能够顺利地集成...
#### Spring初探 Spring框架的核心优势在于其对Java EE复杂性的简化处理,通过提供一系列的模块,如核心容器、数据访问/集成、Web、AOP、测试等,使得开发者能够专注于业务逻辑而非框架细节。本节将带领读者了解...
##### Spring初探 - **准备工作**:在深入研究Spring之前,作者建议先进行一系列的准备活动,包括环境搭建、工具配置等,确保开发者能够顺利地运行和测试Spring相关的代码示例。 - **构建Spring基础代码**:这一...
Spring初探.......................................................................................................................5 准备工作...............................................................