Python 官方文档:入门教程 => 点击学习
目录引言1、用法层面分析2、概念层面分析3、源码层面分析引言 @Resource和@Autowired都是spring Framework中用于依赖注入的注解,但它们有几点不同: 来
@Resource和@Autowired都是spring Framework中用于依赖注入的注解,但它们有几点不同:
来源不同:@Resource注解来自于J2EE规范中;而@Autowired注解是Spring框架提供的。
搜索策略不同:@Resource注解默认按照名称进行匹配查找,如果找不到,则按照类型进行匹配。而@Autowired注解默认是按照类型进行匹配,如果出现多个类型一致的实例对象,则需要指定名称。
属性不同:@Resource注解没有属性名称,只有一个name属性,表示要注入的Bean名称。而@Autowired注解有两个重要属性:required和name,其中required属性表示是否必须注入该属性,默认为true;name属性表示要注入的Bean名称。
首先,我们创建一个接口UserService
和两个实现类UserServiceImpl1
和UserServiceImpl2
。
public interface UserService {
void save();
}
@Service
public class UserServiceImpl1 implements UserService {
@Override
public void save() {
System.out.println("UserServiceImpl1 save");
}
}
@Service
public class UserServiceImpl2 implements UserService {
@Override
public void save() {
System.out.println("UserServiceImpl2 save");
}
}
然后,我们可以在需要使用UserService
的地方进行依赖注入。
使用@Resource注解:
@Component
public class UserController {
@Resource
private UserService userService;
// ...
}
使用@Autowired注解:
@Component
public class UserController {
@Autowired(required = false)
@Qualifier("userServiceImpl1")
private UserService userService;
// ...
}
上面的代码中,@Resource
注解直接将UserService
对象注入到userService
属性中,而@Autowired
注解需要结合@Qualifier
注解来指定具体的Bean名称,并且通过required
属性设置是否必须注入该属性。注意,@Autowired
注解也可以省略@Qualifier
注解,此时会按照类型进行匹配查找对应的Bean。
再来分析一下其中的道道~~
Spring Framework中的依赖注入实现原理是基于Java反射机制和JavaBean规范的。
Spring框架通过反射机制实例化需要注入的Bean对象,并将其存储到一个Map中,其中Key为Bean名称,Value为Bean实例对象。
接下来,Spring会根据JavaBean规范(即属性名以及该属性的setter方法)查找需要注入的属性,并通过反射机制调用对应的setter方法进行属性注入。
在依赖注入的过程中,Spring框架通常采用两种搜索策略:
Spring框架提供了多种注解用于依赖注入,包括:
Spring Framework的依赖注入实现原理是基于Java反射机制和JavaBean规范的,并通过多种注解实现不同的依赖注入方式。
@Resource和@Autowired都是Spring的依赖注入注解,但它们有如下区别:
来源不同:@Resource是Java EE规范定义的注解,而@Autowired是Spring提供的注解。
属性不同:@Resource注解没有required属性,只有name属性,表示要注入的Bean名称;而@Autowired注解有required和name属性,其中required表示是否必须注入该属性,默认为true;name表示要注入的Bean名称。
查找方式不同:@Resource注解默认是根据byName的方式进行查找,如果找不到则按照byType进行查找;而@Autowired默认是根据byType方式进行查找。
兼容性不同:@Resource注解可以与JSR-330的@Inject注解搭配使用;而@Autowired注解只能与Spring组件一起使用。
应用场景不同:@Resource注解主要应用于Java EE环境,而@Autowired注解则是在Spring框架中使用最广泛的依赖注入注解之一,可以适用于不同的应用场景。
下面分别介绍@Resource和@Autowired注解的优缺点:
@Resource优点:
简单易用,在类中使用非常方便。
可以和@Inject注解一起使用。
支持指定Bean名称,可以更精确地进行依赖注入。
@Resource缺点:
Spring框架对@Resource注解的支持不如@Autowired丰富。
仅支持byName和byType两种注入方式,比@Autowired的支持更为有限。
@Autowired优点:
支持复杂的依赖注入配置,可以通过多种方式进行依赖注入。
Spring框架对@Autowired注解的支持非常丰富,是Spring中使用最广泛的注解之一。
可以指定是否必须注入该属性,也可以指定Bean名称进行注入。
除了在类中使用之外,还可以在构造方法、Setter方法及任何标记了@Bean的方法中使用@Autowired注解。
@Autowired缺点:
配置较为繁琐,需要指定required和name属性等。
需要遵循Spring的自动扫描机制,只有标记了@Component、@Service、@Controller和@Repository等注解的类才会被Spring容器进行管理。
对于依赖注入的原理,可以简单地概括为以下三个步骤:
在应用程序启动时,Spring容器负责创建和管理所有的Bean实例对象。
在需要使用某个Bean的时候,Spring容器会通过反射机制将该Bean注入到需要使用的类或对象中。
在Bean注入的过程中,Spring容器会根据不同的注解(如@Resource、@Autowired)采用不同的依赖注入方式,完成依赖注入的过程。
@Resouce和@Autowired都是Spring提供的依赖注入注解,各有优缺点。在实际开发中,可以根据具体的应用场景选择合适的注解进行使用。
在Spring Framework源码层面,@Resource和@Autowired注解的实现类分别为javax.annotation.Resource和org.springframework.beans.factory.annotation.Autowired。下面我们来看一下它们的具体实现。
@Resource注解的实现原理:
代码示例:
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Resource {
String name() default "";
Class<?> type() default java.lang.Object.class;
boolean shareable() default true;
}
@Autowired注解的实现原理:
代码示例:
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
String value() default "";
}
无论是@Resource注解还是@Autowired注解,在Spring Framework源码实现上都是通过反射机制和BeanPostProcessor接口完成依赖注入的。在实际开发中,我们可以研究对应的源码实现,深入了解它们的原理,从而更好地使用这些依赖注入注解。
以上就是深入分析@Resource和@Autowired注解区别的详细内容,更多关于@Resource @Autowired注解区别的资料请关注编程网其它相关文章!
--结束END--
本文标题: 深入分析@Resource和@Autowired注解区别
本文链接: https://lsjlt.com/news/210127.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0