@Resource标签name属性的使用

内容只是个人的理解, 没有看源码, 会与实际情况有差异。有源码分析的同志, 万分感谢能够指点我以下。

@Resource 标签 name 属性的使用

  在sping中, 被@Component标签标识的类会在servlet容器启动时加载单实例(默认设置下), @Resource标签负责注入。

  如果@Resource标签的类型没有被提前加载, 则会报错。

  在装载过程中, 会根据类名(不包括package地址)判断, 出现重复的类名会报异常(不在同一个package, 也会报异常)。所以同一个接口的多个实现类, 能够被正常加载。

  在匹配过程中@Resource标签默认会根据name属性的值判断( @Resource(name="自定义的名称") ),


@Resource(name = "arg1")

定义了name属性的值, 就只按照name值匹配
@Resource 根据属性名匹配, 如果匹配不到就进行type匹配

  对于接口, 会去寻找其实现类进行匹配, 所以需要注意有多个实现类的时候, 会匹配出多个结果, 如果不指定name值, 会报异常

下面是测试代码,根据代码会比较直观一点。

 1 package com.springmvc.bean;
 2
 3 import org.springframework.stereotype.Component;
 4
 5 @Component("arg1")
 6 public class AunotationBean {
 7
 8     public AunotationBean() {
 9         System.out.println("constructors of com.springmvc.[bean].AunotationBean");
10     }
11
12     public void init() {
13         System.out.println("init com.springmvc.[bean].AunotationBean");
14     }
15 }
1 package com.springmvc.bean;
2
3 public interface Temporary {
4
5     void init();
6 }
 1 package com.springmvc.bean;
 2
 3 import org.springframework.stereotype.Component;
 4
 5 @Component("temp1")
 6 public class Temporary1Impl implements Temporary {
 7
 8     public Temporary1Impl() {
 9         System.out.println("constructors of Temporary[1]Impl");
10     }
11
12     @Override
13     public void init() {
14         System.out.println("init Temporary[1]Impl");
15     }
16 }
 1 package com.springmvc.bean;
 2
 3 import org.springframework.stereotype.Component;
 4
 5 @Component("temp2")
 6 public class Temporary2Impl implements Temporary {
 7
 8     public Temporary2Impl() {
 9         System.out.println("constructors of Temporary[2]Impl");
10     }
11
12     @Override
13     public void init() {
14
15         System.out.println("init Temporary[2]Impl");
16     }
17 }
 1 package com.springmvc.demo;
 2
 3 import org.springframework.stereotype.Component;
 4
 5 @Component("arg2")
 6 public class AunotationBean {
 7
 8     public AunotationBean() {
 9         System.out.println("constructors of com.springmvc.[demo].AunotationBean");
10     }
11
12     public void init() {
13         System.out.println("init com.springmvc.[demo].AunotationBean");
14     }
15 }
 1 package com.springmvc.main;
 2
 3 import javax.annotation.Resource;
 4
 5 import org.springframework.stereotype.Component;
 6
 7 import com.springmvc.bean.Temporary;
 8
 9 @Component
10 public class SpringmvcTest {
11
12     @Resource(name = "arg1")
13     com.springmvc.bean.AunotationBean arg1; // 定义了name属性的值, 就只按照name值匹配
14
15     @Resource
16     com.springmvc.demo.AunotationBean arg2; // 根据属性(arg2)匹配, 如果匹配不到就进行type匹配
17
18     @Resource // 接口会去寻找其实现类
19     Temporary temp1; // 如果此处是 Temporary temp11, 会先根据temp11寻找, 找不到的时候再根据Temporary寻找, 会寻找到2个实现类
20
21     @Resource // 如果不定义name, 那么会自动根据name(temp2)属性值进行匹配
22     Temporary temp2;
23
24     // [个人猜测]装载的时候是根据类名是否重复进行判断, 同一个接口的多个实现类只要类名不同即可通过编译, 但是没有直接关联的两个类如果类名相同, 不会通过编译, 匹配的时候如果是接口类型, 那么会寻找其实现类, 这个时候会出现有多个选择的问题
25 }
 1 package com.springmvc.main;
 2
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Component;
 5
 6 @Component
 7 public class SpringmvcMain {
 8
 9     public SpringmvcMain(@Autowired SpringmvcTest args) {
10         args.arg1.init();
11         args.arg2.init();
12         args.temp1.init();
13         args.temp2.init();
14     }
15 }
时间: 2024-10-22 07:26:25

@Resource标签name属性的使用的相关文章

@Autowired标签与 @Resource标签 的区别

Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解,如:@Resource. @PostConstruct及@PreDestroy. 1. @Autowired    @Autowired是Spring 提供的,需导入    Package:org.springframework.beans.factory.annotation.Autowired;    只按照byType 注入.2. @Resource    @Resource默认按 byNam

jQuery 的 Div 标签滚动条属性及判断垂直滚动条是否到达底部

转自:http://blog.163.com/[email protected]/blog/static/1284651702010894509982/ 关于 jQuery 的 Div 标签的滚动条的概念,没有几个人能够完全.正确搞明白的. 我知道很多人不同意我的观点.但是如果去百度上搜素,与 jQuery 滚动条有关的信息,都是关于滚动条外观和滚动条插件的.我最近在制作一个滚动条相关的页面效果,去 CSDN 论坛里提问,得到了一段代码,还是错误的. jQuery 里和滚动条有关的概念很多,但是

jQuery easyUI id选择器 类选择器 标签选择器 属性选择器 及DOM对象和jQuery相互之间的转换

首先导入js文件 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"

select标签multiple属性的使用方法

前些日子公司让做一个功能模块,对于里面一个小功能费了些周折,现将其总结一下: 一.实现效果: 一.实现代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&qu

HTML超文本标记语言(二)-HTML中几个常用标签及属性

HTML中几个常用标签及其属性 一.HTML链接标签:<a></a> 1.herf属性:创建指向另一个文档的标签(超链接) 语法结构:<a href=url">Link Text</a> 注意: "链接文本"不必一定是文字,图片或其他HTM元素也可以成为链接. 2.name属性:规定锚的名称,用于创建文档内的书签(锚) 语法结构如下. 命名锚:<a name="tip">基本的注意事项-有用的提示

H5 video标签的属性

35-video标签 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>35-video标签</title> </head> <body> <!-- 1.什么是video标签? 作用: 播放视频 格式: <video src=""> </v

mybatis resultmap标签type属性什么意思

mybatis resultmap标签type属性什么意思? :就表示被转换的对象啊,被转换成object的类型啊 <resultMap id="BaseResultMap" type="BaseObject"> <id property="id" column="id" /> <result property="appId" column="appid"

超链接a标签的属性target的可选值有哪些以及区别

超链接a标签的属性target的可选值有哪些以及区别 1.<a target="_blank"></a> 2.<a target="_parent"></a> 3.<a target="_self"></a> 4.<a target="_top"></a> 5.<a target="new"><

video标签常用属性及说明

video标签常用属性(在标签内部使用) video常用API属性及方法(API属性是供JS调用的,不在video标签元素中直接使用)