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会报错

相关文章
|
11天前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
21 0
|
5天前
|
XML Java 数据格式
Spring 属性注入方式
Spring 属性注入方式
13 2
|
11天前
|
安全 Java 开发者
在Spring框架中,IoC和AOP是如何实现的?
【4月更文挑战第30天】在Spring框架中,IoC和AOP是如何实现的?
21 0
|
11天前
|
XML Java 程序员
什么是Spring的IoC容器?
【4月更文挑战第30天】什么是Spring的IoC容器?
19 0
|
14天前
|
Java Spring 容器
【Spring系列笔记】IOC与DI
IoC 和 DI 是面向对象编程中的两个相关概念,它们主要用于解决程序中的依赖管理和解耦问题。 控制反转是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入和依赖查找。
30 2
|
14天前
|
Java 测试技术 数据库连接
Spring中ioc的优点
总之,Spring中的IoC提供了一种更加灵活、可维护、可测试和可扩展的方式来管理组件之间的依赖关系,从而提高了应用程序的质量和可维护性。这使得开发人员能够更专注于业务逻辑而不是底层的技术细节。
32 1
|
17天前
|
Java Spring 容器
Spring注入
Spring注入
31 13
|
23天前
|
Java 应用服务中间件 Spring
|
24天前
|
XML Java 数据格式
Spring IOC的源码解析
【4月更文挑战第17天】Spring IOC(控制反转)的核心功能是通过依赖注入(DI)来管理对象的创建和它们之间的依赖关系。要深入理解Spring IOC的工作原理,我们可以从其源码分析入手,特别是关注如何创建和管理Bean以及依赖注入的实现
20 1
|
28天前
|
XML Java 数据格式
Spring IOC—基于XML配置和管理Bean 万字详解(通俗易懂)
Spring 第二节 IOC—基于XML配置和管理Bean 万字详解!。
94 5