Spring简介和使用

本文介绍了Spring框架的基本概念、优势以及核心的IoC(控制反转)原理。Spring作为一个轻量级的Java框架,通过提供IoC容器,实现了服务的解耦和简化开发。文中详细讲解了Spring的项目架构、IoC的准备工作,包括基于XML的配置,并探讨了不同类型的BeanFactory和ApplicationContext。
摘要由CSDN通过智能技术生成

1.Spring简介

Spring是于2003 年兴起的一个轻量级的Java 开源框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来,为了解决企业应用开发的复杂性而创建的。

Spring框架的主要优势之一就是服务各自打包,允许使用者自由选择服务和定制服务。同时可以集成各种其他优秀的框架

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ffnn9KEh-1603980194499)(assets/image-20201028070446607.png)]

从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

Spring的核心是控制反转(IOC)和面向切面(AOP)。

简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

Spring 官网

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-68mDuqxx-1603980194501)(assets/image-20200909195909915.png)]

Spring项目 官网

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TcrtIAU5-1603980194503)(assets/image-20200909200005767.png)]

2.Spring 优势

  • 容器性质,方便解耦,简化开发

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

  • AOP编程的支持

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

  • 声明式事务的支持

    通过声明式方式灵活的进行事务的管理,提高开发效率和质量

  • 集成各种优秀框架

    Spring不仅不排除其他各种优秀的框架,同时对这些框架(Mybatis、Quartz等)提供了很好的支持

  • 降低JavaEE API的使用难度

    Spring对JavaEE API 进行了封装,使得这些API降低了使用难度

  • 良好的设计,容易扩展,很多可重用的组件

3.Spring模块

由于Spring是一个具有容器性质的框架,因此Spring框架由大约20个模块组成的特性组成,如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E0ALzESn-1603980194506)(assets/image-20201009162424400.png)]

4.Spring IoC

4.1.项目架构

思考: 之前项目使用三层架构是否存在问题?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-78WQpKYn-1603980194509)(assets/image-20200909165520086.png)]

这种架构虽然能够使项目解耦,但是三层之间的相互调用就会带来一个新的问题:

  • web层调用service层就是在web层创建service层对象,然后调用其方法
  • service层调用dao层也是在service层创建dao层对象,然后调用其方法

如果每层之间掉用比较频繁,就会频繁的创建对象,增大资源的消耗,且每层与每层的耦合度还是相对较高。

为了更好的解耦,降低模块之间的依赖程度,我们尝试将对象创建的过程交给专门的对象创建工厂管理。工厂对象可以选择创建一个容器,将所有创建好的对象放入容器中,也可以每次返回给我们新的对象。这样当web层想要调用service层时,直接从容器中获取service对象即可。其项目图如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XkryyUTA-1603980194511)(assets/image-20200909171150553.png)]

Spring IoC就是一个类似这样的容器

4.2 IoC简介

Ioc (Inverse of Control) 控制反转,将对象的创建以及对象直接的依赖关系反转给Spring 容器,程序本身不进行维护。如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rnJo3DpK-1603980194515)(assets/image-20201011183545095.png)]

4.3 准备工作

  • 准备Spring 开发所需jar包

    可以从官网下载提供的Spring 仓库中下载(https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release),也可以从提供的资料里面找到。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZYITu3Ii-1603980194518)(assets/image-20201028070710793.png)]

    下载解压后可以看到:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5H5LHjVM-1603980194520)(assets/image-20201011184405345.png)]

    • docs : Spring API 和 规范文档说明
    • libs: jar包以及对应的源码
    • schema: 约束

    注意: 使用的Spring版本为 5.1.9.Release

  • 将核心容器jar包以及辅助包导入项目lib目录下

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QClycglb-1603980194523)(assets/image-20201028071148764.png)]

    commons-logging / log4j 属于日志工具

  • 创建pojo类

    内容如下:

    package com.briup.ioc.basic;
    
    public class User {
    	private Long id;
    	private String name;
    	public Long getId() {
    		return id;
    	}
    	public void setId(Long id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	@Override
    	public String toString() {
    		return "User [id=" + id + ", name=" + name + "]";
    	}
    }
    
    

4.4 基于xml配置

  • 创建配置文件,名字为:first.xml,放入com.briup.ioc.basic目录下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K0ywuSBt-1603980194524)(assets/image-20201028071725606.png)]

  • 给配置文件追加约束

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPUT7a2y-1603980194526)(assets/image-20201011192052332.png)]

    <?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"> 
    </beans>
    
  • 在配置文件中添加需要被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
            https://www.springframework.org/schema/beans/spring-beans.xsd">
     	 
      <!-- 
      		bean标签的作用:用于配置让Spring容器创建对象
      			class : 要创建对象的全限定类名
      			id: 对象的唯一标识	
      
       -->
      <bean class = "com.briup.ioc.basic.User" id = "user"></bean>
    </beans>
    
  • 测试

    创建测试类

    内容如下:

    package ioc_day1;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.briup.ioc.basic.User;
    public class IOCTest_day1 {
    	
    	@Test
    	public void first() {
    		ApplicationContext ac = 
    				new ClassPathXmlApplicationContext(
    						"com/briup/ioc/basic/first.xml");
    		User user = ac.getBean(User.class);
    		System.out.println(user);
    	}
    }
    
    

    结果如下图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yJXDZok5-1603980194529)(assets/image-20201028072532349.png)]

IoC容器细节

  • ApplicationContext结构图

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YyvAEj7p-1603980194531)(assets/image-20201011194054333.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ymf34fgj-1603980194533)(assets/image-20201011200215290.png)]

  • BeanFactoryApplicationContext的区别

    Spring容器的顶层接口,ApplicationContext是其子接口

    ApplicationContext接口,它由BeanFactory接口派生而来,包含BeanFactory的所有功能

    BeanFactory 创建容器时不会创建对象,当从容器里面获取对象时才会创建

    ApplicationContext 创建容器时就会创建对象

  • ApplicationContext实现类

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bXOOJ4PF-1603980194535)(assets/image-20201011201743451.png)]

    • ClassPathXmlApplication

      从类的根路径下加载配置文件

    • FileSystemXmlApplication

      从磁盘路径加载配置文件,配置文件可以在磁盘任何位置

    • AnnotationConfigApplicationContext

      用注解配置容器对象时,需要使用此类来创建spring容器,后面会着重讲这个

  • 获取对象细节

    在配置文件中配置对象,没有唯一标识时,可以通过Class类型的对象来获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值