Spring的简单介绍

Spring

现有的框架(基于MVC)

Daojspservlet框架
HibernatestrutsspringSSH框架
mybatisspringmvcspringSSM框架

一.Spring框架概述

  • Spring是一个开源免费的框架,为了解决企业应用开发的复杂性而创建。Spring框架是一个轻量级的解决方案,可以一站式地构建企业级应用。Spring是模块化的,所以可以只使用其中需要的部分。可以在任何web框架上使用控制反转(IoC),也可以只使用Hibernate集成代码或JDBC抽象层。它支持声明式事务管理、通过RMI或web服务实现远程访问,并可以使用多种方式持久化数据。它提供了功能全面的MVC框架,可以透明地集成AOP到软件中。

二.Spring的介绍

  • 控制反转IOC
  • 依赖注入DI
  • 面向切面编程AOP
    Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。

1.框架特征与功能

  • 轻量: 从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
  • 控制反转Ioc: Spring通过一种称作控制反转(IoC)的技术促进了低耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。 你可以认为IoC与JNDI(Java命名和目录接口)相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。 IoC容器:在程序启动的时候就自动将对象实例化好放到容器中。
  • 面向切面Aop: Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。就是在不改变原对象方法的前提下,使用代理模式来对原对象的方法进行增强。
  • 容器: Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
    框架:Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
  • MVC: Spring的作用是整合,但不仅仅限于整合,Spring 框架可以被看做是一个企业解决方案级别的框架,Spring MVC是一个非常受欢迎的轻量级Web框架。
    所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。
    在这里插入图片描述

控制反转:

  • 控制:控制对象(javabean)的实例化方式,不在通过new的方式了。
  • 反转:将对象实例化过程反转。

2.Spring组成

  • Spring框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式。
    在这里插入图片描述

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

  • 核心容器: 核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  • Spring 上下文: Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
  • Spring AOP: 通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
  • Spring DAO: JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  • Spring ORM(对象关系模型): Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  • Spring Web 模块: Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  • Spring MVC 框架: MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

3.SpringIOC的概念和作用

3.1 IOC的定义

  • 控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,没有IoC的程序中我们使用面向对象编程对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,所谓控制反转就是:获得依赖对象的方式反转了。

IOC控制反转(实例化对象),DI(依赖注入,依赖IOC容器对属性进行注入)

在这里插入图片描述

  • IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从IoC容器中取出需要的对象。

在这里插入图片描述

  • POJO可以理解为javabean,采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
  • 控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。
    在这里插入图片描述

3.2 IOC和DI的区别

  • DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

DI的关键:

  • 谁依赖于谁:当然是应用程序依赖于IoC容器;
  • 为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
  • 谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
  • 注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

4.Spring的实例代码

4.1 使用工厂模式来模拟spring的ioc容器操作(解耦合)

  • CustomerFactory就是我们的一个容器,customer.properties文件就是我们的配置文件。

  • 根据配置文件的配置决定具体的的实现类是哪一个 ,CustomerFactory读取properties配置之后就知道应该实例化那个对象了。 要想实例化不同的对象只需要修改配置文件。

  • 项目目录
    在这里插入图片描述

  • 接口和实现类
    在这里插入图片描述

  • customer.properties

customerMysqlDao=com.nebula.dao.imp.CustomerMysqlDaoImp
customerOracleDao=com.nebula.dao.imp.CustomerOracleDaoImp
  • 工厂类CustomerFactory.java
package com.nebula.factory;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class CustomerFactory {
	//加载配置文件
	//初始化beans.properties文件
	
	private static Properties props = new Properties();
	static{
		InputStream in = CustomerFactory.class.getResourceAsStream("/customer.properties");
		try {
			props.load(in);
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("加载beans.properties文件失败");
		}
	}
	
	//使用反射机制实例化对象
	//从工厂获取一个对象
	public static Object getBean(String name){
		//根据name创建不同的对象
		//通过name在properties文件找到类名称
		String className = props.getProperty(name);
		//通过反射构造类的对象
		try {
			return Class.forName(className).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

}

  • 主程序CustomerAPP.java
package com.nebula;

import com.nebula.dao.imp.CustomerMysqlDaoImp;
import com.nebula.dao.imp.CustomerOracleDaoImp;
import com.nebula.servicedao.CustomerService;
import com.nebula.servicedaoimp.CustomerServiceImp;


public class CustomerAPP {
	public static void main(String[] args) {		
		//调用业务层
		CustomerService customerService1=new CustomerServiceImp();
		customerService1.save();
	}
}

4.2 spring的ioc代码实现

  • 创建java项目加载架包
    在这里插入图片描述

  • 编写接口和实现类
    在这里插入图片描述

  • 编写xml配置文件.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p"
    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">
    
    <!-- 配置Javabean  
      id 唯一表示符  一般与接口名一致    接口名的小驼峰写法  -->
    <bean id="customerOracleDao" class="com.nebula.dao.imp.CustomerOracleDaoImp"></bean>
    <bean id="customerMysqlDao" class="com.nebula.dao.imp.CustomerMysqlDaoImp"></bean>
    
</beans>
  • 编写主程序代码(加载IOC容器,得到容器中的实例对象,进行使用)
package com.nebula;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.nebula.dao.CustomerDao;

public class CustomerApp {
	public static void main(String[] args) {
		//加载容器,先加载xml配置文件,对象就会被实例化,创建 Spring 的 IOC 容器
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		//获取我们实例化的对象,从 IOC 容器中获取 bean 的实例
		CustomerDao customerDao = (CustomerDao)applicationContext.getBean("customerMysqlDao");
		//调用方法
		customerDao.save();
	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值