游戏网站开发推广计划书,网站下方链接图标怎么做,广州seo网站管理,做网站在哪里找素材#x1f3c6;作者简介#xff0c;普修罗双战士#xff0c;一直追求不断学习和成长#xff0c;在技术的道路上持续探索和实践。 #x1f3c6;多年互联网行业从业经验#xff0c;历任核心研发工程师#xff0c;项目技术负责人。 #x1f389;欢迎 #x1f44d;点赞✍评论… 作者简介普修罗双战士一直追求不断学习和成长在技术的道路上持续探索和实践。 多年互联网行业从业经验历任核心研发工程师项目技术负责人。 欢迎 点赞✍评论⭐收藏 Java注解知识专栏学习
Java注解知识云集访问地址备注Java注解知识点(1)https://blog.csdn.net/m0_50308467/article/details/135240536Java注解专栏Java注解知识点(2)https://blog.csdn.net/m0_50308467/article/details/135263693Java注解专栏Java注解知识点(3)https://blog.csdn.net/m0_50308467/article/details/135278911Java注解专栏Java注解知识点(4)https://blog.csdn.net/m0_50308467/article/details/135302054Java注解专栏 文章目录 学习Java注解之Autowired 和 Resource 区别 Java 注解Autowired 和 Resource 区别学习(4) 01、Autowired 和 Resource 区别 1.1 所属框架不同(Spring 与 Java EE) 1.2 来源不同 1.3 匹配方式1.3.1 匹配方式1.3.2 特定 Bean1.3.3 运行机制 1.4 支持泛型依赖注入 1.5 依赖注入优先级 1.6 可选性 1.7 注入方式 1.8 配置和使用环境1.8.1 引入方式1.8.2 使用环境1.8.3 兼容性 1.9 查找顺序不同1.9.1 Autowired 的依赖查找顺序方式1.9.2 Resource 的依赖查找顺序方式 1.10 依赖注入的支持不同 1.11 支持的参数不同 学习Java注解之Autowired 和 Resource 区别 Java 注解Autowired 和 Resource 区别学习(4) 01、Autowired 和 Resource 区别
下面是 Autowired 和 Resource 之间的区别的表格说明
区别AutowiredResource所属框架SpringJava EE来源Spring 框架提供的注解Java EE 规范提供的注解匹配方式根据类型进行匹配在类型无法匹配时根据名称进行匹配根据名称进行匹配在名称无法匹配时根据类型进行匹配支持泛型依赖注入是否依赖注入优先级通过类型匹配 通过名称匹配通过名称匹配 通过类型匹配可选性必须使用 Autowired(required false) 显式设置为非必须可选的默认为必须注入方式可以用于字段、构造函数、设置方法和方法参数只能用于字段和设置方法配置和使用的环境任何 Spring 环境依赖 Java EE 容器的支持依赖的查找顺序不同先根据类型byType查找如果存在多个 Bean 再根据名称byName进行查找先根据名称查找如果根据名称查找不到再根据类型进行查找依赖注入的支持不同支持属性注入、构造方法注入和 Setter 注入只支持属性注入和 Setter 注入支持的参数不同只支持设置一个 required 的参数支持 7 个参数
需要注意的是虽然 Autowired 和 Resource 都可以用于依赖注入但它们来自于不同的框架和规范。Autowired 是 Spring 框架提供的注解用于实现依赖注入。而 Resource 是 Java EE 规范提供的注解用于实现依赖注入和名称解析。
总的来说Autowired 和 Resource 在依赖注入的匹配方式、优先级、可选性和使用环境上存在一些细微的差异。具体选择使用哪个注解取决于具体的需求和所运行的环境。一般来说在 Spring 环境中推荐使用 Autowired 注解。在 Java EE 环境中推荐使用 Resource 注解。 1.1 所属框架不同(Spring 与 Java EE)
Autowired 属于 Spring 框架提供的注解而 Resource 属于 Java EE 规范提供的注解。Spring 框架是一个轻量级的应用程序框架主要用于构建企业应用中的组件包括数据访问、事务处理、Web 应用程序控制等方面。Spring 提供了很多依赖注入的功能Autowired 就是其中的一种方式。而 Java EE 是一个大型的企业应用平台规范它包括了很多组件规范和 API例如 EJB、Servlet、JAX-RS 等等Resource 就是 Java EE 规范中的一种依赖注入方式。 1.2 来源不同
Autowired 是 Spring 框架提供的注解只能在 Spring 框架中使用。而 Resource 是 Java EE 规范提供的注解可以在任何支持 Java EE 规范的容器中使用包括了很多应用程序服务器例如 Tomcat、GlassFish、WebLogic 等等。 1.3 匹配方式
Autowired 和 Resource 的匹配方式也存在不同之处具体如下
1.3.1 匹配方式
Autowired 注解是按照类型进行匹配的当存在多个实现了指定类型的 Bean 时会抛出异常需要使用 Qualifier 注解指定查找 Bean 的名称。
Resource 注解是优先按照名称进行匹配的会先按照名称查找对应的 Bean如果找到了就直接注入否则再按照类型进行查找。如果两种方式都无法匹配则会抛出异常。如果要按照类型进行匹配则可以使用 name 属性将其设置为空字符串即可。
1.3.2 特定 Bean
Autowired 注解可以指定一个特定的 Bean即使用 Qualifier 注解指定 Bean 的名称这样 Spring 容器在注入时会按照指定的 Bean 名称进行查找和注入。这个 Bean 名称通常是指标记了某一个注解的 Bean例如 Service、Repository 等。
Resource 注解也能指定特定的 Bean但是简单地指定 Bean 的名称是不够的。必须要使用 name 属性指定该 Bean 的名称以及所在的 Bean 工厂名称在查找时就会按照指定的名称和 Bean 工厂进行查找。这意味着使用 Resource 注解来指定一个特定的 Bean 更加繁琐适用范围也比较有限。
1.3.3 运行机制
Autowired 注解的运行机制是在 Spring 容器启动时自动完成依赖注入即在执行其他 Bean 的初始化方法前就已经完成了属性的注入。这种方式被称为预处理。
Resource 注解的运行机制是在容器初始化完成后无序执行即先执行 Bean 的构造方法然后再进行依赖注入。这种方式被称为后置处理。因此在 Bean 的构造方法中如果依赖了其他 Bean使用 Resource 可能会导致 NPE空指针异常。
综上所述Autowired 和 Resource 的匹配方式也存在一些细微差异包括按照类型或名称进行匹配、指定特定的 Bean 和运行机制等方面。需要根据具体场景合理使用。 1.4 支持泛型依赖注入
Autowired 支持泛型依赖注入可以通过字段、构造函数、setter 方法或者方法参数上的泛型信息进行类型匹配。而 Resource 不支持泛型依赖注入只能通过字段、setter 方法的名称或者类型进行匹配。 1.5 依赖注入优先级
Autowired 通过类型匹配的优先级高于通过名称匹配即如果在容器中找到了多个与被注入类型匹配的 bean则会抛出异常。而 Resource 通过名称匹配的优先级高于通过类型匹配即如果找到了多个与被注入名称匹配的 bean则会选择与被注入类型最为匹配的 bean 进行注入。 1.6 可选性
Autowired 默认情况下是必须的依赖注入如果找不到匹配的 bean则会抛出异常。如果注入的依赖是可选的则可以使用 Autowired(requiredfalse) 显式设置为非必须。而 Resource 是可选的依赖注入如果找不到匹配的 bean则不会抛出异常而是将依赖注入为 null。 1.7 注入方式
Autowired 和 Resource 的注入方式也存在一些不同之处具体如下所述
Autowired 注解可以通过字段、构造函数、setter 方法和方法参数进行注入提供了较为灵活的依赖注入方式。
字段注入可以直接在字段上添加 Autowired 注解Spring 会自动将符合类型的 Bean 注入到该字段上。构造函数注入可以在构造函数上添加 Autowired 注解Spring 在创建 Bean 实例时会将相应的依赖注入到这个构造函数中。Setter 方法注入可以在 Setter 方法上添加 Autowired 注解Spring 会在创建 Bean 实例后调用该 Setter 方法并注入相应的依赖。方法参数注入可以在方法参数上添加 Autowired 注解Spring 会在执行该方法时将符合类型的 Bean 注入到这些方法参数中。
Resource 注解的注入方式相对简单只能通过字段或 setter 方法进行注入不能用于构造函数和方法参数。
字段注入可以直接在字段上添加 Resource 注解指定要注入的 Bean 的名称或类型Spring 会自动进行匹配并注入相应的 Bean。Setter 方法注入可以在 Setter 方法上添加 Resource 注解指定要注入的 Bean 的名称或类型Spring 会在调用该 Setter 方法时注入相应的 Bean。
综上所述Autowired 相比于 Resource 提供了更多的注入方式可以更加灵活地进行依赖注入。而 Resource 注解则相对简单主要用于字段和 setter 方法的注入。因此在选择注入方式时可以根据具体需求和场景选择合适的注解。 1.8 配置和使用环境
Autowired 和 Resource 之间还有一些配置和使用环境的不同之处在以下方面存在差异
1.8.1 引入方式
Autowired 注解是 Spring 中的一个注解需要导入 spring-context 依赖以便在项目中使用。可以在 pom.xml 文件中添加如下依赖
dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.3.13/version
/dependencyResource 注解是 JSR-250 规范中的一个注解因此不需要在项目中导入其他依赖。
1.8.2 使用环境
Autowired 注解适用于基于 Spring 框架的应用程序。在 Spring 中使用注解方式注入 Bean 是一种较为常见的方式因此 Autowired 注解应用得较为广泛。
Resource 注解适用于 JDK 自带的依赖注入Dependency InjectionDI框架不仅可以在 Spring 中使用也可以在其他框架中使用比如 EJBEnterprise JavaBeans、JavaServer FacesJSF等。因此Resource 注解的应用范围更广。
1.8.3 兼容性
Autowired 注解不兼容 J2EEJava 2 Platform Enterprise Edition规范因为 J2EE 规范要求依赖注入的方式必须是 XML 配置或者通过 JNDIJava Naming and Directory Interface查找获取对象。而 Autowired 注解是基于 Java 注解的方式实现的因此在使用 J2EE 规范时会产生冲突。
Resource 注解符合 J2EE 规范因此在 J2EE 应用程序中可以完美使用。
综上所述Autowired 注解和 Resource 注解在配置和使用环境方面也存在一些不同之处。需要根据实际情况选择合适的注解和使用环境。 1.9 查找顺序不同
Autowired 和 Resource 注解在进行依赖注入时依赖查找的顺序方式也存在一些不同之处。具体如下所述
1.9.1 Autowired 的依赖查找顺序方式
在使用 Autowired 注解进行依赖注入时Spring 容器会按照以下的顺序方式进行查找
首先它会根据被注入的字段、构造函数、setter 方法或方法参数的类型进行匹配查找相应的 Bean。如果找到多个符合的 BeanSpring 会根据被注入元素的名称字段名、参数名进行进一步的匹配。如果仍然无法确定注入哪个 BeanSpring 将抛出异常表示无法找到符合的 Bean。
例如以下代码展示了使用 Autowired 注解进行字段注入的示例
Component
public class MyComponent {Autowiredprivate MyDependency myDependency;...
}Spring 容器会根据 MyDependency 的类型查找所有符合类型的 Bean并将其中的一个注入到 MyComponent 中。
它的具体查找流程如下 关于以上流程可以通过查看 Spring 源码中的 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues 实现分析得出它的源码执行流程如下图所示
1.9.2 Resource 的依赖查找顺序方式
与 Autowired 注解不同Resource 注解在进行依赖查找时它的顺序方式如下
首先它会根据 name 属性指定的 Bean 名称进行查找如果存在名称匹配的 Bean则注入该 Bean。如果 name 属性未指定或者指定的 Bean 名称没有匹配的 Bean则会根据被注入的字段、setter 方法的类型进行匹配查找 Bean。如果找到多个符合的 BeanSpring 会根据被注入元素的名称字段名、参数名进行进一步的匹配。如果仍然无法确定注入哪个 BeanSpring 将抛出异常表示无法找到符合的 Bean。
以下示例展示了使用 Resource 注解进行字段注入的示例
Component
public class MyComponent {Resource(name myDependencyBean)private MyDependency myDependency;...
}在查找 Bean 时首先根据 name 属性值 myDependencyBean 来查找对应的 Bean。如果找到的话该 Bean 将会被注入到 MyComponent 中。
它的具体查找流程如下 关于以上流程可以在 Spring 源码的 org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#postProcessPropertyValues 中分析得出。虽然 Resource 是 JSR-250 定义的但是由 Spring 提供了具体实现它的源码实现如下
综上所述Autowired 和 Resource 注解在依赖查找顺序方式上存在一些差异。需要根据实际情况选择合适的注解和依赖查找顺序方式。 1.10 依赖注入的支持不同
Autowired 和 Resource 支持依赖注入的用法不同常见依赖注入有以下 3 种实现
属性注入构造方法注入Setter 注入
Autowired 注解在 Spring 中有三种不同的方式来进行依赖注入
1属性(字段)注入
在字段上直接使用 Autowired 注解将依赖注入到字段中。例如
Component
public class MyClass {Autowiredprivate MyDependency myDependency;...
}在上述代码中MyDependency 类的实例将自动注入到 MyClass 类的 myDependency 字段中。
2构造函数注入
在构造函数中使用 Autowired 注解将依赖注入到构造函数的参数中。例如
Component
public class MyClass {private MyDependency myDependency;Autowiredpublic MyClass(MyDependency myDependency) {this.myDependency myDependency;}...
}在上述代码中通过构造函数注入的方式将 MyDependency 类的实例注入到 MyClass 类的构造函数参数 myDependency 中。
3Setter(方法)注入
在方法上使用 Autowired 注解将依赖注入到方法的参数中。例如
Component
public class MyClass {private MyDependency myDependency;Autowiredpublic void setMyDependency(MyDependency myDependency) {this.myDependency myDependency;}...
}在上述代码中通过方法注入的方式将 MyDependency 类的实例注入到 MyClass 类的 setMyDependency 方法的参数中。
需要注意的是在进行方法注入时方法名可以是任意的不一定非要是 setXxx 的命名方式。Spring 会根据方法的参数类型查找对应的 Bean并进行注入。
综上所述Autowired 注解有三种不同的方式进行依赖注入可以根据实际情况选择使用哪种方式来满足依赖注入的需求。
其中 Autowired 支持属性注入、构造方法注入和 Setter 注入而 Resource 只支持属性注入和 Setter 注入
当使用 Resource 实现构造方法注入时就会提示以下错误 1.11 支持的参数不同
Autowired 和 Resource 在使用时都可以设置参数。
当使用 Resource 注解时可以通过设置 name 和 type 参数来指定要注入的 Bean。下面是对 name 和 type 参数的举例说明 使用 name 参数指定 Bean 名称 Component
public class MyClass {Resource(name myBean)private MyBean myBean;// ...
}在上述代码中Resource(name myBean) 指定了要注入名为 “myBean” 的 Bean。 使用 type 参数指定 Bean 类型 Component
public class MyClass {Resource(type MyBean.class)private MyBean myBean;// ...
}在上述代码中Resource(type MyBean.class) 指定了要注入类型为 MyBean 的 Bean。
如果只指定了 name 参数那么会根据指定的 Bean 名称来查找并注入对应的 Bean。如果只指定了 type 参数那么会根据指定的 Bean 类型来查找并注入对应的 Bean。若指定了 name 和 type 两个参数则会根据两者共同进行匹配。
需要注意的是name 和 type 参数在使用时只能选择其中一个不能同时使用。而且如果通过 name 或 type 参数无法找到对应的 Bean将会抛出异常。
当使用 Resource 注解时可以通过设置 name 和 type 参数来指定要注入的 Bean。以下是更多关于 name 和 type 参数的举例说明 使用 name 和 type 参数一起指定 Bean 名称和类型 Component
public class MyClass {Resource(name myBean, type MyBean.class)private MyBean myBean;// ...
}在上述代码中Resource(name myBean, type MyBean.class) 同时指定了要注入名为 “myBean” 并且类型为 MyBean 的 Bean。 使用 name 参数指定多个候选 Bean Component
public class MyClass {Resource(name {bean1, bean2})private MyBean myBean;// ...
}在上述代码中Resource(name {bean1, bean2}) 指定了要注入多个可能的 Bean其中名称为 “bean1” 或 “bean2” 的 Bean 将会被注入。 使用 type 参数指定多个候选 Bean Component
public class MyClass {Resource(type {MyBean.class, AnotherBean.class})private MyBean myBean;// ...
}在上述代码中Resource(type {MyBean.class, AnotherBean.class}) 指定了要注入多个可能的 Bean其中类型为 MyBean 或 AnotherBean 的 Bean 将会被注入。
请注意以上示例仅用于说明 Resource 注解中的 name 和 type 参数的用法实际使用时需要根据具体情况进行设置。
但二者支持的参数以及参数的个数完全不同其中 Autowired 只支持设置一个 required 的参数而 Resource 支持 7 个参数支持的参数如下图所示