Spring Bean三种注入方式详解

在Spring容器中为一个bean配置依赖注入有三种方式:

  1. 使用属性的setter方法注入  这是最常用的方式;
  2. 使用构造器注入;
  3. 使用Filed注入(用于注解方式).

Field注入是最常见的一种方式,可以采用 @Autowired 对Bean类的接口进行初始化,代码如下

@ContextConfiguration({"/META-INF/spring/amazing-base.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringInjectionTest {
  @Autowired
  private Cust normalCust;

  @Test
  public void testFieldInjection() {
    System.out.println("testFieldInjection begin");
    normalCust.recharge();
    System.out.println("testFieldInjection end");
  }
}

Cust为接口,NormalCust为其实现类,通过这种方式,可以通过Spring容器初始化NormalCust Bean,进而调用recharge()方法。

构造器注入主要用于某些类因为某种原因不能作为Bean,只是一个普通类。可以通过类的构造方法传入需要调用的Bean接口。

@ContextConfiguration({"/META-INF/spring/amazing-base.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringInjectionTest {
  @Autowired
  private Cust normalCust;

  @Test
  public void testConstructorInjection() {
    System.out.println("testConstructorInjection begin");
    ChargeThread thread = new ChargeThread(normalCust);
    thread.run();
    System.out.println("testConstructorInjection end");
  }

}
public class ChargeThread implements Runnable {

  private Cust cust;

  public ChargeThread(Cust cust) {
    this.cust = cust;
  }

  public void run() {
    cust.recharge();
  }

}

上面的代码通过初始化一个线程,在初始化的时候传入Bean,在线程的类中调用Bean的充值方法。构造器注入特别适合多线程的编程,因为线程不能定义为Bean,否则不仅会因为它是一个单例,而且会被Spring容器管理。(当然你可以去定义Bean为原型Bean,能够有多个副本,脱离Spring容器的管理),最重要的是我们要用线程池,由线程池来管理线程。

还有一种Setter方法注入,这种方式能用于final类的静态方法,例如有一个充值的Util类,该类是final类,其方法是静态方法。

public class SpringInjectionTest {
  @Test
  public void testSetterInjection() {
    System.out.println("testSetterInjection begin");
    String result = RechargeUtil.InstantRecharge();
    System.out.println("testSetterInjection end, " + result);
  }

}
@Component
public final class RechargeUtil {

  private RechargeUtil() {

  }

  private static Cust normalCust;

  @Autowired
  public void setNormalCust(Cust normalCust) {
    RechargeUtil.normalCust = normalCust;
  }

  public static String InstantRecharge() {
    normalCust.recharge();
    return "InstantRecharge Success!";
  }
}

最后一种方式也成功了将normalCust注入到了RechargeUtil中。

以上三种注入方式,读者可以根据实际应用场景灵活选择。也希望大家多多支持我们。

(0)

相关推荐

  • 详解Java的Spring框架中bean的注入集合

    使用value属性和使用<property>标签的ref属性在你的bean配置文件中的对象引用,这两种情况下可以处理单值到一个bean,如果你想通过多元值,如Java Collection类型List, Set, Map 及 Properties.要处理这种情况,Spring提供了四种类型的如下集合的配置元素: 可以使用<list> 或<set> 来连接任何实现java.util.Collection或数组. 会遇到两种情况(a)将收集的直接的值及(b)传递一个bean

  • Java的Spring框架中bean的继承与内部bean的注入

    bean的定义继承 bean定义可以包含很多的配置信息,包括构造函数的参数,属性值,比如初始化方法,静态工厂方法名等容器的具体信息. 子bean定义从父定义继承配置数据.子的定义可以覆盖一些值,或者根据需要添加其他. Spring bean定义继承无关,与Java类的继承,但继承的概念是一样的.你可以定义一个父bean定义为模板和其他孩子bean可以从父bean继承所需的配置. 当使用基于XML的配置元数据,指明一个子bean定义使用所在的当前属性指定的父bean作为这个属性的值. 例如: 让我

  • Spring boot将配置属性注入到bean类中

    一.@ConfigurationProperties注解的使用 看配置文件,我的是yaml格式的配置: // file application.yml my: servers: - dev.bar.com - foo.bar.com - jiaobuchong.com 下面我要将上面的配置属性注入到一个Java Bean类中,看码: import org.springframework.boot.context.properties.ConfigurationProperties; import

  • Spring注入值到Bean的三种方式

    在Spring中,有三种方式注入值到 bean 属性. 正常的方式 快捷方式 "p" 模式 新建一个User类,它包含username和password两个属性,现在使用spring的IOC注入值到该bean. package com.example.pojo; public class User { private String username; private String password; public String getUsername() { return userna

  • 深入解析Java的Spring框架中bean的依赖注入

    每一个基于java的应用程序都有一个共同工作来展示给用户看到的内容作为工作的应用几个对象.当编写一个复杂的Java应用程序,应用程序类应该尽可能独立其他Java类来增加重复使用这些类,并独立于其他类别的测试它们,而这样做单元测试的可能性.依赖注入(或有时称为布线)有助于粘合这些类在一起,同时保持他们的独立. 考虑有其中有一个文本编辑器组件的应用程序,要提供拼写检查.标准的代码将看起来像这样: public class TextEditor { private SpellChecker spell

  • Spring 多线程下注入bean问题详解

    本文介绍了Spring 多线程下注入bean问题详解,分享给大家,具体如下: 问题 Spring中多线程注入userThreadService注不进去,显示userThreadService为null异常 代码如下: public class UserThreadTask implements Runnable { @Autowired private UserThreadService userThreadService; @Override public void run() { AdeUs

  • Spring Bean三种注入方式详解

    在Spring容器中为一个bean配置依赖注入有三种方式: 使用属性的setter方法注入  这是最常用的方式: 使用构造器注入: 使用Filed注入(用于注解方式). Field注入是最常见的一种方式,可以采用 @Autowired 对Bean类的接口进行初始化,代码如下 @ContextConfiguration({"/META-INF/spring/amazing-base.xml"}) @RunWith(SpringJUnit4ClassRunner.class) public

  • Java spring的三种注入方式详解流程

    目录 设置Spring的作用域 自动注入 @Primary Qualifier @ComponentScan不同的配置对性能的影响 懒加载 三种注入方式 字段注入(IDEA 会提示不推荐) 字段注入的bean类外部不可见 循环依赖问题 构造器注入(官方推荐) set方法注入 设置Spring的作用域 或者使用枚举值设置 单例和多里使用场景 自动注入 @Primary 一个接口有多个实现被spring管理吗,在依赖注入式,spring会不知道注入哪个实现类就会抛出NoUniqueBeanDefin

  • Spring bean 四种注入方式详解

    目录 一.Set方式注入 pojo层: 1.xml 文件 test测试 二.构造函数方式注入 pojo层 2.xml文件 test测试 三.注解注入 pojo层 3.xml文件 test测试 四.JavaConfig 方式注入 pojo层 JavaConfig 类 xml文件 扫描包 测试: 五.Service层注入详解 service serviceImpl xml配置文件 总结 一.Set方式注入 pojo层: /** * @Author: crush * @Date: 2021-06-17

  • Spring Bean常用依赖注入方式详解

    一般而言,Spring的依赖注入有三种:构造器注入.setter注入以及接口注入.本文主要讲构造器注入与setter注入. 1.构造器注入 为了让Spring完成构造器注入,我们需要去描述具体的类.构造方法并设置构造方法的对应参数. 代码如下: public class Role { private Long id; private String roleName; private String note; public Long getId() { return id; } public vo

  • Spring中Bean的三种实例化方式详解

    目录 一.环境准备 二.构造方法实例化 三.分析Spring的错误信息 四.静态工厂实例化 4.1 工厂方式创建bean 4.2 静态工厂实例化 五.实例工厂与FactoryBean 5.1 环境准备 5.2 实例工厂实例化 5.3 FactoryBean的使用 六.bean实例化小结 一.环境准备 准备开发环境 创建一个Maven项目 pom.xml添加依赖 resources下添加spring的配置文件applicationContext.xml 最终项目的结构如下: 二.构造方法实例化 在

  • Python selenium 三种等待方式详解(必会)

    很多人在群里问,这个下拉框定位不到.那个弹出框定位不到-各种定位不到,其实大多数情况下就是两种问题:1 有frame,2 没有加等待.殊不知,你的代码运行速度是什么量级的,而浏览器加载渲染速度又是什么量级的,就好比闪电侠和凹凸曼约好去打怪兽,然后闪电侠打完回来之后问凹凸曼你为啥还在穿鞋没出门?凹凸曼分分中内心一万只羊驼飞过,欺负哥速度慢,哥不跟你玩了,抛个异常撂挑子了. 那么怎么才能照顾到凹凸曼缓慢的加载速度呢?只有一个办法,那就是等喽.说到等,又有三种等法,且听博主一一道来: 1. 强制等待

  • vue路由传参三种基本方式详解

    这篇文章主要介绍了vue路由传参三种基本方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 现有如下场景,点击父组件的li元素跳转到子组件中,并携带参数,便于子组件获取数据. 父组件中: <li v-for="article in articles" @click="getDescribe(article.id)"> methods: 方案一: getDescribe(id) { // 直接调用$r

  • python自动化测试selenium核心技术三种等待方式详解

    目录 1 使用python自带模块time的sleep方式 2 隐式等待(implicitly_wait) 3 显示等待(WebDriverWait) UI自动化测试过程中,可能会出现因测试环境不稳定.网络慢等情况,如果不做任何处理的话,会出现无法定位到特定元素而报错,导致自动化测试无法顺利执行. selenium官网手册:Waits | Selenium slenium自动化测试中,主要涉及三种等待方式: 1 使用python自带模块time的sleep方式 缺点:即使网络条件较好时,依旧按照

  • Android编程中沉浸式状态栏的三种实现方式详解

    本文实例讲述了Android编程中沉浸式状态栏的三种实现方式.分享给大家供大家参考,具体如下: 沉浸式状态栏 Google从android kitkat(Android 4.4)开始,给我们开发者提供了一套能透明的系统ui样式给状态栏和导航栏,这样的话就不用向以前那样每天面对着黑乎乎的上下两条黑栏了,还可以调成跟Activity一样的样式,形成一个完整的主题,和IOS7.0以上系统一样了. 首先看下效果 首先看下第一种方式 系统的方式沉浸式状态栏实现 步奏一 //当系统版本为4.4或者4.4以上

  • oracle中if/else的三种实现方式详解

    1.标准sql规范 1.单个IF IF v=... THEN END IF; 2.IF ... ELSE IF v=... THEN ELSE t....; END IF; 3.多个IF IF v=... THEN ELSIF v=... THEN t...; END IFL 注意: 多个IF的是'ELSIF' 不是 ' ELSE IF' 2.decode函数 DECODE(VALUE,IF1,THEN1,IF2,THEN2,IF2,THEN2,..,ELSE) 表示如果value等于if1时,

随机推荐