Spring注解@Resource和@Autowired
- 格式:doc
- 大小:34.00 KB
- 文档页数:3
autowired和resource注解的使用场景Autowired和Resource都是用于依赖注入的注解,但它们的使用场景有所不同。
Autowired是Spring框架提供的注解,它可以自动装配一个Bean,根据
类型进行匹配,也可以根据名称进行匹配。
当有多个Bean可以匹配时,可以使用Qualifier注解来指定具体的Bean。
因此,如果使用Spring框架,建议使用Autowired注解,因为它更加灵活,可以根据类型和名称进行匹配。
Resource是Java EE提供的注解,它也可以自动装配一个Bean,但只能根据名称进行匹配。
如果没有指定名称,则默认使用属性名作为Bean的名称进行匹配。
因此,如果使用Java EE容器,可以使用Resource注解。
请注意,这些信息仅适用于Java开发中Spring框架和Java EE容器的使用。
具体的注解使用可能会因开发环境和框架的不同而有所差异。
在使用这些注解时,请务必参考相关文档和框架的规范,以确保正确的使用和效果。
Spring源码分析:@Autowired注解原理分析Spring源码分析:@Autowired注解原理分析前⾔关于@Autowired这个注解,我们再熟悉不过了,经常跟@Resource来做对⽐,这篇⽂章我们不讨论两者有何异同,仅分析@Autowired的原理(基于Spring5)。
问题假如⼀个接⼝(IUserService)有两个实现类,分别是(UserServiceImpl01)和(UserServiceImpl02),在我们给类注⼊的时候,这样写(@Autowired private IUserService userService)会发⽣什么情况?答案肯定是报错,那么原理呢?⽂字描述:因为⾸先@Autowired是按照类型注⼊的,也就是.class,但UserServiceImpl01和UserServiceImpl02都是IUserService类型的,于是Spring就会按照后⾯的名字(userService)在容器中查找,但发现根本没有这个名字,因为两个实现类在不指定名字情况下,就是⾸字母⼩写的类名,然后抛出异常:expected single matching bean but found 2。
如何解决这类问题1. 如果有两个实现类,还要使⽤@Autowired注解,可以将userService改成我们指定的实现类名称,⽐如UserServiceImpl01,或者不想改userService,可以加@Qualifier(value = "userServiceImpl01"),指定需要注⼊的实现类。
2. 使⽤@Resource注解,⼿动指定实现类名称。
还有很多种⽅法,但基本思想都⼀样,⽆⾮就是如何区分两个同祖宗的⼉⼦,既然根⼉相同,那就只有指定名字了。
@Autowired原理提到@Autowired我们⼀般都知道叫依赖注⼊1. 什么是依赖注⼊?2. 什么是注⼊,注到哪⾥?3. 什么时候注⼊的?什么是依赖注⼊?依赖注⼊:Dependency Injection,简称DI,说⽩了就是利⽤反射机制为类的属性赋值的操作。
介绍今天使用Idea写代码的时候,看到之前的项目中显示有warning的提示,去看了下,是如下代码?@Autowireprivate JdbcTemplate jdbcTemplate;提示的警告信息Field injection is not recommended Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".这段是Spring工作组的建议,大致翻译一下:属性字段注入的方式不推荐,检查到的问题是:Spring团队建议:"始终在bean中使用基于构造函数的依赖项注入,始终对强制性依赖项使用断言"如图Field注入警告注入方式虽然当前有关Spring Framework(5.0.3)的文档仅定义了两种主要的注入类型,但实际上有三种:基于构造函数的依赖注入public class UserServiceImpl implents UserService{private UserDao userDao;@Autowirepublic UserServiceImpl(UserDao userDao){erDao = userDao;}}基于Setter的依赖注入public class UserServiceImpl implents UserService{private UserDao userDao;@Autowirepublic serUserDao(UserDao userDao){erDao = userDao;}}基于字段的依赖注入public class UserServiceImpl implents UserService{@Autowireprivate UserDao userDao;}基于字段的依赖注入方式会在Idea当中吃到黄牌警告,但是这种使用方式使用的也最广泛,因为简洁方便.您甚至可以在一些Spring指南中看到这种注入方法,尽管在文档中不建议这样做.(有点执法犯法的感觉)如图Spring自己的文档基于字段的依赖注入缺点对于有final修饰的变量不好使Spring的IOC对待属性的注入使用的是set形式,但是final类型的变量在调用class的构造函数的这个过程当中就得初始化完成,这个是基于字段的依赖注入做不到的地方.只能使用基于构造函数的依赖注入的方式掩盖单一职责的设计思想我们都知道在OOP的设计当中有一个单一职责思想,如果你采用的是基于构造函数的依赖注入的方式来使用Spring的IOC的时候,当你注入的太多的时候,这个构造方法的参数就会很庞大,类似于下面。
Spring常⽤的⼀些注解说明@Configuration从Spring3.0,@Configuration⽤于定义配置类,可替换xml配置⽂件,被注解的类内部包含有⼀个或多个被@Bean注解的⽅法。
这些⽅法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进⾏扫描,并⽤于构建bean定义。
@Bean@Bean注解⽤于告诉⽅法,产⽣⼀个Bean对象,然后这个Bean对象交给Spring管理。
产⽣这个Bean对象的⽅法Spring只会调⽤⼀次,随后这个Spring将会将这个Bean对象放在⾃⼰的IOC容器中。
SpringIOC 容器管理⼀个或者多个bean,这些bean都需要在@Configuration注解下进⾏创建,在⼀个⽅法上使⽤@Bean注解就表明这个⽅法需要交给Spring进⾏管理。
@Autowired、@Resource@Resource和@Autowired注解都是⽤来实现依赖注⼊的。
只是@AutoWried按by type⾃动注⼊,⽽@Resource默认按byName⾃动注⼊。
♣ @Autowired@Autowired具有强契约特征,其所标注的属性或参数必须是可装配的。
如果没有Bean可以装配到@Autowired所标注的属性或参数中,⾃动装配就会失败,抛出NoSuchBeanDefinitionException.@Autowired可以对类成员变量、⽅法及构造函数进⾏标注,让 spring 完成 bean ⾃动装配的⼯作。
@Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。
♣ @Resource@Resource是JDK提供的注解,有两个重要属性,分别是name和type。
@Resource依赖注⼊时查找bean的规则既不指定name属性,也不指定type属性,则⾃动按byName⽅式进⾏查找。
Spring中Bean管理的常⽤注解在Spring中,主要⽤于管理bean的注解分为四⼤类:1.⽤于创建对象。
2.⽤于给对象的属性注⼊值。
3.⽤于改变作⽤的范围。
4.⽤于定义⽣命周期。
这⼏个在开发中经常接触到,也可以说每天都会遇见。
其中创建对象是重点,Spring中创建对象的有四个:分别是@Component,@Controller,@Service,@Repository。
对于@Component注解:把资源让Spring来管理,相当于xml中的配置的Bean。
属性:value:指定Bean中的id。
如果不指定value属性,默认Bean的id是当前类的类名,⾸字母⼩写。
在开发中的场景是这样的,其实是在实现类中加⼊即可:@Component("customerService")public class CustomerServiceImpl implements CustomerService{public void save() {System.out.println("顾客保存⽅法");}}⽽其它的三个注解都是针对⼀个衍⽣注解,它们的作⽤及属性都是⼀模⼀样的。
只不过提供了更加明确的语义化。
@Controller:⼀般⽤于表现层的注解。
@Service:⼀般⽤于业务层的注解。
@responsitory:⼀般⽤于持久层的注解。
⽤法与以上相同,这⾥不做过多的解释。
要理解这个三个注解就是让标注类本⾝的⽤途清晰⽽已。
接下来,聊聊⽤于给对象的属性注⼊值得问题。
Spring给我们提出了注⼊数据的注解有:@Value,@Autowired,@Qualifier,@Resource。
其中@Value:注⼊基本数据类型和String类型数据,它的属性value⽤于指定值。
@Autowired这个⽤法是⽐较重要的,它能够⾃动按照类型注⼊。
当使⽤注解注⼊属性时,set⽅法可以省略。
Spring注解@Qualifier的详细⽤法你知道⼏种环境:springboot2.3.10⼀般使⽤在项⽬中使⽤@Qualifier来限定注⼊的Bean。
由于项⽬中我习惯⽤@Resource注解,所以这⾥先对@Autowired和@Resource进⾏个简单的说明。
@Autowired和@Resource区别相同点:@Autowired与@Resource都可以⽤来装配Bean。
都可以写在字段上,或写在setter⽅法上。
区别:1、@Autowired(Spring注解)默认按类型装配,默认情况下必须要求依赖对象必须存在(不存在会报错),可以通过required=false属性设置⾮必须,如果我们想使⽤名称装配可以结合@Qualifier注解进⾏使⽤,⽰例如下:@Autowired(required = false)private Date date ;@Autowired@Qualifier("birth")private Date birthday ;当系统中存在多个相同类型的Bean时,如果不使⽤@Qualifier程序启动是会报错@Beanpublic Date d1() {return new Date() ;}@Beanpublic Date d2() {return new Date() ;}@Autowiredprivate Date date ;2、@Resoure(JavaEE注解)默认按照名称进⾏装配,可以通过name属性指定名称,如果没有指定name属性,当注解写在字段上时,默认取字段名进⾏查找注⼊,如果写在setter⽅法上默认取属性名进⾏装配。
当找不到与名称匹配的bean时才按照类型进⾏装配。
但是需要注意的是,如果name属性⼀旦指定,就只会按照名称进⾏装配。
⽰例:还是上⾯的例⼦@Resourceprivate Date date启动后会报错:Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'java.util.Date' available:expected single matching bean but found 2: d1,d2因为我们没有以date为名称的bean,所以会按照类型进⾏注⼊,但是类型⼜有两个Date的Bean。
springMVC的所有注解的原理1、@Controller@Controller ⽤于标记在⼀个类上,使⽤它标记的类就是⼀个SpringMVC Controller 对象。
分发处理器将会扫描使⽤了该注解的类的⽅法,并检测该⽅法是否使⽤了@RequestMapping 注解。
@Controller 只是定义了⼀个控制器类,⽽使⽤@RequestMapping 注解的⽅法才是真正处理请求的处理器。
2、@RequestMappingRequestMapping是⼀个⽤来处理请求地址映射的注解,可⽤于类或⽅法上。
⽤于类上,表⽰类中的所有响应请求的⽅法都是以该地址作为⽗路径。
RequestMapping注解有六个属性,下⾯我们把她分成三类进⾏说明(下⾯有相应⽰例)。
1、 value, method;value:指定请求的实际地址,指定的地址可以是URI Template 模式(后⾯将会说明);method:指定请求的method类型, GET、POST、PUT、DELETE等;2、consumes,producesconsumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;3、params,headersparams:指定request中必须包含某些参数值是,才让该⽅法处理。
headers:指定request中必须包含某些指定的header值,才能让该⽅法处理请求。
3、@Resource和@Autowired@Resource和@Autowired都是做bean的注⼊时使⽤,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导⼊,但是Spring⽀持该注解的注⼊。
autowired和resource注解原理一、概述在Java的Spring框架中,Autowired和Resource注解是两个非常重要的注解,它们在自动装配和资源加载方面发挥着重要的作用。
Autowired注解用于自动装配bean的属性,而Resource注解则用于加载资源文件。
本文将详细介绍这两个注解的原理和使用方法。
二、Autowired注解原理Autowired注解是Spring框架中用于自动装配bean属性的一个注解。
它的工作原理是基于Java的反射机制,在运行时扫描类路径下的所有bean,并根据Autowired注解自动为相应的属性赋值。
Autowired注解的使用非常简单,只需要在相应的属性上标注该注解即可。
Autowired注解的工作流程可以分为以下几个步骤:1.扫描类路径下的所有bean:Spring框架会在启动时扫描类路径下的所有类,并注册为bean。
2.匹配属性:Spring会根据Autowired注解的类路径匹配相应的属性,并尝试为其赋值。
3.自动装配:如果找到了匹配的bean,Spring会自动将其值注入到相应的属性中。
如果没有找到匹配的bean,则不会进行自动装配。
Autowired注解支持多种类型的自动装配,包括field、setter、constructor和class等。
其中,field类型的自动装配是最常用的一种方式,它可以直接为属性赋值。
Autowired注解还支持多个属性的自动装配,可以通过使用"&&"运算符来同时匹配多个属性。
三、Resource注解原理Resource注解是Spring框架中用于加载资源文件的注解。
它允许开发者通过标注在资源文件上,让Spring框架自动加载和加载这些资源文件。
Resource注解的使用也非常简单,只需要在相应的类或方法上标注该注解即可。
Resource注解的工作流程可以分为以下几个步骤:1.解析资源路径:Spring会解析Resource注解中指定的资源路径,确定要加载的资源文件的位置。
Java开发⼯程师最新⾯试题库系列——Spring部分(附答案)SpringSpring框架是什么?答:Spring是轻量级的⾯向切⾯和控制反转的框架。
初代版本为2002年发布的interface21,Spring框架是为了解决企业级应⽤开发的复杂性的出现的,它可以帮助开发⼈员管理对象之间的关系。
能实现模块与模块之间、类与类之间的解耦合,Spring是⼀个⼤杂烩,它集成其他许多框架,使其他框架能与spring结合搭配使⽤Spring常⽤的注解有哪些?答:1、@Controller在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把⽤户请求的数据经过业务bai处理层处理之后封装成⼀个Model ,然后再把该Model 返回给对应的View 进⾏展⽰。
在SpringMVC 中提供了⼀个⾮常简便的定义Controller 的⽅法,你⽆需继承特定的类或实现特定的接⼝,只需使⽤@Controller 标记⼀个类是Controller ,然后使⽤@RequestMapping 和@RequestParam 等⼀些注解⽤以定义URL 请求和Controller ⽅法之间的映射,这样的Controller 就能被外界访问到。
此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的⽅法参数灵活的获取到。
@Controller ⽤于标记在⼀个类上,使⽤它标记的类就是⼀个SpringMVC Controller 对象。
分发处理器将会扫描使⽤了该注解的类的⽅法,并检测该⽅法是否使⽤了@RequestMapping 注解。
@Controller 只是定义了⼀个控制器类,⽽使⽤@RequestMapping 注解的⽅法才是真正处理请求的处理器。
autowired参数
@Autowired是Spring框架中用于进行依赖注入的注解。
在使用@Autowired注解时,可以选择添加一些参数,以便更加精确地注入依赖。
1. @Autowired(required = true/false)
默认情况下,@Autowired注解的required属性为true,表示必须注入依赖。
如果找不到符合要求的依赖,就会抛出异常。
如果将required属性设为false,则表示如果找不到符合要求的依赖,就不进行注入。
2. @Autowired @Qualifier('beanName')
当存在多个符合要求的依赖时,可以使用@Qualifier注解指定要注入哪一个依赖。
@Qualifier注解的参数是依赖的bean名称。
3. @Autowired @Resource(name='beanName')
@Resouce注解也可以用来指定要注入的bean,和@Qualifier注解的效果是一样的。
@Resource注解的参数也是依赖的bean名称。
4. @Autowired @Value('${propertyName}')
@Value注解可以用来注入配置文件中的属性。
@Value注解的参数是属性名,例如${jdbc.driver}。
如果配置文件中存在该属性,就会将属性值注入到被@Value注解标注的字段或方法参数中。
总之,@Autowired注解提供的参数能够帮助我们更加精确地控制依赖注入的过程,提高程序的可靠性和可维护性。
- 1 -。
Spring 注解@Resource和@Autowired
@Resource和@Autowired两者都是做bean的注入使用。
其实@Resource并不是Spring的注解,他的包是javax.annotation.Resource 需要导入。
但是Spring支持该注解的注入。
共同点:两者都可以写在字段和setter方法上。
两者如果都写在字段上,就不需要写写setter方法。
不同点如下:
先来说一说@Autowired
@Autowired为Spring提供的注解,
需导入Package:org.springframework.beans.factory.annotation.Autowired;
只按照byType 注入。
@Autowired
private UserDao userDao;//用于字段上
@Autowired
public void setUserDao(UserDao userDao) {//用于属性的setter方法上
erDao= userDao;
}
@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。
如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。
如下:
@Autowired @Qualifier("userDao")
private PersonDao personDao;
再说说@Resource
@Resource默认按byName 自动注入,由J2EE提供。
需导入Package: javax.annotation.Resource
@Resource有两个中重要的属性:name和type ,而Spring将@Resource 注解的name属性解析为bean的
名字,而type属性则解析为bean的类型。
所以如果使用name属性,则使用byName的自动注入策略,而使用
type属性时则使用byType自动注入策略。
如果既不指定name也不指定type 属性,这时将通过反射机制使用byName自动注入策略。
@Resource(name=“userDao”)
private UserDao userDao;//用于字段上
@Resource(name=“userDao”)
public void setUserDao(UserDao userDao) {//用于属性的setter方法上
erDao= userDao;
}
注:最好是将@Resource放在setter方法上。
@Resource装配顺序
(1). 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean 进行装配,找不到则抛出异常;
(2). 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常;
(3). 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常;
(4). 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入。