初识Spring

1. Spring介绍

  • Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的
  • Spring以IoCAOP为主要思想构建的JavaEE框架
  • Spring是一个“一站式”框架,Spring在表现层(Web层)、业务逻辑层(Service层)、数据访问层(Dao层 ) 中,均提供了不同的解决方案
  • Spring是容器,是框架,也是技术

Spring官网

2. Spring的优势

a. 方便解耦,简化开发

通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合(类之间的依赖关系)。

b. AOP的支持

通过Spring的AOP功能,方便进行面向切面的编程。

AOP是什么?

—AOP是面向切面编程,它完成了:纵向重复,横向抽取的一个事情

什么时候用AOP:

声明式事务的支持

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

方便集成各种优秀框架

Spring可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。

Spring框架体系结构:

在这里插入图片描述
Spring框架的特点

特点说明
轻量级Spring在大小和透明性方面属于轻量级的
控制反转Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象
面向切面编程Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来
容器Spring包含并管理应用程序对象的配置及生命周期
MVC框架Spring的web框架是一个设计优良的Web MVC框架,很好的取代了一些web框架
事务管理Spring对下至本地业务上至全局业务(JAT)提供了统一的事务管理接口
异常处理Spring提供一个方便的API将特定技术的异常(由JDBC, Hibernate, 或JDO抛出)转化为一致的、 Unchecked异常

3. Spring核心思想

3.1 基本概念
  • IoC( Inversion of Control ):控制反转,将创建对象的权力和生命周期的管理过程交付给Spring框架来处理;在开发过程中不再需要关注对象的创建和生命周期的管理,在需要的时候由Spring框架提供

  • IoC容器:实现了IoC思想的容器就是IoC容器,比如:SpringFremework

  • DI ( Dependency Injection ):在创建对象的过程中,Spring依据配置来对对象进行属性设置,那么这个过程称之为依赖注入

3.2 IoC容器的特点
  • 无需主动new对象
  • 不需要主动装配对象之间的依赖关系;
  • 迪米特法则:面向抽象编程,松散耦合,一个对象应当对其它对象有尽可能少的了解

IoC是一种让消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则

3.3 理解IoC容器

容器:提供组件运行环境,管理组件生命周期

  • 谁控制谁?为什么叫反转?

    答:IoC容器控制,而以前是应用程序控制,所以叫反转

  • 控制什么?

    答:控制应用程序所需要的资源(对象、文件……)

  • 为什么控制?

    答:解耦组件之间的关系,削减类之间的耦合度

  • 控制的哪些方面被反转了?

    答:程序的控制权发生了反转,从应用程序转移到了IoC容器

3.4 理解DI
  • 谁依赖于谁?

    答:应用程序依赖于IoC容器

  • 为什么需要依赖?

    答:应用程序依赖于IoC容器来装配类之间的关系

  • 依赖什么?

    答:依赖了IoC容器的装配功能

  • 谁注入于谁?

    答:IoC容器注入应用程序

  • 注入什么东西?

    答:注入应用程序需要的资源(类之间的关系)

5. Spring简单案例

我们先来定义class UserInfo

public class UserInfo {
    private String username;

    public UserInfo() { }

    public UserInfo(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String helloWorld() {
        return "Hello Spring! " + username;
    }
}

再定义class DemoTest

public class DemoTest {
    public static void main(String[] args) {
       UserInfo userInfo = new UserInfo();
        userInfo.setUsername("  Mr.Q");
        String result = userInfo.helloWorld();
        System.out.println(result);
    }
}

实例化UserInfo之后,我们便拿到了UserInfo的属性并输出
在这里插入图片描述
以上的操作过程为:
在这里插入图片描述
那我们试着解耦,让它们不再是强依赖的关系,进行解耦操作:
在这里插入图片描述
把这俩个类的关系交给SpringIoC来做

通过控制反转,将创建对象的权力和生命周期的管理过程交付给Spring框架来处理

Framework Demo

UserInfo

/**
 * @Author: Mr.Q
 * @Date: 2019-07-26 08:31
 * @Description:
 */

public class UserInfo {
    private String username;

    public UserInfo() { }

    public UserInfo(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    /**
     * DI
     * @param username
     */
    public void setUsername(String username) {
        this.username = username;
    }

    public String helloWorld() {
        return "Hello Spring! " + username;
    }
}

DemoTest

package com.iqqcode.bean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author: Mr.Q
 * @Date: 2019-07-26 08:34
 * @Description:
 */

public class DemoTest {
    /**
     * UserInfo class helloWord function will be called by DemoTest
     * @param args
     */
    public static void main(String[] args) {
       //创建IoC容器并使用 Bean

        //从 Spring的容器中获取 文件applicationContext.xml
        ApplicationContext context = new
                ClassPathXmlApplicationContext("applicationContext.xml");

        // getBean()返回的是 Object

        UserInfo userInfo = (UserInfo) context.getBean("userInfo");
        String result = userInfo.helloWorld();
        System.out.println(result);
    }
}

resources下是配置文件,配置接口以及类的关系

applicationContext.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xsi:schemaLocation="
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!--UserInfo userInfo = new UserInfo();-->
    <bean id="userInfo" class="com.iqqcode.bean.UserInfo">

        <!--setter注入-->
        <property name="username" value="Mr.Q"/>

    </bean>

</beans>
<!--UserInfo userInfo = new UserInfo();-->
    <bean id="userInfo" class="com.iqqcode.bean.UserInfo">
    
        <!--constructor注入-->
        <constructor-arg name="username" value="Mr.Q"/>

    </bean>

如果出错的话,在applicationContext.xml中重新添加配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ming</groupId>
    <artifactId>ArvinSpringProjects</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!--spring core
            spring beans
            spring context
            spring aop

        -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>
    </dependencies>
</project>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值