Spring系列(一)之基础介绍及IoC的三种注入方式

简介: Spring系列(一)之基础介绍及IoC的三种注入方式

一. Spring介绍

Spring是SSM(Spring、SpringMVC、Mybatis)框架之一。所谓框架,就是高度抽取可重用代码的一种设计,具有高度通用性;

1. 概述:

Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。

Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。

然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

目的:解决企业应用开发的复杂性

功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

范围:任何Java应用

简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

2. 使用Spring的优势

(1)方便解耦,简化开发

Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给 Spring 管理。

(2)方便集成各种优秀框架

Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支持。

(3)降低 Java EE API 的使用难度

Spring 对 Java EE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等)都提供了封装,使这些 API 应用的难度大大降低。

(4)方便程序的测试

Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序。

(5)AOP 编程的支持

Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。

(6)声明式事务的支持

只需要通过配置就可以完成对事务的管理,而无须手动编程;

作为 Java 程序员,对 Spring 的理解和掌握程度,基本上就是编程能力的体现。

二. IoC

1. 概念

IoC(Inversion of Control)即控制反转。在使用Spring之前,我们获取对象几乎都是用过new的方式,但是呢,在使用Spring之后,我们就不在使用new的方式来创建对象,而是交给Spring来给我们创建,这种对对象控制权的转移就叫做控制反转。

IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)” ,即由容器动态的将某种依赖关系注入到组件之中

2. IoC容器

  1. IoC 容器是 Spring 的核心,也可以称为 Spring 容器。Spring 通过 IoC 容器来管理对象的实例化和初始化,以及对象从创建到销毁的整个生命周期。
  2. Spring 中使用的对象都由 IoC 容器管理,不需要我们手动使用 new 运算符创建对象。由 IoC 容器管理的对象称为 Spring Bean,Spring Bean 就是 Java 对象,和使用 new 运算符创建的对象没有区别。
  3. Spring 通过读取 XML 或 Java 注解中的信息来获取哪些对象需要实例化。
  4. Spring 提供 2 种不同类型的 IoC 容器,即 BeanFactory 和 ApplicationContext 容器。

示例代码:

创建接口和实现类

public interface UserDao {
  void queryAll();
}
public class UserDaoImpl implements UserDao {
  public UserDaoImpl(){
  System.out.println("UserDaoImpl对象创建了");
  }
  @Override
  public void queryAll() {
  System.out.println("查询了所有用户信息");}
}

创建spring配置文件

在工程resource目录下创建spring-config.xml,idea中可以直接在resource目录下使用菜单New–>XML Configuration File–> Spring Config创建。

<?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指定创建出来的对象在核心容器中的名字(name),用作唯一标识class指定创建对象的类的全类名-->
  <bean id="userDaoImpl" class="com.hqyj.cl.dao.impl.UserDaoImpl"/>
</beans>

测试

public class UserDaoTest {
  @Test
  public void selectAll() {
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring-config.xml");
    UserDao userDaoImpl = ac.getBean("userDaoImpl", UserDao.class);
    userDaoImpl.selectAll();
  }
}

三. Spring的注入方式

1. setter注入

指 IoC 容器使用 setter 方法注入被依赖的实例。通过调用无参构造器或无参 static 工厂方法实例化 Bean 后,调用该 Bean 的 setter 方法,即可实现基于 setter 的 依赖注入。

在 Spring 实例化 Bean 的过程中,首先会调用默认的构造方法实例化 Bean 对象,然后通过 Java 的反射机制调用 setXxx() 方法进行属性的注入。因此,setter 注入要求 Bean 的对应类必须满足以下两点要求:

必须提供一个默认的无参构造方法;

必须为需要注入的属性提供对应的 setter 方法。

使用 setter 注入时,在 Spring 配置文件中,需要使用 元素的子元素 为每个属性注入值;使用构造注入

时,在配置文件中,主要使用 标签定义构造方法的参数,使用其 value 属性(或子元素)设置该参数的值。

优点:对象创建时,无需指定参数,不会限制对象的创建。

缺点:对象具有多个属性可以注入时,无法保证全部或某些属性一定被注入。

setter注入方式较为灵活,使用更方便。

示例代码:

创建一个实体类User

public class User {
  private int id;
  private String username;
  private String password;
  public User() {}
  public User(int id, String username, String password) {
    this.id = id;
    this.username = username;
    this.password = password;}
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getUsername() {
    return username;
  }
  public void setUsername(String username) {
    this.username = username;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  @Override
  public String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

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">
<bean id="user" class="com.hqyj.cl.pojo.User">
  <property name="id" value="1"/>
  <property name="username" value="chenlei"/>
  <property name="password" value="111"/>
</bean>
</beans>

测试类

public class UserDaoTest {
  @Test
  public void selectAll() {
  ApplicationContext ac = new ClassPathXmlApplicationContext("spring-config.xml");
  User user = ac.getBean("user", User.class);
  System.out.println(user);
  }
}

2. 构造注入

指 IoC 容器使用构造函数注入被依赖的实例。可以通过调用带参数的构造函数实现依赖注入,每个参数代表一个依赖。

通过使用构造函数注入被依赖的实例有三种方式:通过下标注入、通过属性注入、通过参数名注入。

优点:创建时必须要指定构造函数中的全部参数,bean才能被创建,保证了对象创建出来之后,成员变量一定都有值。

缺点:必须要指定全部参数,否则对象无法创建,使用该方式改变对象的创建过程。

3. 接口注入(自动装配)

byName

JavaBean会根据属性名在Spring的上下文中进行寻找,是根据Spring上下文的bean的id进行查找,只要有,就会进行自动注入。

保证 bean 的 id 是唯一的,且该 bean 的 id 是此类属性对应的 set方法的方法名

byType

JavaBean会根据属性名对应的接口类型,在Spring的上下文中进行查找,是根据Spring上下文中是否有该接口类型的实现类进行匹配,只要有,就会进行自动注入

保证 bean 的 id 是唯一的,且该 bean 的类型也是唯一的

注意:如果找到两个及以上,那么Spring会报错

相关文章
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
1066 26
|
9月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
XML 人工智能 Java
Spring IOC 到底是什么?
IOC(控制反转)是一种设计思想,主要用于解耦代码,简化依赖管理。其核心是将对象的创建和管理交给容器处理,而非由程序直接硬编码实现。通过IOC,开发者无需手动new对象,而是由框架负责实例化、装配和管理依赖对象。常见应用如Spring框架中的BeanFactory和ApplicationContext,它们实现了依赖注入和动态管理功能,提升了代码的灵活性与可维护性。
309 1
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
398 18
|
XML Java 数据格式
【SpringFramework】Spring IoC-基于XML的实现
本文主要讲解SpringFramework中IoC和DI相关概念,及基于XML的实现方式。
375 69
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
Java 容器 Spring
什么是Spring IOC 和DI ?
IOC : 控制翻转 , 它把传统上由程序代码直接操控的对象的调用权交给容 器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转 移,从程序代码本身转移到了外部容器。 DI : 依赖注入,在我们创建对象的过程中,把对象依赖的属性注入到我们的类中。
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
310 21
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
630 12