- 一、Spring 概述
Spring是一个开源框架,它的目的是为了简化企业级系统开发而诞生的
Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目的是简化企业开发
Spring是轻量级的
Spring 的优点
- Ioc —Inversion of Control(控制反转)
- DI —Dependency Injection(依赖注入)
- AOP—Aspect-Oriented Programming(面向方面编程);
- Spring有许多类用来支持其它的框架(如:Hibernate和Struts);即:Spring可以集成其它框架,作为自己的一部分
- 接口编程、减少耦合;
关于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
- 拷贝Spring依赖库(选中项目,build path---Configure Build Path---Libraries---Add Jars 或 Add Library)
- 拷贝Spring配置文件到src下(applicationContext.xml)
- 拷贝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区别?
- 首先它们俩都代表的是Spring的IOC容器,
- ApplicationContext是BeanFactory子类, ApplicationContext扩展了BeanFactory的功能,因此ApplicationContext功能更强。
- 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方法注入为主,构造方法注入为辅。
接口注入方式(不常用)
定义一个注入接口,在需要注入的类中实现此接口,由于这种方法具有侵入性,所以不常用。
还有一种字段注入(也叫属性注入)
总结
- 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
- jakarta-commons/commons-logging.jar
- log4j-1.2.15.jar
- 拷贝Spring配置文件到src下
- 拷贝log4j配置文件到src下
- Spring框架的基本思想就是IOC/DI
- Spring就是一个IOC容器
- IOC与DI,说的是一回事,但DI这个名词更能表达这种设计模式的思想
- IOC容器对依懒关系的注入方式:
- 构造方法注入
- setter方法注入(属性方式注入)
- 接口注入方式(不常用)
- 字段注入(暂未详细描述)
- 让Spring容器管理我们的对象创建和依赖关系的注入,必须在Spring配置中进行定义,在Spring的配置文件中采用<bean…/>进行配置即可。
- Spring IOC容器的关键点
- 必须将被管理的对象定义到Spring配置文件中
- 必须定义构造函数或setter方法,让Spring容器将所依赖的对象注入进来