1. 概述

spring是一个分层的javaSE/EE的轻量级一站式框架

1.1 一站式框架

即有有EE开发的每一层解决方案

1.1.1 WEB层:SpringMVC

1.1.2 Service层 :Spring的Bean管理,Spring声明式事务

1.1.3 DAO层:Spring的Jdbc模板,Spring的ORM模块

1.2 特点

1.2.1 方便解耦,简化开发

           通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

1.2.2 AOP编程的支持

        通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。

1.2.3 声明式事务的支持

        在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。

1.2.4 方便程序的测试

        可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。

例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。

1.2.5 方便集成各种优秀框架

        Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持

1.2.6 降低Java EE API的使用难度

         Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。

2. spring环境准备

2.1 spring官网

http://spring.io/

2.2 包的下载

在官网上下载 spring-framework-4.2.4.RELEASE-dist.zip 全量包,解压之后,有三个目录

spring 中的4个map spring的四个层_xml

docs:Spring的开发规范和API

libs:Spring的开发的jar和源码

schema:Spring的配置文件的约束

下载spring-framework-3.0.2.RELEASE-dependencies依赖,解压之后,有很多依赖jar包,用于开发的时候引入

spring 中的4个map spring的四个层_xml_02

3. spring框架runtime图解

spring 中的4个map spring的四个层_xml_03

1. Test:整合单元测试,与Junit整合,让单元测试变得更加简单

2. Core container:核心容器也就是IOC,包含了4块,beans,core,context与spel

3. AOP:aop与aspects(是第三方的一个AOP的开发)

4. web:就是spring的web,包括SpringMVC

5. Data Access:数据访问的一块

这整个是spring的体系结构

4. 初识Spring IOC

4.1 IOC的概念

1. IOC就是spring中大名鼎鼎的控制反转,即将对象的创建权反转给(交给)Spring。

2. IOC对应着Spring的Runtime图解中的核心容器(core container)

3. IOC的实现原理:工厂 + 反射 + 配置文件来实现程序的解耦。

当我们在xml中配置一个bean的时候,会给一个id,同时给一个class,spring就可以根据这个id找到对应的class,然后通过return Class.forName(class_name).newInstance(),将对应的实例返回给外部对象使用。

4.2 通过demo来了解IOC

通过一个demo工程来了解IOC

4.2.1. 新建一个web项目

4.2.2. 引入jar包

因为我们主要是用来了解IOC,所以,我们只需要引入spring的核心包也就是core container部分的jar即可

1. 引入spring相关包

1.1 beans:spring-beans-4.2.4.RELEASE.jar、spring-beans-4.2.4.RELEASE-sources.jar

1.2 core:spring-core-4.2.4.RELEASE.jar、spring-core-4.2.4.RELEASE-sources.jar

1.3 context:spring-context-4.2.4.RELEASE.jar、spring-context-4.2.4.RELEASE-sources.jar

1.4 spel:spring-expression-4.2.4.RELEASE.jar、spring-expression-4.2.4.RELEASE-sources.jar

注意:source的jar都是源码包,引入的目的是为了便于查看源码

2. 引入日记记录的包

2.1 接口规范:com.springsource.org.apache.commons.logging-1.1.1.jar

2.2 log4j:com.springsource.org.apache.log4j-1.2.15.jar

注意:

1. 在上面下载的spring依赖包中,找到这两个包

2. 接口规范是Apache提供的一个日志记录的接口规范,具体做实现的还是log4j,所以我们需要引入这两个包

spring 中的4个map spring的四个层_spring_04

4.2.3 配置文件

1. 新建xml配置文件

在src目录下,新建一个名为applicationContext.xml的文件

注意:文件名称任意。

2. 写约束

约束怎么写了,在哪里找了,我们可以在spring的开发规范中的开发文档中docs\spring-framework-reference\html目录下,有一个叫做xsd-configuration的html文件,打开它,滚动到最下面,有一个叫做the beans schema的说明,将下面的代码,粘贴到我们的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.xsd">

    <bean id="foo" class="x.y.Foo">
        <meta key="cacheName" value="foo"/>
        <property name="name" value="Rick"/>
    </bean>

</beans>

然后,修改bean标签的内容为我们项目的内容即可。

注意:spring的其他约束配置都在该文件中可以找到。

3. 配置Bean

<bean id="userDao" class="com.itcast.spring.demo1.UserDaoImpl"></bean>

4.2.4 编写测试类

操作步骤:

1. 创建Spring的工厂

ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");

2. 通过工厂与bean的id得到对象

UserDao bean = (UserDao)application.getBean("userDao");

3. 调用对象的方法

bean.showName();

完整的测试方法

public void demo2(){
	ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
	UserDao bean = (UserDao)application.getBean("userDao");
	bean.showName();
}

注意:spring程序的运行依赖于日志,所以我们运行前,需要复制log4j.properties到工程中

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###
# error warn info debug trace
log4j.rootLogger= info, stdout

5. IOC与DI

IOC:控制反转

DI:依赖注入,依赖注入的前提是要有IOC的环境,当我们的类交给spring去管理的时候,spring会将该类依赖的属性注入(设置)进去。

在传统开发模式中,当我们需要给对象设置属性值的时候,我们必须创建该类的对象,并且,如果接口中没有该属性的定义,我们接收类型也必须为该类,而不能是接口,然后调用相应的方法给属性赋值。

例如:接收对象只能是UserDaoImpl而不能是UserDao

// UserDao userDao = new UserDaoImpl();
UserDaoImpl userDao = new UserDaoImpl();
userDao.setName("张三");

在spring中,通过依赖注入,我们只需要在bean标签中通过property标签配置一下属性即可。

例如:在property标签中配置name,代码不需要做任何变化

<bean id="userDao" class="com.itcast.spring.demo1.UserDaoImpl">
    <property name="name" value="lisi"></property>
</bean>

我们在运营demo的时候,name的值就被设置进来了,这个设置的过程就叫做DI,即,Spring在帮我们创建类的实例的过程中,发现该类有一个name的属性,这叫做依赖,然后通过property的配置将name的值进来,这叫注入。

总结:DI的含义就是Spring在管理类的过程中,将类的属性设置进来,这就是DI。