Spring 简介及IOC容器

  • 一、Spring 概述

Spring是一个开源框架,它的目的是为了简化企业级系统开发而诞生的

Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目的是简化企业开发

Spring是轻量级的

Spring 的优点

  1. Ioc —Inversion of Control(控制反转)
  2. DI  —Dependency Injection(依赖注入) 
  3. AOP—Aspect-Oriented Programming(面向方面编程);
  4. Spring有许多类用来支持其它的框架(如:Hibernate和Struts);即:Spring可以集成其它框架,作为自己的一部分
  5. 接口编程、减少耦合;

关于Spring的批评

非标准、配置过度(注解方式一定程度上解决了这个问题)、过大…

容器与框架

容器其中的一个作用就是帮我们管理我们的类

框架的作用:1、提供了一些公共性的功能(即通用功能),减少了代码开发 2、框架还具有容器的功能,管理所写的一系列对象

框架

BS架构必须要用应用服务器,图中web容器就是应用服务器

Framework(框架)的定义

  • 框架不仅要负责管理某些Bean(就是对象)的生命周期(容器的功能),还需要负责搭建(提供)某些基础设施(那些通用的功能,例如:日志、事务处理)
  • 例如:Struts能够称之为一个框架,是因为它负责管理Action,Intercepter等这些对象的生命周期;另外它提供了国际化、异常处理、自动包装表单请求、验证等通用的功能
  • Hibernate也可以称之为一个框架,因为它维护持久化对象的生命周期,持久化对象的通用增删改查方法

Spring既是容器也是框架

  • 由Spring负责“业务逻辑A”对象的实例化、初始化、服务(被调用)等,这是Spring作为容器的职责
  • Spring将大多数可重用、与业务逻辑无关的功能,能够自行或交由其他组件完成、这是它作为一个框架的职责

Spring还可以集成其它框架(Struts、Hibernate、MyBatis),它是一个“大”框架

SSH:Spring、Struts、Hibernate

SSM:Spring、Struts、MyBatis

Spring MVC

Spring 框架结构

Spring组成模块

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

Spring主要目录简介

dist
      该目录存放着Spring核心的Jar文件
doc
      该目录为Spring的帮助文档
lib
         该目录存放着Spring使用的第三方Jar文件,如果在项目中需要使用这些Jar文件,可以从该目录引用
sample
      该目录存放着Spring提供的一些示例程序
src
      该录目存放着Spring框架所有的源文件

 

Spring解决的是依赖

  • 二、理论基础-依赖注入(也称为反转控制)

依赖查找是指:当我们需要使用另一个类的对象完成一定的功能时,需要我们自己去查找这个依赖的对象。例如:Java中JNDI就是采用依赖查找方式实现的。在JNDI这棵树上挂载着很多对象,我们需要依赖JNDI的API函数(如:lookup()方法)在这棵树上依次查找我们所需要的对象,即:依赖查找是我们自己进行查找所依赖的对象。

依赖注入是指:当我们需要使用另一个类的对象完成一定的功能时,不需要我们自己去查找这个依赖的对象,而是通过第3方容器给我们注入进来,即:相当于我们告诉这个第3方容器我们需要什么类型的对象,那么这个容器就会自动帮我们去查找,找到后再给我们注入进来,然后我们就可以直接使用了。

  • 三、IOC容器

Spring框架的核心

当某个角色(调用者)需要另一个角色(被调用者)的协助时,在传统的程序设计中,通常由调用者来创建被调用者的实例,在Spring中,创建被调用者的工作不再由调用者来完成,而是由Spring的IOC容器来完成。

即:也就是说控制交给别人了,原来需要我们自己new对象,维护对象之间的依赖关系,现在不用你自己完成了,Spring会帮助你全部完成。

Spring最小依赖库

  • libs/spring-beans-3.2.13.RELEASE.jar
  • libs/spring-context-3.2.13.RELEASE.jar
  • libs/spring-core-3.2.13.RELEASE.jar
  • libs/spring-expression-3.2.13.RELEASE.jar
  • commons-logging.jar
  • log4j-1.2.15.jar

Spring配置文件提示信息

Window--XML--XML Catalog--Use....--Add

使用Spring

  1. 拷贝Spring依赖库(选中项目,build path---Configure Build Path---Libraries---Add Jars 或 Add Library)
  2. 拷贝Spring配置文件到src下(applicationContext.xml)
  3. 拷贝log4j配置文件到src下(log4j.properties)

applicationContext.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"
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

		<!-- Dao 全类名(全限定名):包名+类名 -->
		<bean id="udao" class="com.dao.impl.UserDaoImpl"/>
		
		<!-- 业务逻辑层 -->
		<bean id="uservice" class="com.service.impl.UserServiceImpl">
		    <constructor-arg ref="udao"/>
		</bean>
</beans>

修改Spring的配置文件,让Spring管理我们写的类

<bean id="userDaoForOracleImpl" class="com.dao.UserDaoForOracleImpl"/>
<bean id="userDaoForSQLServerImpl" class="com.dao.UserDaoForSQLServerImpl"/>
<bean id="userManager" class="com.manager.UserManagerImpl">
     <!-- 构造方法注入 -->
      <constructor-arg ref="userDaoForSQLServerImpl"/>
 </bean>

<bean id="userManager" class="com.manager.UserManagerImpl">
   <!-- setter方法注入,采用setter方式的注入时, userDao属性必须提供相应的setter方法,否则注入不成功-->
      <property name="userDao" ref="userDaoForOracleImpl"/>
</bean>

注:如果不进行配置,那么Spring是不会把对象创建出来的,也不会自动进行依赖关系的注入

获取BeanFactory( Spring IOC容器)

XmlBeanFactory

Resource resource =  new  ClassPathResource("applicationContext.xml");
//绝对路径的写法
//Resource   resource1= new  FileSystemResource("c:/applicationContext.xml");   
BeanFactory f = new XmlBeanFactory(resource);

ClassPathXmlApplicationContext

ClassPathXmlApplicationContext  f  = new ClassPathXmlApplicationContext("applicationContext.xml");

FileSystemXmlApplicationContext

FileSystemXmlApplicationContext  f = new FileSystemXmlApplicationContext("c:/applicationContext.xml");

ApplicationContext与BeanFactory区别?

  1. 首先它们俩都代表的是Spring的IOC容器,
  2.  ApplicationContext是BeanFactory子类, ApplicationContext扩展了BeanFactory的功能,因此ApplicationContext功能更强。
  3.  ApplicationContext在项目加载时会将配置文件中配置的所有bean全部加载到内存中,而 BeanFactory则是当用户调用某个bean时,它先在内存中看是否已加载,如果有则返回内存中的bean,否则再读取配置文件,加载相应的bean,所以如果内存容量够大的话,一般使用ApplicationContext。只要在对内存要求及其严格的情况下才会考虑使用BeanFactory。
  • 四、IOC容器依赖关系的注入方式

使用构造方法注入方式

<bean id="manager" class="com.service.Manager">
      <constructor-arg ref="sqlServerDaoImpl"/>//另一个bean的id值
 </bean>

使用setter方法(属性)注入方式

 1、配置文件

<bean id="manager" class="com.demo.manager.Manager">
        <property  name="userDao"  ref="sqlServerDaoImpl"/>//userDao类中的属性名,sqlServerDaoImpl另一个bean的id值
</bean>

2、类文件

提供相应属性的setter/getter方法

构造方法注入与setter方法注入的区别

构造方法会在实例化Manager的时候,直接就会把实例化好的sqlServerDaoImpl对象注入进来,时机比较早。

setter方法则是把Manager实例化后,再调用setDao方法将sqlServerDaoImpl对象注入进来。它俩的区别就是一个时机早晚的区别,构造方法注入的时间比setter方法注入的时间早。

构造方法注入与setter方法注入的选择

如果依赖的对象较多,则构造方法的注入方式会显得构造方法非常冗长,不利于阅读,setter方法注入则可以使依赖关系显得更加直观、自然。

建议:如果参数较少,可以使用构造方法方式,如果参数多,一般使用setter方法。

一般的策略是以setter方法注入为主,构造方法注入为辅。

接口注入方式(不常用)

定义一个注入接口,在需要注入的类中实现此接口,由于这种方法具有侵入性,所以不常用。

还有一种字段注入(也叫属性注入)

总结

  1. Spring 最小依赖库
    1. libs/spring-beans-3.2.13.RELEASE.jar
    2. libs/spring-context-3.2.13.RELEASE.jar
    3. libs/spring-core-3.2.13.RELEASE.jar
    4. libs/spring-expression-3.2.13.RELEASE.jar
    5. jakarta-commons/commons-logging.jar
    6. log4j-1.2.15.jar
  2. 拷贝Spring配置文件到src下
  3. 拷贝log4j配置文件到src下
  4. Spring框架的基本思想就是IOC/DI
  5. Spring就是一个IOC容器
  6. IOC与DI,说的是一回事,但DI这个名词更能表达这种设计模式的思想
  7. IOC容器对依懒关系的注入方式:
    1.  构造方法注入
    2.  setter方法注入(属性方式注入)
    3.  接口注入方式(不常用)
    4.  字段注入(暂未详细描述)
  8. 让Spring容器管理我们的对象创建和依赖关系的注入,必须在Spring配置中进行定义,在Spring的配置文件中采用<bean…/>进行配置即可。
  9. Spring IOC容器的关键点
    1. 必须将被管理的对象定义到Spring配置文件中
    2. 必须定义构造函数或setter方法,让Spring容器将所依赖的对象注入进来
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值