Spring5 框架 笔记(一)IoC 详解 手把手教学

本文详细介绍了Spring5框架的核心部分——IoC(控制反转)。从IoC的概念、原理出发,逐步讲解如何管理和操作Bean,包括导入Spring5相关jar包、创建配置文件、BeanFactory接口、基于XML的方式创建对象和注入属性,以及自动装配、外部属性文件等内容。通过实例演示,帮助读者深入理解并掌握Spring5的IoC机制。
摘要由CSDN通过智能技术生成

Spring 5 框架

一、Spring5 框架概述

  1. Spring 是轻源级的开源的 Java EE 框架

  2. Spring 可以解决企业应用开发的复杂性

  3. Spring 有两个核心的部分: IOCAop

    (1) IOC: 控制反转,把创建的对象交给 Spring 进行管理

    (2) Aop: 面向切面,不修改源代码进行功能的增o

  4. Spring 的 6 个特征:o核心技术 :依赖注入(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。

    • 测试 :模拟对象,TestContext框架,Spring MVC 测试,WebTestClient。
    • 数据访问 :事务,DAO支持,JDBC,ORM,编组XML。
    • Web支持 : Spring MVC和Spring WebFlux Web框架。
    • 集成 :远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存。
    • 语言 :Kotlin,Groovy,动态语言。o

二、IoC

1. IoC 概念及原理

1.1 什么是 IoC

IoC (Inverse of Control:控制反转) 是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。 IoC 并非 Spring 独有。IoC 容器是 Spring 用来实现 IoC 的载体,IoC 实际是 Map (key, value) , Map 中存放的是各种对象。

控制反转,是面向对象编程的一种设计原则,可以用来减少代码之间的耦合度。若要理解 IoC 的思想,首先需要理解设计模式中的 工厂模式,某种程度上说 IoC = 工厂模式 + 反射。

工厂模式 推荐阅读: https://www.cnblogs.com/Code-CHAN/p/14441804.html

将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度简化应用的开发,把应用从复杂的关系中解放出来。IoC 容器像一个大工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何创建出来的。 在实际的项目中一个 Service 类可能有几百个甚至上千个类作为它的底层。假如我们需要实例化这个 Service,可能每次都要搞清楚这个 Service 所有底层类的构造函数,这可能让人发疯。如果利用 IoC,只需要提前配置好,在以后需要的地方引用就可以了,这大大增加了项目的可维护性且降低了开发难度。

1.2 IoC 底层原理

xml 解析、工厂模式、反射

IoC 源码阅读:https://javadoop.com/post/spring-ioc

2. IoC 操作 Bean 管理

2.1 导入 Spring5 相关 jar 包
img
  • Spring Core: 基础,可以说 Spring 其他所有的功能都需要依赖于该类库。主要提供 IoC 依赖注入功能。
  • Spring Aspects : 该模块为与AspectJ的集成提供支持。
  • Spring AOP :提供了面向切面的编程实现。
  • Spring JDBC : Java数据库连接。
  • Spring JMS :Java消息服务。
  • Spring ORM : 用于支持Hibernate等ORM工具。
  • Spring Web : 为创建Web应用程序提供支持。
  • Spring Test : 提供了对 JUnit 和 TestNG 测试的支持

导入所需 jar 包:

截屏2021-02-24 16.28.56
2.2 创建 Spring 配置文件

(1) 创建实体类 User

public class User {
   
    public void add() {
   
        System.out.println("add ......");
    }
}

(2) 配置 Spring 文件, 使用 xml 格式

截屏2021-02-24 19.29.59

(3) 编写测试类

@Test
public void testAdd() {
   
    ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
    User user = context.getBean("user", User.class);
    user.add();
}

运行结果:

截屏2021-02-24 19.35.14

可以看到 User 类被的创建出来,并成功调用 add() 方法。

2.3 BeanFactory 接口

1、IoC 思想基于 IoC 容器完成,IoC 容器底层就是对象工厂

2、Spring 提供 IoC 容器实现的两种实现方式:(两个接口)

(1) BeanFactory: IoC 容器基本实现,是 Spring 内部的使用接口,不提供给开发人员使用。

加载配置文件时候不会创建对象,在获取对象的时候才去创建

(2) ApplicationContext: BeanFactory 接口的子接口,提供更多更强的功能,一般由开发人员使用。

加载配置文件时就会把配置文件对象进行创建

截屏2021-02-24 19.54.25
2.4 基于 xml 方式创建对象

1、基于 xml 方式创建对象

<bean id="user" class="com.spring5.demo.entity.User"></bean>

(1) 在 Spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建

(2) 在 bean 标签有很多属性,常见为以下两个属性:

id 属性: 唯一标识

class 属性: 类全路径

(3) 创建对象时,默认执行无参构造完成对象的创建

2、基于 xml 方式注入属性

DI: 依赖注入,就是注入属性。

3、第一种注入方式:使用 set 方法进行注入

(1) 创建类,定义属性和相应的 set 方法

public class Book {
   
    private String bookName;
    private String bookAuthor;

    public void setBookName(String bookName) {
   
        this.bookName = bookName;
    }

    public void setBookAuthor(String bookAuthor) {
   
        this.bookAuthor = bookAuthor;
    }
}

(2) 在 Spring 配置文件配置对象创建,配置属性注入

<bean id="book" class="com.spring5.demo.entity.Book">
    <property name="bookName" value="Java 编程思想"></property>
    <property name="bookAuthor" value="埃克尔"></property>
</bean>
  • set 方法注入属性
  • 使用 property 标签完成属性的注入
    • name: 类属性名称
    • **value:**注入的值

4、第二种注入方式:使用有参构造进行注入

(1) 创建类,定义属性和有参构造函数

public class Order {
   
    private String orderName;
    private String orderAddress;

    public Order(String orderName, String orderAddress) {
   
        this.orderName = orderName;
        this.orderAddress = orderAddress;
    }
}

(2) 在 Spring 配置文件进行配置

<bean id="order" class="com.spring5.demo.entity.Order">
    <constructor-arg name="orderName" value="C++ Primer"></constructor-arg>
    <constructor-arg name="orderAddress" value="BeiJin"></constructor-arg>
</bean>
  • 有参构造注入属性
  • 使用 constructor-arg 标签完成属性的注入
    • name: 类属性名称
    • **value:**注入的值
2.5 xml 注入其他类型属性

在 2.4 中我们只进行了字符串类型的属性注入,若我们需要注入其他类型的属性或者特殊符号<>,则需要掌握以下内容。

1、字面量

(1) null 值

<property name="bookName">
	<null/>
</property>

(2) 属性包含特殊字符

<property name="bookName">
	<value><![CDATA[<<MySQL必知必会>>]]></value>
</property>
  • 属性包含特殊字符
    • <, > 进行转义 &lt;, &gt;
    • 把带特殊符号的内容写到 CDATA

2、注入属性-外部 bean

(1) 创建两个类 service 类和 dao 类

(2) 在 service 调用 dao 里面的方法

public class UserDao {
   
    public void update() {
   
        System.out.println("update ......");
    }
}
public class UserService {
   
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
   
        this.userDao = userDao;
    }

    public void add() {
   
        System.out.println("service add ......");
        userDao.update();
    }
}

(3) 在 Spring 配置文件中进行配置

<bean id="userDao" class="com.spring5.demo.dao.UserDao"></bean>

<bean id="userService" 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值