Spring(一)

目录

一.Spring相关概念

1.1 初识Spring

1.1.1 Spring家族

1.1.2  Spring发展史

1.1.3 Spring系统架构

1.2 Spring核心概念

1.2.1 IOC思想

1.2.2 IOC容器

1.2.3 Bean

1.2.4 DI

二.IOC、DI快速入门

2.1 IOC快速入门

2.2  DI快速入门


一.Spring相关概念

1.1 初识Spring

1.1.1 Spring家族

Sp ring并不是单一的一个技术,而是一个大家族,如下图所示:
上图中的图标都代表什么含义,可以进入 Spring | Projects 网站进行对比查看。
这些技术并不是所有的都需要学习,需要重点关注的是 Spring Framework SpringBoot SpringCloud :
我们今天所学习的Spring其实指的是Spring Framework。

1.1.2  Spring发展史

  • IBM在1997年提出了EJB思想,早期的Java EE开发大都基于该思想。
  • Rod Johnson在2002年出版的 Expert One-on-One J2EE Design and Development ,书中有阐述在开发中使用EJB该如何做。
  • Rod Johnson在2004年出版的 Expert One-on-One J2EE Development without EJB ,书中提出了比EJB思想更高效的实现方案,并且在同年将方案进行了具体的落地实现,这个实现就是Spring1.0。
  • 随着时间推移,版本不断更新维护,目前最新的是Spring5
    • Spring1.0是纯配置文件开发
    • Spring2.0为了简化开发引入了注解开发,此时是配置文件加注解的开发方式
    • Spring3.0已经可以进行纯注解开发,使开发效率大幅提升,我们的课程会以注解开发为主
    • Spring4.0根据JDK的版本升级对个别API进行了调整
    • Spring5.0已经全面支持JDK8,现在Spring最新的是5系列所以建议大家把JDK安装成1.8版

1.1.3 Spring系统架构

1.x  Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基。
   2.x  Spring Framework的发展也经历了很多版本的变更,每个版本都有相应的调整
Spring Framework的5版本目前没有最新的架构图,而最新的是4版本,所以接下来主要研究的是4.x 的架构图
(1)核心层
  • Core Container:核心容器,这个模块是Spring最核心的模块,其他的都需要依赖该模块
(2)AOP层
  • AOP:面向切面编程,它依赖核心层容器,目的是==在不改变原有代码的前提下对其进行功能增强==
  • Aspects:AOP是思想,Aspects是对AOP思想的具体实现
(3)数据层
  • Data Access:数据访问,Spring全家桶中有对数据访问的具体实现技术
  • Data Integration:数据集成,Spring支持整合其他的数据层解决方案,比如Mybatis
  • Transactions:事务,Spring中事务管理是Spring AOP的一个具体实现,也是后期学习的重点内容
(4)Web层
  • 这一层的内容将在SpringMVC框架具体学习
(5)Test层
  • Spring主要整合了Junit来完成单元测试和集成测试

1.2 Spring核心概念

1.2.1 IOC思想

  简单来说,就是使用对象时,由主动new产生对象转换为由外部提供对 象,此过程中对象控制权    由程序转移到外部,此思想称 为控制反转。

1.2.2 IOC容器

  Spring技术对IOC思想进行了实现,Spring提供了一个 IOC容器,用来充当IOC思想中的外部。

1.2.3 Bean

被创建或被管理的对象在IOC容器中统称为Bean。

1.2.4 DI

绑定对象与对象之间的依赖关系。比如说在项目的Service层需要用到Dao层的对象,我们不能在Service自己new一个,而是要通过DI,也就是依赖注入为Service层注入一个Dao层的对象。

二.IOC、DI快速入门

2.1 IOC快速入门

在这里,我们直接通过一个案例来进行IOC的快速入门。
步骤一: 在idea中 创建一个Maven项目
步骤二: 添加Spring的依赖jar包
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>
步骤三: 添加案例中需要的类
创建BookService,BookServiceImpl,BookDao和BookDaoImpl四个类
public interface BookDao {
    public void save();
}
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}
public interface BookService {
    public void save();
}
public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}

步骤4: 添加spring配置文件

resources下添加spring配置文件applicationContext.xml

步骤5:在配置文件中完成bean的配置

​
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="Index of /schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="Index of /schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--bean标签标示配置bean
        id属性标示给bean起名字
        class属性表示给bean定义类型
    -->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/>
</beans>
​

步骤6:获取IOC容器

使用Spring提供的接口完成IOC容器的创建,创建App类,编写main方法
public class App {
    public static void main(String[] args) {
        //获取IOC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}

步骤7:从容器中获取对象进行方法调用

public class App {
    public static void main(String[] args) {
        //获取IOC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}

步骤8:运行程序

Spring的IOC入门案例已经完成,但是在 BookServiceImpl 的类中依然存在 BookDaoImpl 对象的new操作,它们之间的耦合度还是比较高,这块该如何解决,就需要用到下面的 DI:依赖注入

2.2  DI快速入门

接下来通过DI来对入门案例进行改进,以理解DI

步骤1: 去除代码中的new

在BookServiceImpl类中,删除业务层中使用new的方式创建的dao对象
public class BookServiceImpl implements BookService {
//删除业务层中使用new的方式创建的dao对象
private BookDao bookDao;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}

步骤2: 为属性提供setter方法

在BookServiceImpl类中,为BookDao提供setter方法
public class BookServiceImpl implements BookService {
//删除业务层中使用new的方式创建的dao对象
private BookDao bookDao;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
//提供对应的set方法
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}

步骤3: 修改配置完成注入

在配置文件中添加依赖注入的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="Index of /schema/beans"
<!--bean标签标示配置bean
id属性标示给bean起名字
class属性表示给bean定义类型
-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<!--配置server与dao的关系-->
<!--property标签表示配置当前bean的属性
name属性表示配置哪一个具体的属性
ref属性表示参照哪一个bean
-->
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
注意:  配置中的两个bookDao的含义是不一样的
  • name="bookDao"中 bookDao 的作用是让Spring的IOC容器在获取到名称后,将首字母大写,前面加set找对应的 setBookDao() 方法进行对象注入
  • ref="bookDao"中 bookDao 的作用是让Spring能在IOC容器中找到id为 bookDao 的Bean对象给 bookService 进行注入
  • 综上所述,对应关系如下:

步骤4:运行程序

使用DI对案例改进后,发现程序的结果并没有发生变化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真滴book理喻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值