目录

一.spring框架概述

1.spring体系架构介绍

2.spring的应用场景

(1)SpringMVC+Spring+Hibernate/Mybatis

(2)远程服务

二.控制反转(IOC)和依赖注入(DI)

1.传统方式和IOC例子实现

2.控制反转的概念

3.传统方式和控制反战的对比

三.Spring IoC入门

1.创建项目

2.编写Java类

3.传统方式创建实例

4.IOC方式创建实例

一.spring框架概述

 Spring是2003年兴起的一个轻量级的Java开源框架,帮助开发团队构建简单、便携、快速和灵活的基于Java的系统,主要用于企业应用领域。这套框架构建的应用有着简单、便携、快速和灵活的特点。与EJB相比,它是一个轻量级的应用开发平台。Spring的用途并不限于服务器端的开发,它可以用于各种Java程序的开发。

 简单来说,Spring是一个支持控制反转(IoC)和面向切面(AOP)的轻量级的框架,使你能够用"plain old Java objects"(POJOs,简单普通的Java对象)来构建应用。你可以在Java SE编程模型、Java EE编程模型中应用它。

1.spring体系架构介绍

Spring由20多个模块组成,它们可以分为核心容器(Core Container)、数据访问/集成(Data Access/Integration)、Web、面向切面编程(AOP, Aspect Oriented Programming)、设备(Instrumentation)、消息发送(Messaging)和测试(Test)。体系架构如图1-1所示。

 


JAVA框架类似Spring java框架 spring_java

图1-1 spring体系架构图

 

2.spring的应用场景

Spring是一个轻量级解决方法,也是一个构建企业应用的一站式解决方案。Spring也是模块化的,可以根据需求选择所需的模块。同时Spring被设计成非侵入式的,这意味着你的逻辑代码和框架本身没有依赖性

(1)SpringMVC+Spring+Hibernate/Mybatis

这是现在较为流行的传统Web开发方式,使用SpringMVC作为Web服务框架。

(2)远程服务

 现在Web服务器是实现远程服务的API,而不是处理网页请求。最常见的远程服务就是RESTful风格的服务,也是目前非常流行的编程模式,它可以使用jQuery作为客户端,和服务器之间通过AJAX、JSON实现通信和数据交换。

二.控制反转(IOC)和依赖注入(DI)

1.传统方式和IOC例子实现

在讲解控制反转之前,先按照传统方式敲个例子。

(1).创建java web项目:SpringIOC

JAVA框架类似Spring java框架 spring_JAVA框架类似Spring_02

(2).创建类Persion

public class Persion {
	private Integer pid;
	private String  pname;
	private IdCard  idcard=new IdCard();//自己主动创建
	public Integer getPid() {
		return pid;
	}
	public void setPid(Integer pid) {
		this.pid = pid;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public IdCard getIdcard() {
		return idcard;
	}

}

(3).创建类IdCard

package com.hwadee.spring.entity;
public class IdCard {
	private Integer cid;
	private String cname;
	
	public Integer getCid() {
		return cid;
	}
	public void setCid(Integer cid) {
		this.cid = cid;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	
}

(4).创建一个测试类:springIoc

package com.hwadee.spring.test;
import com.hwadee.spring.entity.Persion;
public class springIoc {
	public void traditionalWay() {
		Persion persion = new Persion();
		persion.getIdcard().setCname("信用卡");
		persion.setPid(2011);
		persion.setPname("杨代洪");
		System.out.println("name:" + persion.getPname() + " cname:" + persion.getIdcard().getCname());
	}
}

现在Persion类中包含有一个IdCard类型的一个成员变量idCard。在传统方式的java程序实现中,一个对象需要什么依赖对象都是由自己自行创建。例如Persion类需要IdCard对象的时候,将由Persion对象自行创建一个IdCard对象。程序运行截图如下:


JAVA框架类似Spring java框架 spring_spring_03

图2-1. 传统方式实现

这种对象依赖的创建方式,运行效果也能达到最初的目标,并且现在在商业项目中也在使用。但是从项目整合设计和松耦合的角度来看,这样做事不合理的。因此我们现在换用控制反转的方式来实现对象依赖的实现。

(1).创建类Persion,注意区分与上面Persion类的不同之处。

/**
 * 
 */
package com.hwadee.spring.entity;

/**
 * @author Administrator
 *
 */
public class Persion {
	private Integer pid;
	private String  pname;
	private IdCard  idcard;//=new IdCard();
	public Integer getPid() {
		return pid;
	}
	public void setPid(Integer pid) {
		this.pid = pid;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public IdCard getIdcard() {
		return idcard;
	}
	public void setIdcard(IdCard idcard) {
		this.idcard = idcard;
	}

}

(2).创建类IdCard,同上。

/**
 * 
 */
package com.hwadee.spring.entity;

/**
 * @author Administrator
 *
 */
public class IdCard {
	private Integer cid;
	private String cname;
	
	public Integer getCid() {
		return cid;
	}
	public void setCid(Integer cid) {
		this.cid = cid;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	
}

(3).创建一个容器类SpringContainer。

/**
 * 
 */
import com.hwadee.spring.entity.IdCard;
import com.hwadee.spring.entity.Persion;

/**
 * @author Administrator
 *
 */
public class SpringContainer {//模拟IOC容器
    public Persion getPersion() {
    	Persion persion =new Persion();
    	IdCard idcard=new IdCard();
        persion.setIdcard(idcard);
		return persion;
    }
}

(4).创建测试类

package com.hwadee.spring.test;
import com.hwadee.spring.entity.Persion;

public class springIoc {
	public void container() {
		SpringContainer sc = new SpringContainer();
		Persion persion = sc.getPersion();
		persion.getIdcard().setCname("信用卡");
		persion.setPname("杨代洪");
		System.out.println("姓名:" + persion.getPname() + " 卡类型:" + persion.getIdcard().getCname());

	}
}

现在我们要获取Persion对象,只需通过实例化SpringContainer后的对象的getPersion()方法获取即可。


JAVA框架类似Spring java框架 spring_spring_04

图2-2 IOC实现

2.控制反转的概念

IoC(Inversion of Control)也称为“控制反转”,它不是什么技术,而是一种设计思想。在Java开发中,IoC意味着将你设计好的对象交给容器控制,而不是传统的由你在对象内部直接控制。IOC是spring的核心功能,通过Ioc容器就可以很放标的管理java bean。在Ioc容器的帮助下,可以实现松耦合,模块分离且共享。

3.传统方式和控制反转的对比

在传统方式的Java程序实现中,一个对象需要什么依赖对象都是由自己主动创建。例如,在类A中需要类B的对象时,将由类A自己主动创建一个类B的对象。

JAVA框架类似Spring java框架 spring_控制反转_05

 

在控制反转的设计思想中,一个对象需要的依赖对象由容器创建,然后容器再将依赖对象赋给它。例如,当类A中需要类B的对象时,A并不会创建一个B对象。现在,类A提供了一个setB的方法,当Container创建好对象后,自动调用类A的setB赋值。

JAVA框架类似Spring java框架 spring_JAVA框架类似Spring_06

三.Spring IoC入门

1.创建项目

(1)创建一个Java项目。

(2)将Spring的jar文件加入到项目的classpath中。需要导入四个核心(beans、core、context、expression)和一个依赖(commons-loggins...jar)。

导入Spring核心开发包到创建工程:

spring-beans-4.3.4.RELEASE.jar
spring-context-4.3.4.RELEASE.jar
spring-core-4.3.4.RELEASE.jar
spring-expression-4.3.4.RELEASE.jar

还需要下载commons-logging日志包:

commons-logging-1.2.jar

提示:从Spring3.0.X版本开始,asm的jar包已经被合并到spring core包中,不需要再单独下载。

(3)在src中编写Spring配置文件:applicationContext.xml。

2.编写Java类

Spring支持Java类编程,也支持面向接口编程。面向接口编程使用接口分离接口和实现类,其中接口提供了规范声明,实现类提供了具体实现。

public interface UserService {
public void register(User user) throws UserException ;
}
 
public class UserServiceImpl implements UserService {
@Override
public void register(User user) throws UserException {
//输出用户信息
System.out.println("name:" + user.getName()+"|username:" + user.getUsername());
}
}

3.传统方式创建实例

在传统方式中,直接new一个对象即可。

public class TestHello {
public static void main(String[] args) {
//传统自己创建
UserService service = new UserServiceImpl();
}
}

4.IOC方式创建实例

只需要将实现类配置到Spring文件中,当应用程序需要实例对象时,就可以直接从Spring容器中获得。

(1)控制反转(IOC)配置

配置文件名称通常命名为applicationContext.xml,一般放在classpath下(src)。 

<?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.xsd">
<!-- <bean>配置由Spring创建的对象 -->
<!-- id是一个唯一标识,不允许重复 -->
<!-- class需要创建实例的全限定类名 -->
<bean id="userServiceId" class="com.hwadee.spring.service.impl.UserServiceImpl">
</bean>
</beans>

(2)从Spring容器获得对象

public void testIoC(){
//1 获得容器
String xmlPath = "applicationContext.xml";
AbstractApplicationContext context = new ClassPathXmlApplicationContext(xmlPath);
//2获得对象。不需要自己new,都是从spring容器获得
UserService userService = context.getBean("userServiceId", UserService.class);
userService.register(user);
//3、关闭Spring的IOC容器
context.close();
}

这里使用了IoC的概念,原本在程序中手动创建UserService对象的控制权交由Spring框架管理。简单说,就是创建UserService对象控制权被反转到了Spring框架。