Spring简介

1.Sring为一个开源框架,解决企业
应用程序复杂性而创建。
2.优势:分层架构,允许您使用哪一个组件,
       同时为J2EE应用程序开发提供集成的框架。
3.Spring的主要思想:IoC、AOP
   (1)IoC(Inversion of Control):控制反转/反向控制
   (2)AOP(Aspect Oriented Programming):面向切面编程
4.Spring也是一个"一站式"框架,
  即Spring的三层架构:
    表现层(Web层)
    业务逻辑层(Service层)
    数据访问层(DAO层)

Spring框架模块

spring 三层map原理 spring三层框架原理_ci

(1)Core Container(核心容器):核心容器提供Spring框架的基本功能.
   核心容器的主要组件:
      BeanFactory:工厂模式的实现,使用控制反转(IoC)模式
      将应用程序的配置的依赖性规范与实际应用程序代码分开。
(2)Context(Spring应用上下文):Spring上下文的一个配置文件,
                               向Spring框架提供上下文信息。
(3)Spring AOP:通过配置管理特性,直接将面向方面的编程集成到Spring框架中。
(4)Spring DAO:JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。
(5)Spring ORM:Spring框架插入了若干个ORM(对象关系映射)的对象关系工具,如:JDO,Hibernate,Mybatis SQL Map。
(6)Spring Web:Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。
(7)Spring MVC框架:MVC是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC变成为高度可配置的,MVC容纳大量的视图技术。

Spring核心思想

基本概念
1.IoC:控制反转,控制权从应用程序转移到框架(IoC容器),是框架的共性。
2.IoC容器:实现了IoC思想的容器称为IoC容器,如:SpringFramework
3.DI:依赖注入:用一个单独的对象(装配器)来装配对象之间的依赖关系。
IoC容器的特点
1.无需主动new对象:我们只需描述对象如何被创建,接下来就是IoC容器帮我们创建,即被动实例化。
 2.不需要主动装配对象之间的依赖关系:只需描述需要哪个服务(组件),IoC容器帮助我们配置,即被动接受装配。
 3.主动变被动(好莱坞法则)
 4.迪米特法则(最少知识原则):我们不知道依赖的具体实现,只知道需要提供某类服务的具体对象,松散耦合。
 5.IOC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,减少类与类之间依赖的设计原则。
IoC容器理解的关键问题
1.谁控制谁?为什么叫反转?
  IoC容器控制,因为以前是应用程序控制,所以称之为反转。
2.控制什么?
  控制应用程序所需要的资源,如:对象,文件等。
3.为什么控制?
  解耦组件之间的关系。
4.控制的哪些方面被反转了?
  程序的控制权发生了反转,从应用程序转移到IoC容器。
Ioc思想的容器
容器:提供组件运行环境,管理组件生命周期,不关心组件如何创建及组件之间的关系如何装配。
 IoC容器不仅具有容器的功能,还具有一些其他特性,如依赖装配。
 由于IoC太过于宽泛,提出了DI(依赖注入)
DI问题理解的关键
1.谁依赖谁
  应用程序依赖于IoC容器。
2.为什么需要依赖
  应用程序与IoC容器装配类之间存在关系。
3.依赖什么东西
  依赖了IoC容器的转配功能。
4.谁注入了谁
  IoC容器注入了应用程序。
5.注入了什么
  注入了应用程序所需要的资源。
因为IoC容器也具有依赖注入功能,所以也可以叫做DI容器。

Spring应用案例

step1:创建Maven项目(对于为什么不之间选择Spring项目?因为它不是Maven项目。。。哈哈哈)
step2:pom.xml文件中添加Spring依赖
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>4.3.9.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
</dependencies>
step3创建接口及实现类(此处提供了Shape接口包含面积、周长的计算,及三个实现类而圆Circle、矩形Rectangle、三角形Triangle)

1.Shape接口

package com.dyy.springcore.common;

public interface Shape {

    /**
    *@Description: 求取shape形状的面积
    */
    double computeArea();
    /**
     *@Description: 求取shape形状的周长
     */
    double computeSide();
}

2.Circle实现类

package com.dyy.springcore.common.impl;

import com.dyy.springcore.common.Shape;

public class Circle implements Shape {

    private final double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    public double computeArea() {
        return Math.PI * Math.pow(this.radius,2);
    }

    public double computeSide() {
        return 2 * Math.PI * this.radius;
    }

    public double getRadius() {
        return radius;
    }

    @Override
    public String toString() {
        return "Circle{" +
                "radius=" + radius +
                "area="+this.computeArea()+
                "side="+this.computeSide()+
                '}';
    }
}

3.Rectangle

package com.dyy.springcore.common.impl;

import com.dyy.springcore.common.Shape;

public class Rectangle implements Shape {

    private final double width;
    private final double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    public double computeArea() {
       return this.height * this.width;
    }

    public double computeSide() {
       return 2 * (this.width + this.height);
    }

    public double getWidth() {
        return width;
    }

    public double getHeight() {
        return height;
    }

    @Override
    public String toString() {
        return "Rectangle{" +
                "width=" + width +
                ", height=" + height +
                ",area="+this.computeArea()+
                ",side="+this.computeSide()+
                '}';
    }
}

4.Triangle

package com.dyy.springcore.common.impl;

import com.dyy.springcore.common.Shape;

public class Triangle implements Shape {

    private final double A;
    private final double B;
    private final double C;

    public Triangle(double a, double b, double c) {
        A = a;
        B = b;
        C = c;
    }


    public double computeArea() {
        double q = (this.computeSide())/2;
        return Math.sqrt((q-A)*(q-B)*(q-C)*q);
    }

    public double computeSide() {
        return (this.A + this.B + this.C);
    }

    public double getA() {
        return A;
    }

    public double getB() {
        return B;
    }

    public double getC() {
        return C;
    }

    @Override
    public String toString() {
        return "Triangle{" +
                "A=" + A +
                ", B=" + B +
                ", C=" + C +
                ",area="+this.computeArea()+
                ",side="+this.computeSide()+
                '}';
    }
}
step4创建一个测试类,通过传入不同的参数实现,实现不同图像面积、周长的计算。
package com.dyy.springcore.common.xml;

import com.dyy.springcore.common.Shape;

public class XmlShapeCompute {

    private Shape circle;
    private Shape triangle;
    private Shape rectangle;

    public Shape getCircle() {
        return circle;
    }

    public void setCircle(Shape circle) {
        this.circle = circle;
    }

    public Shape getTriangle() {
        return triangle;
    }

    public void setTriangle(Shape triangle) {
        this.triangle = triangle;
    }

    public Shape getRectangle() {
        return rectangle;
    }

    public void setRectangle(Shape rectangle) {
        this.rectangle = rectangle;
    }

    public Shape computeShape(String shapeName){
        if(shapeName.length()==0||shapeName==null){
           throw new IllegalArgumentException("Not Found");
        }
        if(shapeName.equals("circle")){
            return circle;
        }
        if(shapeName.equals("triangle")){
            return triangle;
        }
        if(shapeName.equals("rectangle")){
            return triangle;
        }
        throw new IllegalArgumentException("Not Found:"+shapeName);
    }
}
step5创建Spring配置文件,配置接口及类之间的关系
<?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:contex="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

    <bean  id="circle" class="com.dyy.springcore.common.impl.Circle">
        <constructor-arg name="radius" value="10"/>
    </bean>
    <bean id="rectangle" class="com.dyy.springcore.common.impl.Rectangle">
        <constructor-arg name="height" value="10"/>
        <constructor-arg name="width" value="10"/>
    </bean>
    <bean id="triangle" class="com.dyy.springcore.common.impl.Triangle">
        <constructor-arg name="a" value="10"/>
        <constructor-arg name="b" value="10"/>
        <constructor-arg name="c" value="10"/>
    </bean>

    <bean id="compute" class="com.dyy.springcore.common.xml.XmlShapeCompute">
        <property name="triangle" ref="triangle"/>
        <property name="rectangle" ref="rectangle"/>
        <property name="circle" ref="circle"/>
    </bean>
</beans>
6创建IoC容器使用Bean的类
package com.dyy.springcore.common.xml;

import com.dyy.springcore.common.Shape;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class XmlApplication {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application-content.xml");
        XmlShapeCompute compute = (XmlShapeCompute) context.getBean("compute");
        Shape shape = compute.computeShape("circle");
        System.out.println(shape);
    }
}

测试结果:

spring 三层map原理 spring三层框架原理_框架学习_02