Spring成员对象注入的三种方式详解

目录
  • 一、@Autowired注解
    • @Qualifier
    • @Primary
  • 二、@Resource注解
  • 三、@Inject和@Named注解
  • 总结

当一个类运行需要调用一个成员对象,成员对象也是被容器类托管的类对象时,则可以用依赖注入创建成员对象。让容器类来帮你创建成员对象。

官网链接:Annotation-based Container Configuration

前置:

容器类AppConfig

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class AppConfig {

}

创建一个接口Hello

public interface Hello {

    void HelloWorld();

}

创建一个类HelloImpl1实现接口Hello。并且被容器托管

import org.springframework.stereotype.Component;

@Component
public class HelloImpl1 implements Hello{
    @Override
    public void HelloWorld() {
        System.out.println("HelloWorld1");
    }
}

一、@Autowired注解

在声明成员变量上加上@Autowires注解。让容器来帮忙创建对象。该成员变量也必须被容器类托管。

创建MyHello类,里面有Hello成员对象。如下所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyHello {
    @Autowired
    Hello h;

    void say(){
        h.HelloWorld();
    }
}

如果不加@Autowired运行say()会报错。

进行测试:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        MyHello mh = ac.getBean("myHello",MyHello.class);
        mh.say();
    }
}

运行结果:

如果成员对象是接口,并且有多个实现类。则需要使用@Qualifier或者@Primary注解。

在创建一个类实现Hello接口。

import org.springframework.stereotype.Component;

@Component
public class HelloImol2 implements Hello{
    @Override
    public void HelloWorld() {
        System.out.println("HelloWorld2");
    }
}

这时,Hello接口有两个实现类。

再次运行Test类,报错。因为调用类有冲突。

解决方案有两种。

@Qualifier

@Autowired下加入@Qualifier(value="id名") 。id名默认是类名且首字母小写。要指定是调用实现接口中的哪个类。

如上述解决:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class MyHello {
    @Autowired
    @Qualifier(value="helloImpl1") //添加此注解
    Hello h;

    void say(){
        h.HelloWorld();
    }

}

@Primary

在想要用到的多个实现接口对象中的其中一个类,加上@Primary注解

如: 我想通过Hello运行HelloImpl1。则在HelloImpl加上@Primary注解:

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;

@Component
@Primary
public class HelloImpl1 implements Hello{
    @Override
    public void HelloWorld() {
        System.out.println("HelloWorld1");
    }
}

Test类运行成功

二、@Resource注解

在成员对象上加入@Resource(name="id名") id名为你想要调用这个接口中实现的哪个类的类名且首字母小写。

则上述的MyHello类可写成:

import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component
public class MyHello {
    @Resource(name="helloImpl1")
    Hello h;

    void say(){
        h.HelloWorld();
    }

}

运行Test类

三、@Inject 和 @Named注解

使用这两个注解需要导入坐标。在pom.xml加入

<dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
</dependency>

两个注解一起用在需要创建成员对象上。其中@Named("id名")id名为你想要调用这个接口中实现的哪个类的类名且首字母小写。

则上述的MyHello类可以修改为:

import org.springframework.stereotype.Component;
import javax.inject.Inject;
import javax.inject.Named;

@Component
public class MyHello {

    @Inject
    @Named("helloImpl1")
    Hello h;

    void say(){
        h.HelloWorld();
    }

}

继续运行Test类,仍然可以运行成功

上述也可以实现set方法的依赖注入,需要保证传入的参数被容器托管。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 详解Spring MVC自动为对象注入枚举类型

    如果一个对象里面有枚举类型的话,则spring MVC是不能够直接进行注入的,因为它只实现了一些基本的数据类型的自动转换注入,但是其也提供了可扩展的接口,可以根据自己的需要来进行扩展.下面是一个示例: 首先:这是一个枚举类: /** * 新闻类别 * @author: ShangJianguo * 2014-6-11 上午10:51:07 */ public enum ENews { company("0"), // 企业新闻 industry("1");// 行业

  • 解决netty中spring对象注入失败的问题

    目录 netty中spring对象注入失败 发现了问题所在 在netty中注入spring成份 可以通过以下方式 netty中spring对象注入失败 今天在做项目的时候发现在netty中注入service失败,百度许久后也找不到答案(@Component,@PostConstruct)未起作用,后灵光一现 发现了问题所在 如图: 这些地方都必须通过spring注入才能实现其他依赖注入,之前这里都是采用new的,所以导致spring注入失败 在netty中注入spring成份 前不久,在Nett

  • springboot2.x解决运行顺序及Bean对象注入顺序的问题

    1 前言 通过指定接口,重写指定方法,可以在Bean对应的生命周期方法中执行相应的程序 2 测试 本文将分析几个Bean对象,为它们设置优先级(通过@Order),然后再打断点调试,测试各种生命周期方法的运行的顺序 在项目当中最让人头疼的就是bean对象不被注入的问题,通过本文,你可以很好的解决这个问题. 先看看本程序使用的依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="

  • JSP 获取Spring 注入对象示例

    <%@ page import="org.springframework.web.context.support.WebApplicationContextUtils"%> <%@ page import="org.springframework.context.ApplicationContext"%> ServletContext sc = this.getServletConfig().getServletContext(); Appl

  • Java SpringBoot容器注入对象详解

    目录 1.注入的方式 方式一:使用Import注解 方式二:使用@Service 或者@Component等注解注入到容器中 方式三:使用@Configuration和@Bean组合实现 2.注入是增加条件判断注解 3.构造方法时带参数注入 方式1:使用spring xml实现 方式2:使用@Autowired 方式3使用@Configuration和@Bean组合 4.对象注入时的一些总结 总结 1.注入的方式 方式一:使用Import注解 增加一个类HelloCompent package

  • Spring成员对象注入的三种方式详解

    目录 一.@Autowired注解 @Qualifier @Primary 二.@Resource注解 三.@Inject和@Named注解 总结 当一个类运行需要调用一个成员对象,成员对象也是被容器类托管的类对象时,则可以用依赖注入创建成员对象.让容器类来帮你创建成员对象. 官网链接:Annotation-based Container Configuration 前置: 容器类AppConfig import org.springframework.context.annotation.Co

  • Spring 依赖注入的几种方式详解

    IoC 简介 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过Spring容器帮我们new指定实例并且将实例注入到需要该对象的类中. 依赖注入的另一种说法是"控制反转".通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员. 而控制反转是指new实例工作不由我们程序员来做而是交给Spring容器来做.

  • 详解Spring依赖注入的三种方式以及优缺点

    目录 0.概述 1.属性注入 1.1 优点分析 1.2 缺点分析 2.Setter 注入 优缺点分析 3.构造方法注入 优点分析 总结 0.概述 在 Spring 中实现依赖注入的常见方式有以下 3 种: 属性注入(Field Injection): Setter 注入(Setter Injection): 构造方法注入(Constructor Injection). 它们的具体使用和优缺点分析如下. 1.属性注入 属性注入是我们最熟悉,也是日常开发中使用最多的一种注入方式,它的实现代码如下:

  • Spring Bean属性注入的两种方式详解

    目录 属性注入概念 一.构造器注入 示例1 注意点 二.setter注入 示例2 三.如何选择注入方式 属性注入概念 Spring 属性注入(DI依赖注入)有两种方式:setter注入,构造器注入. 这个注入的属性可以是普通属性(基本数据类型与String等),也可以是一个引用数据类型(主要是对象),或者是一个集合(list.map.set等) 下表是属性注入bean标签中常用的元素 元素名称 描述 constructor-arg 构造器注入.该元素的 index 属性指定构造参数的索引(从 0

  • Spring实例化bean的四种方式详解

    目录 一.bean实例化——构造方法(常用) 二.bean实例化——静态工厂(了解) 三.bean实例化——实例工厂(了解) 四.bean实例化——FactoryBean(实用) 一.bean实例化——构造方法(常用) bean本质上就是对象,创建bean使用构造方法完成 BookDao接口: public interface BookDao { public void save(); } BookDaoImpl实现类,利用构造方式提供可访问的构造方法,输出相应字符串: import com.i

  • Java实现AOP代理的三种方式详解

    目录 1.JDK实现 2.CGLIB实现 3.boot注解实现[注意只对bean有效] 业务场景:首先你有了一个非常好的前辈无时无刻的在“教育”你.有这么一天,它叫你将它写好的一个方法进行改进测试,这时出现了功能迭代的情况.然后前辈好好“教育”你的说,不行改我的代码!改就腿打折!悲催的你有两条路可走,拿出你10年跆拳道的功夫去火拼一波然后拍拍屁股潇洒走人,要么就是悲催的开始百度...这时你会发现,我擦怎么把AOP代理这种事给忘了?[其实在我们工作中很少去手写它,但是它又是很常见的在使用(控制台日

  • Pandas保存csv数据的三种方式详解

    目录 方法一 方法二 方法三 补充 方法一 import os import pandas as pd path = 'data/train/' img_label_list=[] testList = os.listdir(path) for file in testList: label='aa' img_label_list.append([file, label]) df1 = pd.DataFrame(data=img_label_list, columns=['id', 'label

  • Python图片存储和访问的三种方式详解

    目录 前言 数据准备 一个可以玩的数据集 图像存储的设置 LMDB HDF5 单一图像的存储 存储到 磁盘 存储到 LMDB 存储 HDF5 存储方式对比 多个图像的存储 多图像调整代码 准备数据集对比 单一图像的读取 从 磁盘 读取 从 LMDB 读取 从 HDF5 读取 读取方式对比 多个图像的读取 多图像调整代码 准备数据集对比 读写操作综合比较 数据对比 并行操作 前言 ImageNet 是一个著名的公共图像数据库,用于训练对象分类.检测和分割等任务的模型,它包含超过 1400 万张图像

  • Python绘制散点密度图的三种方式详解

    目录 方式一 方式二 方式三 方式一 import matplotlib.pyplot as plt import numpy as np from scipy.stats import gaussian_kde from mpl_toolkits.axes_grid1 import make_axes_locatable from matplotlib import rcParams config = {"font.family":'Times New Roman',"fo

  • Python写入MySQL数据库的三种方式详解

    目录 场景一:数据不需要频繁的写入mysql 场景二:数据是增量的,需要自动化并频繁写入mysql 方式一 方式二 总结 大家好,Python 读取数据自动写入 MySQL 数据库,这个需求在工作中是非常普遍的,主要涉及到 python 操作数据库,读写更新等,数据库可能是 mongodb. es,他们的处理思路都是相似的,只需要将操作数据库的语法更换即可. 本篇文章会给大家分享数据如何写入到 mysql,分为两个场景,三种方式. 场景一:数据不需要频繁的写入mysql 使用 navicat 工

随机推荐