Spring框架(一)————核心概念和IoC

一.Spring
1.简介:Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

2.Spring官网地址:https://repo.spring.io/release/org/springframework/sprin/
下载的压缩包为 spring-framework-3.2.13.RELEASE-dist.zip
根据不同版本下载压缩包

3.Spring优点:
(1).方便解耦,简化开发 (高内聚低耦合)
Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理
spring工厂是用于生成bean
(2).AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
(3).声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
(4).方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序
(5).方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
(6).降低JavaEE API的使用难度
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低

4.体系结构:
Spring框架(一)————核心概念和IoC

5.导入spring的jar包
我是用版本是intelliJ IDEA2016.3.4
(1).第一种方法:IDEA自动下载jar包
4个核心(beans、core、context、expression) + 1个依赖(commons-loggins…jar)

创建项目名为SpringDemo的步骤如下图:
Spring框架(一)————核心概念和IoC

Spring框架(一)————核心概念和IoC

Spring框架(一)————核心概念和IoC
IDEA自动下载所有关于Spring的jar包(需要网络)
Spring框架(一)————核心概念和IoC
自动下载成功后,项目会多一个lib文件
lib下包含所有jar包
Spring框架(一)————核心概念和IoC
在项目下创建一个source文件,存放spring配置文件
步骤如下图:
Spring框架(一)————核心概念和IoC

Spring框架(一)————核心概念和IoC
Spring框架(一)————核心概念和IoC
设置source 步骤如下图:
Spring框架(一)————核心概念和IoC
Spring框架(一)————核心概念和IoC
source设置成功后,source与src图标颜色一样
Spring框架(一)————核心概念和IoC
在source目录下创建spring配置文件spring_config.xml
步骤如下图:
Spring框架(一)————核心概念和IoC
Spring框架(一)————核心概念和IoC
创建成功后,如下图:
Spring框架(一)————核心概念和IoC

(2).第二种方法:针对IDEA自动下载jar包失败

创建项目名为SpringDemo2
详细步骤如下图:
Spring框架(一)————核心概念和IoC
Spring框架(一)————核心概念和IoC
Spring框架(一)————核心概念和IoC
IDEA自动下载jar包失败(无网络,信号差)
Spring框架(一)————核心概念和IoC
下载失败后,项目与方法一不同的是项目下少了lib文件
Spring框架(一)————核心概念和IoC
需要手动创建一个lib目录
Spring框架(一)————核心概念和IoC
Spring框架(一)————核心概念和IoC

Spring框架(一)————核心概念和IoC
手动创建lib成功后,
拷贝所有需要的jar包到lib目录下
Spring框架(一)————核心概念和IoC
添加成功后,如下图
会少了spring.config
Spring框架(一)————核心概念和IoC
需要手动添加所有jar包
步骤如下图:
Spring框架(一)————核心概念和IoC
Spring框架(一)————核心概念和IoC
创建成功后,如下图:
Spring框架(一)————核心概念和IoC
在source目录下创建spring配置文件spring_config.xml
步骤如下图:
Spring框架(一)————核心概念和IoC
Spring框架(一)————核心概念和IoC
Spring框架(一)————核心概念和IoC

6.简单的代码实现功能:
(1).实体类Demo

public class Demo {
    private int id;
    private String name;

    public Demo() {
    }

    public Demo(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Demo{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

(2).Spring配置文件spring_conf.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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="demo1" class="com.bdqn.entity.Demo">
            <property name="id" value="1"/> <!--通过调用set方法-->
            <property name="name" value="张三"/>
        </bean>

</beans>

(3).编写测试类代码

public class Junit {

    @Test
    public void test1(){
        ApplicationContext context=new ClassPathXmlApplicationContext("spring_conf.xml");
        //ApplicationContext context=new FileSystemXmlApplicationContext("C:\\Users\\yan\\IdeaProjects\\SpringProject\\source\\spring_conf.xml");
        Demo obj1=(Demo)context.getBean("demo1");
        System.out.println(obj1);
       
    }
}

执行结果为:Demo{id=1, name=‘张三’}

二.Spring IoC
1.简介:一个Java应用程序由互相调用提供应用程序行为的一组对象组成。某个对象调用的其他对象称为它的依赖性。例如,如果对象X调用了对象Y和Z,那么Y和Z就是对象X的依赖性。DI是一种设计模式,其他对象的依赖项通常被指定为其构造函数和setter方法的参数。并且,这些依赖性将在这些对象创建时注入该对象中。
在Spring 应用程序中,Spring Ioc 容器(也称为Spring 容器)负责创建应用程序对象并注入他们的依赖性。Spring容器创建和和管理的应用对象称为Bean。由于Spring容器负责创建应用程序对象组合在一起,因此不需要实现诸如工厂或者服务定位器等设计模式来构成应用。因为创建和注入依赖性的不是应用程序的对象,而是Spring容器,所以依赖注入(DI)也称为控制反转(IoC)。

2.用简单的代码来实现控制反转
(1).创建接口Hambuger

public interface Hambuger {

    public void eat();

}

(2).接口子
//第一个字类

public class BeefHambuger implements Hambuger {
    @Override
    public void eat() {
        System.out.println("正在吃牛肉汉堡");
    }
}

//第二个字类

public class ChickenHambuger implements Hambuger {
    @Override
    public void eat() {
        System.out.println("正在吃鸡肉汉堡");
    }
}

//第三个字类

public class PigHambuger implements Hambuger {
    @Override
    public void eat() {
        System.out.println("正在吃猪肉汉堡");
    }
}

(3).工厂类

/**
 * 简单工厂生产子类对象:生产汉堡
 */
public class Factory {
    //调用不用new对象
    public static Hambuger getHanbugur(String str){
        if (str.equals("牛肉")){
           return new BeefHambuger();
        }else if(str.equals("鸡肉")){
            return new ChickenHambuger();
        }else if(str.equals("猪肉")){
            return new PigHambuger();
        }else {
            return null;
        }
    }
}

(3).在main方法中编写测试代码

public class Main {

    public static void main(String[] args) {
	    Hambuger hanbugur=Factory.getHanbugur("猪肉");
	    hanbugur.eat();
    }
}

执行结果为:正在吃猪肉汉堡

总结:
1).对象由原来程序本身创建,变为了程序接收对象
2).程序员主要精力集中与业务的实现
3).实现了service和dao的解耦工作,没有直接依赖关系,层与层之间实现了分离(service和DAO没有关系,完全分离)
4).如果dao的实现发生改变,应用程序本身不用改变(更改Spring的配置文件)

补充:
1、核心模块(CoreContainer)
Spring核心模块包含有Core、Beans、Context和Expression Language四个小模块。
其中,Core和Beans是整个Spring框架基础部分,也是Spring的核心依赖注入IoC与DI的最基本实现,Spring的其他模块大梁依赖这俩功能。
spring-core:其他模块的基础核心,包含Spring框架的核心工具类,Spring其他模块都要使用该包里面的类。
spring-beans:Spring定义bean的支持,负责访问配置文件、创建和管理bean,支持依赖注入和控制反转的相关操作。传说中的bean工厂类就在这个jar包中。
spring-context:spring运行时容器,在Core和Beans的基础上,提供对Spring的上下文支持,ApplicationContext是该包的关键,通过它,可以方便快捷的取出依赖注入的Bean。
spring-expression:spring表达式语言,帮助Spring在运行时查询和操作对象。支持设置/获取对象的属性值,方法的调用。

2、AOP模块
spring-aop:对于代理AOP的支持
spring-Aspects:对于AspectJ的AOP支持

3、Web模块
spring-web:提供基础的web功能,在Web项目中提供Spring的容器
spring-webmvc:提供基于Servlet的SpringMVC
Spring-WebSocket:提供WbSocket功能
spring-webmvc-portlet:提供portlet的支持

4:数据库模块
spring-jdbc:提供jdbc访问数据库的支持,包含了Srping对数据库访问操作进行封装的所有类,它提供了一个JDBC的抽象层,从而实现对其他厂商的支持。
spring-tx:提供对事物的支持
spring-orm:提供对象关系-映射的支持,使得Spring可以方便的整合其他第三方ORM库如JAP、Mybatis、Hibernate等
spring-oxm:提供对象xml映射支持
spring-jms:提供对java消息服务的支持