Spring3:类型安全依赖项注入

在从Spring跳到类型安全依赖注入之前,我想讨论一下我们之前所做的方式。 我们一直在借助Spring的Autowired注释按类型使用依赖项注入。
像这样的东西会注入Spring Bean。
@Autowired
private StudentDao studentDao; // Autowires by type. Injects the instance whose type is StudentDao

但是,如果我们有一种类型的多个Spring bean,那么我们将使用Qualifier Annotation和Autowired,实际上是按名称注入spring bean。

具有以下内容的应用程序上下文:

<bean id="studentDao1" class="StudentDao" />
<bean id="studentDao2" class="StudentDao" />

因此,如果现在有两个StudentDao实例(studentDao1和studentDao2),则可以按名称注入spring bean。

@Autowired
@Qualifier("studentDao1")
private StudentDao studentDao1;@Autowired
@Qualifier("studentDao2")
private StudentDao studentDao2;

使用JSR-250指定的资源注释可以实现相同的目的。 因此,我们可以使用此注释将bean注入到字段或单参数方法中。 自动装配比Resource灵活得多,因为它可以与多参数方法以及构造函数一起使用。
我们可以通过以下方式使用Resource注解按名称注入bean。

@Resource
private StudentDao studentDao1;

Spring 3中的类型安全依赖项注入

使用@Qualifier定义自定义注释

要在不指定名称的情况下识别注入的bean,我们需要创建一个自定义注释。 这等效于在CDI中使用JSR 330批注(Inject)的过程。

@Target({ElementType.Field, ElementType.Parameter})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @Interface Student  {
}

现在将此自定义注释分配给EntityDao接口的实现

@Component
@Student
public class StudentDao implements EntityDao   {
}

@Component告诉Spring这是一个bean定义。 每当使用EntityDao的引用时,Spring IoC就会使用@Student批注将StudentDao标识为EntityDao的实现。
使用@Autowired和自定义限定符注入bean
这样的东西。

@Autowired
@Student
private EntityDao studentDao; // So the spring injects the instance of StudentDao here.

这减少了字符串名称的使用,因为字符串名称可能会拼写错误并且难以维护。

参考: 如何在Spring 3中使用类型安全依赖项注入? 来自我们的JCG合作伙伴 Saurab Parakh在Coding is Cool博客上。


翻译自: https://www.javacodegeeks.com/2012/05/spring-3-type-safe-dependency-injection.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

userData IE

蛮讨厌IE的&#xff0c;因为他常常需要特别照顾&#xff0c;就像DOM Storage(sessionStorage和localStorage)只能支持IE8&#xff0c;对于以下的只能使用userData。 原理&#xff1a;通过在document元素后面附加一个专属的“DHTML行为”来实现客户端存储&#xff0c; var memor…

context元素大概解说

Context元素代表一个web应用&#xff0c;运行在某个特定的虚拟主机上。如Servlet Specification 2.2或以后版本中描述的那样&#xff0c;每个web应用基于一个Web Application Archive(WAR)文件&#xff0c;或者是一个目录&#xff0c;包含WAR文件解压后的内容。有关Web Applica…

全新的Play模块资料库

去年11月&#xff0c;我曾与Play框架的 Nicolas Leroux谈过创建模块存储库的问题。 他同意这将是一个好主意&#xff0c;但是时间不足使我无法开始。 在上周Google Play小组发生了暴风雨之后&#xff0c;我决定将其优先处理。 可以在几周内提供可工作的原型。 概述&#xff1a;…

Ubuntu 16.04 安装 VMware-Workstation-12

以前一直使用 Ubuntu Virtaulbox &#xff0c;最近测试了 VMware-Workstation-9,性能超过 Virtaulbox-4.2.x,下面是详细步骤:1 首先准备一个Ubuntu 系统 lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04 LTS Release: 16.04 …

Linux的md64进程,在Linux上安装Elasticsearch Kibaba.md(示例代码)

在Linux上安装Elasticsearch KibabaKibana是一个开源为elasticsearch 引擎提供数据和数据分析1、下载安装切换到root账户&#xff0c;按顺序依次执行以下命令rpm包安装$wget -c https://artifacts.elastic.co/downloads/kibana/kibana-5.5.3-x86_64.rpm$sha1sum kibana-5.3.2-x…

SSH实战 · 唯唯乐购项目(中)

用户模块三&#xff1a;一级分类的查询创建一级分类表并导入基本数据CREATE TABLE category (cid int(11) NOT NULL AUTO_INCREMENT,cname varchar(255) DEFAULT NULL,PRIMARY KEY (cid)) ENGINEInnoDB AUTO_INCREMENT11 DEFAULT CHARSETutf8;建包及相应的类:com.weiwei.shoppi…

播放2 –模块,插件有什么区别?

关于Play 2模块和插件似乎有些混乱。 我想这是因为两者经常是同义词。 在Play&#xff08;两个版本-1和2&#xff09;中&#xff0c;存在明显的差异。 在本文中&#xff0c;我将介绍什么是插件&#xff0c;如何在Java和Scala中实现插件&#xff0c;以及如何从模块导入插件。 外…

Linux多线程贝叶斯建树教程,建树经验.doc

建树经验分子进化树构建及数据分析的简介mediocrebeing, rodger, lylover, klaus, oldfish, yzwpf一、引言开始动笔写这篇短文之前&#xff0c;我问自己&#xff0c;为什么要写这样的文章&#xff1f;写这样的文章有实际的意义吗&#xff1f;我希望能够解决什么样的问题&#x…

Android的IPC机制(一)——AIDL的使用

综述 IPC(interprocess communication)是指进程间通信&#xff0c;也就是在两个进程间进行数据交互。不同的操作系统都有他们自己的一套IPC机制。例如在Linux操作系统中可以通过管道、信号量、消息队列、内存共享、套接字等进行进程间通信。那么在Android系统中我们可以通过Bin…

python学习笔记(python介绍)

为什么要学python&#xff1f; python和shell的比较&#xff0c;和PHP、和JAVA比较 运维开发只是用到python的很小一部分 python在一些知名公司的应用&#xff1a; 谷歌&#xff1a;python的创始人原来在谷歌工作。 CIA&#xff1a;美国中情局网站用python开发的 NASA&#xff…

Netty:透明地使用SPDY和HTTP

大多数人已经从谷歌那里听说过SPDY&#xff0c;该协议被提议作为老化的HTTP协议的替代品。 Web服务器是浏览器正在缓慢地实现该协议&#xff0c;并且支持正在增长。 在最近的文章中&#xff0c;我已经写过SPDY的工作方式以及如何在Jetty中启用SPDY支持。 由于Netty&#xff08;…

selenium 等待页面加载完成

一、隐形加载等待&#xff1a; file:///C:/Users/leixiaoj/Desktop/test.html 该页面负责创建一个div <html> <head><title>Set Timeout</title><style>.red_box {background-color: red; width 20%; height:100px; border: none;}</style&…

linux nfsnobody用户,处理CentOS 5.5 x64 配置NFS服务过程中nfsnobody用户造成的问题

4、我们编译一下这个NFS的配置文件。[rootNFS /]# vi /etc/exports/share 192.168.60.0/24(rw,sync,all_squash,root_squash) (我们允许这个共享对192.168.60.0/24网段可读可写&#xff0c;且将所有访问者包括root的身份都改为nfsnobody)[rootNFS /]# /etc/init.d/nfs resta…

计算机语言

软件&#xff1a;是一系列按照特定顺序组织的计算机数据和指令的集合。一般来讲软件被划分为系统软件、应用软件和介于这两者之间的中间件。 系统软件 系统软件是各类操作系统&#xff0c;如windows、Linux、UNIX等&#xff0c;还包括操作系统的补丁程序及硬件驱动程序&#xf…

Apache Shiro第2部分–领域,数据库和PGP证书

这是致力于Apache Shiro的系列文章的第二部分。 我们从简单的不安全Web应用程序开始了上一部分 。 完成后&#xff0c;该应用程序具有基本的身份验证和授权。 用户可以登录和注销。 所有网页和按钮均已分配和实施访问权限。 授权和身份验证数据都已存储在静态配置文件中。 正如…

js中变量作用域的小理解

一&#xff1a;变量作用域 在js代码中每个变量都是有自己的作用域的&#xff0c;js中不像C语言有块级作用域的概念&#xff0c;取而代之的是函数作用域&#xff0c;看如下代码&#xff1a; var scope"global"; function init(){ alert(scope);var scope "local…

安卓linux开机画面,Android系统的开机画面显示过程分析(1)

好几个月都没有更新过博客了&#xff0c;从今天开始&#xff0c;老罗将尝试对Android系统的UI实现作一个系统的分析&#xff0c;也算是落实之前所作出的承诺。提到Android系统的UI&#xff0c;我们最先接触到的便是系统在启动过程中所出现的画面了。Android系统在启动的过程中&…

如果你的NavigationDrawer里面的Item没有响应,Drawer不能左滑关闭

如果你的NavigationDrawer里面的Item没有响应&#xff0c;Drawer不能左滑关闭&#xff0c;应该是因为你没有把主要内容放在DrawerLayout标签下的第一位。 The main content view (the FrameLayout above) must be the first child in the DrawerLayout because the XML order i…

JAXB和未映射的属性

JAXB&#xff08;JSR-222&#xff09;是例外配置&#xff0c;这意味着存在默认映射应用于域对象。 这意味着有时您需要显式排除字段/属性。 在本文中&#xff0c;我将讨论如何使用XmlTransient或XmlAccessorType&#xff08;XmlAccessType.NONE&#xff09;以及何时使用每个选项…

sublime text3 使用SVN插件

Simon在项目中经常使用SVN&#xff0c;每次都要切换提交&#xff0c;很麻烦&#xff0c;有了这个SVN插件就很方便了&#xff0c;使用快捷方式提交&#xff0c;更新。 安装: Ctrl Shift P 调用出Sublime Text的包管理工具&#xff0c;输入TortoiseSVN&#xff0c;回车进行安装…