Spring框架

Spring框架

1、学习地址

学习文档

官方学习文档

官方下载地址

下载地址

Github

Github

2、Spring基本介绍

起源

  • 作者

    Rod Johnson,为了解决企业应用开发的复杂性而创建的。

  • 发展历程

    • 2002年,首次推出了Spring框架的雏形,interface21

    • 2004年3月24日,正式发布了1.0版

概念、模块组成

  • Spring是一个轻量级的、非入侵的控制反转(IOC)面向切面(AOP)的容器(框架)

  • Spring是一个分层架构,由7个定义良好的模块组成

    • Spring AOP

      通过配置管理特性,Spring AOP模块直接将面向切面的编程功能,集成到了Spring框架中,Spring AOP模块为基于Spring应用程序中的对象提供了事务管理服务,通过使用Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。

    • Spring ORM

      Spring插入了若干个ORM框架,从而提供了ORM的对象管理工具,其中包括JDO,hibernate,ibatis SQL Map,所有这些都遵从Spring的事务管理和DAO的异常层次结构。

    • Spring DAO

      JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商提供的错误信息,异常层次结构简化了错误处理,并且极大地降低了需要编写的异常处理代码数量(例如打开和关闭连接),Spring DAO面向JDBC的异常层次结构遵守了普通DAO的异常处理层次结构。

    • Spring Context

      Spring上下文是一个配置文件,向Spring框架提供上下文信息,Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。

    • Spring Web

      Web上下文模块建立在应用程序上下文模块上,为基于Web应用程序提供可上下文,所以Spring框架支持与Jakarta Struts的集成 ,Web模块还简化了处理多部分请求和将请求参数绑定到域对象的工作。

    • Spring Web MVC

      Spring MVC框架是一个全功能的构建Web应用程序的MVC实现,通过策略接口,MVC框架成为高度可配置的,MVC容纳了大量视图技术,其中包括jsp,Velocity,Tiles,iText和POI。

    • Spring Core

      核心容器提供Spring框架的基本功能,核心容器的主要组件是Bean Factory,它是工厂模式的实现,BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用代码分开。

3、IOC(Inversion Of Control)

  • 定义

    一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。

  • IOC理解

    • 控制:谁来控制对象的创建?

      传统应用程序的对象是由程序本身创建的,使用Spring后,对象是由Spring创建的。

    • 反转:程序本身不创建对象,而变成被动地接收对象。

  • 示例

    • 新建一个maven项目,在pom.xml中导入Spring依赖

      <dependencies>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-webmvc</artifactId>        <version>5.2.4.RELEASE</version>    </dependency></dependencies>

      导入了spring-webmvc之后,项目中多了以下几个依赖

     Spring框架

    • 编写实体类

      package com.hmx.pojo;?public class Hello {?}
    • 传统方式创建对象

      Hello hello = new Hello();
    • 使用Spring创建对象

      1、在resources目录下新建beans.xml文件

          右键点击resources ---》 new ---》 XML Configuration File ---》Spring Config,可以创建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"       xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans.xsd">?</beans>

      2、创建对象

      <?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        https://www.springframework.org/schema/beans/spring-beans.xsd">?    <!--语法:        <bean id="对象变量名" class="new的对象所在的位置"></bean>           -->          <bean id="hello" class="com.hmx.pojo.Hello"></bean>?</beans>

3、测试注入是否成功

   /*    语法:        获取Spring的上下文对象        ApplicationContext context = new ClassPathXmlApplicationContext("创建的Spring配置xml文件名");            取对象        Hello hello = (Hello) context.getBean("xml文件中对应bean的id");    */        public static void main(String[] args) {                ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");               Hello hello = (Hello) context.getBean("hello");                //输出结果:,说明创建对象成功。        System.out.println(hello);    }

4、bean的作用域

  • singleton

    • 单例模式(默认机制)

    • 在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象

  • prototype

    • 原型模式

    • 在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象

以下4个只在Web开发中使用

  • request

  • session

  • application

  • websocket

5、DI( Dependency Injection )

  • 依赖注入理解

    • 依赖:对象的创建要依赖于spring容器

    • 注入:对象中的属性由容器来注入

  • 注入方式

    • 1、构造器注入

      • 1.1 、默认无参构造

        • 实体类

        package com.hmx.pojo;?public class User {?    private String name;    private int age;?    @Override    public String toString() {        return "User{" +                "name=‘" + name + ‘\‘‘ +                ", age=" + age +                ‘}‘;    }}
        • 注入

        <?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="user" class="com.hmx.pojo.User"></bean></beans>
        • 测试

        public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");        User user = (User) context.getBean("user");        //输出结果:User{name=‘null‘, age=0}    System.out.println(user.toString());?}
      • 有参构造

        • 实体类

        package com.hmx.pojo;?public class User {?    private String name;    private int age;?    public User(String name,int age) {        this.name = name;        this.age = age;    }?    @Override    public String toString() {        return "User{" +                "name=‘" + name + ‘\‘‘ +                ", age=" + age +                ‘}‘;    }}
        • 1.2 、通过下标创建

        <bean id="user" class="com.hmx.pojo.User">    <constructor-arg index="0" value="Andy"/>    <constructor-arg index="1" value="12"/></bean>
        • 1.3 、通过类型创建

        <bean id="user" class="com.hmx.pojo.User">    <constructor-arg type="java.lang.String" value="Andy"/>    <constructor-arg type="int" value="12"/></bean>
        • 1.4 、有参构造方法通过参数名创建

        <bean id="user" class="com.hmx.pojo.User">        <constructor-arg name="name" value="Andy"/>        <constructor-arg name="age" value="12"/></bean>
    • 2、setter注入

      • 实体类

        • Address类

        public class Address {    private String address;?    //此处省略setter和getter方法?    //此处省略toString方法}
        • Student类

        public class Student {?    private String name;    private Address address;    private String[] books;    private List<String> hobbys;    private Map<String, String> cards;    private Set<String> games;    private String wife;    private Properties info;?    //此处省略setter和getter方法?    //此处省略toString方法}
      • 注入

      <?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        https://www.springframework.org/schema/beans/spring-beans.xsd">?    <!--Address类-->    <bean id="address" class="com.hmx.Address" scope="prototype">        <property name="address" value="火星"/>    </bean>?    <!--Student类-->    <bean id="student" class="com.hmx.Student">                <!--普通值注入-->        <property name="name" value="Andy"/>                <!--Bean对象注入-->        <property name="address" ref="address"/>                <!--数组注入-->        <property name="books">            <array>                <value>红楼梦</value>                <value>三国演义</value>                <value>西游记</value>                <value>水浒传</value>            </array>        </property>                <!--列表注入-->        <property name="hobbys">            <list>                <value>读书</value>                <value>健身</value>            </list>        </property>                <!--Map注入-->        <property name="cards">            <map>                <entry key="身份证号" value="111111222222223333"></entry>                <entry key="银行卡号" value="11848979283974982748"></entry>            </map>        </property>                <!--Set注入-->        <property name="games">            <set>                <value>英雄联盟</value>                <value>和平精英</value>                <value>王者荣耀</value>            </set>        </property>        

相关推荐