当前位置: 首页 > 编程日记 > 正文

Spring注解@Component、@Repository、@Service、@Controller,@Autowired、@Resource用法

一、Spring定义bean,@Component、@Repository、@Service 和 @Controller

  Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释

  在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。 Spring2.5为我们引入了组件自动扫描机制,他可以在类路径底下寻找标注了 @Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件时一样的。要使用自动扫描机制,
在 spring的配置文件里面只需要加上<context:annotation-config/> 和<context:component-scan base-package="需要实现注入的类所在包"/>,可以使用base-package="*"表示全部的类。   配置自动扫描如下:

<?xml version="1.0" encoding="UTF-8" ?> 
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context
="http://www.springframework.org/schema/context"
xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" > <context:component-scan base-package=”com.eric.spring”> </beans>
其中base-package为需要扫描的包(含所有子包),各个注解的理解如下:
  1. @Service用于标注业务层组件,,用于标注业务层组件,表示定义一个bean,自动根据bean的类名实例化一个首写字母为小写的bean,例如Chinese实例化为chinese,如果需要自己改名字则:@Service("你自己改的bean名")。
  2. @Controller用于标注控制层组件(如struts中的action)
  3. @Repository用于标注数据访问组件,即DAO组件
  4. 而@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Service 
public class VentorServiceImpl implements iVentorService { } @Repository
public class VentorDaoImpl implements iVentorDao { }
getBean的默认名称是类名(头字母小写),如果想自定义,可以@Service(“aaaaa”)这样来指定,这种bean默认是单例的,如果想改变,可以使用@Service(“beanName”) @Scope(“prototype”)来改变。可以使用以下方式指定初始化方法和销毁方法(方法名任意):
@PostConstruct 
public void init() {  
}  
@PreDestroy 
public void destory() {  
} 

二、Spring bean 注解注入汇总

spring2.5提供了基于注解(Annotation-based)的配置,我们可以通过注解的方式来完成注入依赖。bean注入可以使用@Autowired、@Resource来完成。但它们之间是有区别的。首先来看一下:

a、@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;

 b、@Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;当候选 Bean 数目不为1时的应对方法,在默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出 BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。当然,一般情况下,使用 @Autowired 的地方都是需要注入 Bean 的,使用了自动注入而又允许不注入的情况一般仅会在开发期或测试期碰到(如为了快速启动 Spring 容器,仅引入一些模块的 Spring 配置文件),所以 @Autowired(required = false) 会很少用到。

 c、@Resource注解是由J2EE提供,而@Autowired是由Spring提供,故减少系统对spring的依赖建议使用@Resource的方式;

 d、@Resource和@Autowired都可以书写标注在字段或者该字段的setter方法之上

 e、使用@Autowired时你的Bean必须以@Service或@Component注解才行

注解与传统的编码方式实现的注入的不同用法需要注意下:例子,把DAO实现类注入到service实现类中,把service的接口(注意不要是service的实现类)注入到action中,注入时不要new这个注入的类,因为spring会自动注入,如果手动再new的话会出现错误,然后属性加上@Autowired后不需要getter()和setter()方法,Spring也会自动注入。

(1)@Resource示例:

public class StudentService3 implements IStudentService {//@Resource(name="studentDao")放在此处也是可行的private IStudentDao studentDao;    private String id;public void setId(String id) {
this.id = id;
}@Resource(name="studentDao") // 通过此注解完成从spring配置文件中查找名称为studentDao的bean来装配字段studentDao,如果spring配置文件中不存在 studentDao名称的bean则转向按照bean类型经行查找public void setStudentDao(IStudentDao studentDao) {this.studentDao = studentDao;
}public void saveStudent() {studentDao.saveStudent();System.out.print(",ID 为:"+id);
}}

配置文件添加如下信息

<bean id="studentDao" class="com.wch.dao.impl.StudentDao"></bean>
<bean id="studentService3" class="com.wch.service.impl.StudentService3" />

@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  @Resource装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

(2)@Autowired示例1

public class StudentService3 implements IStudentService {//@Autowired放在此处也是可行的private IStudentDao studentDao;private String id;public void setId(String id) {this.id = id;}@Autowired//通过此注解完成从spring配置文件中 查找满足studentDao类型的bean//@Qualifier("studentDao")则按照名称经行来查找转配的public void setStudentDao(IStudentDao studentDao) {this.studentDao = studentDao;}public void saveStudent() {studentDao.saveStudent();System.out.print(",ID 为:"+id);}}

配置文件添加如下信息

<bean id="studentDao" class="com.wch.dao.impl.StudentDao"></bean>
<bean id="studentService3" class="com.wch.service.impl.StudentService3" />

3、@Autowired示例2

@Service("OrganDaoIbatis ")
public class OrganDaoIbatis extends BaseDao implements IOrganDao {@Autowired(required=false)@Qualifier("sqlMapClient")private SqlMapClient sqlClient = null;

使用 @Autowired(required = false)作用:

当候选 Bean 数目不为 1 时的应对方法

在默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出 BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。

当然,一般情况下,使用 @Autowired 的地方都是需要注入 Bean 的,使用了自动注入而又允许不注入的情况一般仅会在开发期或测试期碰到(如为了快速启动 Spring 容器,仅引入一些模块的 Spring 配置文件),所以 @Autowired(required = false) 会很少用到。

@Qualifier 注释指定注入 Bean 的名称 作用:

和找不到一个类型匹配 Bean 相反的一个错误是:如果 Spring 容器中拥有多个候选 Bean,Spring 容器在启动时也会抛出BeanCreationException 异常。

使用Autowired时你的OrganDaoIbatis 必须以@Service或@Component注解才行。

在接口前面标上@Autowired和@Qualifier注释使得接口可以被容器注入,当接口存在两个实现类的时候必须指定其中一个来注入,使用实现类首字母小写的字符串来注入,如:

@Autowired     
@Qualifier("chinese")      
private Man man;

否则可以省略,只写@Autowired。

总结:在java代码中可以使用@Autowire或者@Resource注解方式进行装配,这两个注解的区别是:
@Autowire 默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false,如果我们想使用按照名称装配,可 以结合@Qualifier注解一起使用;

@Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属 性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找 依赖对象.

注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖的对象时候,会回退到按照类型装配,但一旦指定了name属性,就只能按照名称 装配了。

相关文章:

谁是“艾灵”?是腾讯的真国风 AI 虚拟人!

近日&#xff0c;腾讯AI虚拟人艾灵再秀出新技能&#xff0c;首次展示AI作诗、AI书法等国风才艺&#xff0c;并与青年歌手白举纲跨次元合作&#xff0c;共同演唱国风新歌《百川千仞》。AI“艾灵”诞生于腾讯AI Lab&#xff0c;来自实验性、探索性技术项目“多模态虚拟人”。机器…

[Java实现] 图片择优(选择最清楚的图片)

FuzzyDetection 图片择优&#xff08;选择最清楚的图片&#xff09;【Java实现】效果不错&#xff0c;大家可以根据我的源码改成自己使用的语言并应用到自己项目中。 实现思路 获取图片的灰度图数组使用拉普拉斯算子进行卷积运算 {0, 1, 0, 1, -4, 1, 0, 1, 0}获取结果的方差与…

C#获取硬盘序列号

using System; using System.IO; using System.Runtime.InteropServices; using System.Text; using Microsoft.Win32; namespace Wjb.ReadOrWriteIniAndReg { /// <summary> /// HardDiskVal 的摘要说明。 /// 读取指定盘符的硬盘序列号 /// 功能&#xff1a;读…

Arm 发布移动端 v9 体系新架构,CPU、GPU、IP全囊括了

作者 | 夕颜头图 | 下载于ICphoto出品 | AI 科技大本营&#xff08;ID:rgznai100&#xff09;2021年5月25日晚&#xff0c;Arm发布了针对移动端的Armv9体系新架构&#xff0c;除了公布首款全面计算&#xff08;Total Compute&#xff09;解决方案&#xff0c;Arm还发布了首批基…

16条很有用的Chrome浏览器命令

为什么80%的码农都做不了架构师&#xff1f;>>> Google Chrome浏览器有很多的特性在界面菜单中是没有体现的&#xff0c;你可以通过「chrome://命令」来访问。在Chrome的浏览器地址栏中输入命令&#xff0c;就会返回相应的结果。下面是16个非常有用的chrome://命令…

Spring集成Redis方案(spring-data-redis)(基于Jedis的单机模式)(待实践)

说明&#xff1a;请注意Spring Data Redis的版本以及Spring的版本&#xff01;最新版本的Spring Data Redis已经去除Jedis的依赖包&#xff0c;需要自行引入&#xff0c;这个是个坑点。并且会与一些低版本的Spring有冲突&#xff0c;要看官方文档和不断的测试。 继上一篇文章ht…

leetcode -- 3 sum

3-sum 题目描写叙述&#xff1a; Given an array S of n integers, are there elements a, b, c in S such that a b c 0? Find all unique triplets in the array which gives the sum of zero. 题目要求&#xff1a; Elements in a triplet (a,b,c) must be in non-desc…

C#中如何得到机器的IP地址

如何使用DNS类并得到机器的IP地址的技巧 介绍 这篇文章并不是技术纵览或大型讨论&#xff0c;而更像是关于如何得到IP地址或主机名称的技巧集锦。在 Win32 API编程中你可以使用NetWork API&#xff0c;在.NET平台中也是类似的。唯一的不同之处是你要找到并理解为完成这个任务需…

让浏览器开挂的插件,测评师教你如何选

CSDN下起了红包雨399 元智能音箱199 元天猫精灵300元现金红包/会员100元红包/会员更有千万流量曝光100%有奖......作为日常总发现 " 宝藏 " 的你总体验过一些 " 王炸 " 级别的chrome插件让你想 “ 真诚 ” 安利所以&#xff0c;CSDN开启了彩虹屁chrome插件…

JQuery:JQuery 中的CSS()方法

JQuery:CSS()方法jQuery css()方法&#xff1a;css()方法设置或返回被选元素的一个或多个样式属性。1、返回 CSS 属性如需返回指定的 CSS 属性的值&#xff0c;请使用如下语法&#xff1a;css("propertyname");下面的例子将返回首个匹配元素的 background-color 值&a…

j.u.c.locks.AbstractQueuedSynchronizer.Node

2019独角兽企业重金招聘Python工程师标准>>> AQS是JUC当中最核心的部分&#xff0c;大部分多线程讲解&#xff0c;都不会详细讲AQS&#xff0c;AQS的源代码&#xff0c;要看明白还是有点困难的。但是一旦看明白了&#xff0c;结构还是蛮清晰的。这里我们把AQS拆开&a…

使用C#开发COM+组件

一般来说&#xff0c;在IT技术界以及硬件产业&#xff0c;技术的更新换代速度非常得惊人&#xff0c;而惯例是所有的新技术都会遵循向下兼容的原则&#xff0c;但是.NET技术不仅仅做到了这一点&#xff0c;.NET甚至实现了相互之间的各自调用&#xff0c;这一点是非常难能可贵的…

香奈儿的 AI 实验室里,发生了什么?

作者 | 库珀来源 | 数据实战派头图 | 下载于ICphotoAI 已经能够在给你播报今日天气时提供穿衣建议。相信你大多数情况下都听进去了。如果它给你提供美妆建议呢&#xff1f;包括香奈儿在内&#xff0c;越来越多的美容品牌正在将 AI 技术结合到其产品之中。可是&#xff0c;人工智…

VS code for python开发利器

转发点赞支持引言最近在整理python自动化测试课程的内容&#xff0c;发现了微软出的vs code编辑器太牛逼了&#xff0c;非常好用&#xff0c;而且轻量的不要不要的&#xff0c;特此记录下&#xff0c;有选择纠结症的朋友我强烈推荐使用ta。PS&#xff1a;兼容win10且兼容高分辨…

C#编码标准--命名约定和风格

命名约定和风格 1&#xff0e; 使用Pascal的命名规范命名类型和方法的名字。 public class SomeClass { public SomeMethod(){} } 2&#xff0e; 使用camel命名规范命名局部变量和方法的参数。 int number; void MyMethod(int someNumber) {} 3&#xff0e; 在命名接…

与AMD合并后,赛灵思与英特尔、英伟达在数据中心市场呈“三足鼎立”之势

被以350亿美元的价格收购后&#xff0c;全球独一家FPGA公司赛灵思归于芯片巨头AMD的麾下&#xff0c;正式成为AMD的一份子。如果英伟达收购ARM顺利进行&#xff0c;无疑将让半导体行业格局再次发生巨变。 赛灵思为什么会选择归于AMD旗下&#xff1f;成为AMD的一份子之后&#…

Android -- Fragment注意事项

ViewPagerFragment 让Fragment成为ViewPager的一页时&#xff0c;FragmentManager会一直保存管理创建好了的Fragment&#xff0c;即使当前不是显示的这一页&#xff0c;Fragment对象也不会被销毁&#xff0c;…

C#编码标准--编码习惯

1. 避免将多个类放在一个文件里面。 2. 一个文件应该只有一个命名空间&#xff0c;避免将多个命名空间放在同一个文件里面。 3. 一个文件最好不要超过500行的代码&#xff08;不包括机器产生的代码&#xff09;。 4. 一个方法的代码长度最好不要超过25行。 5. 避免方法中有超过…

官宣!《新程序员·开发者黄金十年》正式发布

“在互联网还不发达的时代&#xff0c;就是《程序员》伴我成长的。”“怀念啊&#xff0c;曾经《程序员》的日子。”“我是看着《程序员》长大的&#xff0c;大二时买了创刊号。”“这可是我们这一代人大学时候满满的回忆&#xff0c;也是当时寝室中传阅最多的书。”“每年的《…

java笔记(一)

2019独角兽企业重金招聘Python工程师标准>>> java数组是静态的&#xff0c;即数组被初始化后&#xff0c;其所占内存空间、数组长度是不可变的。初始化数组有静态初始化和动态初始化两种&#xff1a; public class ArrayTest {//以下是数组的两种静态初始化String[]…

遮罩效果的实现

很多时候我们需要用到遮罩弹出层效果&#xff0c;下面给出一个简单的遮罩demo&#xff1b; 效果演示 demo代码 注意引入jquery <html> <head> <meta charset"utf-8"> <title>遮罩</title><script srcjquery-1.8.3.min.js></s…

C#实现汉字转化为拼音

其实现的原理就是先将汉字转化成为内码&#xff0c;然后通过内码和拼音的对照来查找。 详细的代码如下所示&#xff1a; public class chs2py {private static int[] pyvaluenew int[]{-20319,-20317,-20304,-20295,-20292,-20283,-20265,-20257,-20242,-20230,-20051,-20036,…

c基础知识复习

C的发展历程 C原本是为了开发UNIX操作系统而设计的语言&#xff1b;如此说&#xff0c;应该C比UNIX更早问世&#xff0c;而事实并非如此&#xff0c;最早的UNIX是由汇编写的&#xff1b; C语言本来是美国人开发的&#xff0c;解读C的声明&#xff0c;最好还是用英语来读&#x…

训练 GPT-3,为什么原有的深度学习框架吃不消?

本文梳理了深度学习框架在支持大规模预训练模型时面临的技术挑战&#xff0c;以及当前各类框架的基本解决思路&#xff0c;帮助算法工程师对业界各类框架的分布式训练能力有更清晰的认知。作者 | 一流科技CEO袁进辉头图 | 下载于ICphoto近年来&#xff0c;深度学习被广泛应用到…

ImageMagick简单记录

一、安装 mac下的安装非常简单 brew search ImageMagick brew install xxx 安装后&#xff0c;可验证 magick logo: logo.gif identify logo.gif display logo.gif 更多安装方式参考&#xff1a;http://www.imagemagick.org/script/download.php 二、命令介绍 命令概览convert&…

低代码、RPA 和 AI,有什么区别

来源 | LowCode低码时代头图 | 下载于视觉中国在To B领域&#xff0c;低代码、RPA和AI可谓是“流量担当”&#xff0c;它们自带To B基因&#xff0c;搭载快速发展的企业服务赛道&#xff0c;在企业级IT服务这一细分市场崭露头角。以这三者为代表的前沿理念和科技引领IT产业升级…

C# 获取 IE 临时文件

大家知道&#xff0c;在我们访问一个网站的时候。系统会把这个网站上的图片&#xff0c;动画等内容全部缓存到Internet临时文件夹中。 我们可以通过 <Drives>:/Documents and Settings/<user>/Local Settings/Temporary Internet Files访问。但是可能我们都没有想…

wifidog接口文档(转)

目录(?)[-] 网关心跳协议 请求信息 回复格式 例子用户状态心跳协议 请求格式 注意 回复格式 状态码 例子跳转协议 请求格式 例子注册协议 请求格式 例子wifidog是搭建无线热点认证系统的解决方案之一&#xff0c;他比nocat更适合互联网营销思路。目前支持openwrt系统&#xff…

Oracle XQuery 过滤XML查询SQL

Oralce 支持SQL XQuery查询 一个简单示例&#xff1a; SELECT XMLQuery(for $i in /Videogame return $i/Type passing by value X RETURNING CONTENT) FROM (SELECT XMLTYPE(<Videogame><Type>Racing</Type><Name>NFS Most Wanted</Name><…

C#2.0匿名函数

C# 2.0中提供了通过delegate实现匿名函数功能&#xff0c;能有效地减少用户记代码工作&#xff0c;例如 以下为引用&#xff1a; ... button1.Click new EventHandler(button1_Click); ... void button1_Click(Object sender, EventArgs e) { // Do something, the button…