Bean注入两种方式@Resource和@Autowired

问题

比如说像用Spring Boot,涉及到ioc,依赖反转,就注入的这一块。一般在写代码的时候,怎么样去做Bean注入的。
比如说我用Spring框架,我做Bean注入,你在代码里,就是本身框架有哪些可以实现一个Bean注入。
@Resource是Spring提供的么,还是Java自带的,JDK自带的
就是比如说像他用@Resource注解,你用@Resource这个注解,一般是基于什么规则去定义一个Bean来做注入的。
就是他怎么认为这个Bean是匹配的,就是要注入进来的,就他怎么去找打它的容器里吗对应是哪个Bean,基于什么样的规则去找。

回答

1 怎么去做Bean注入(本身框架+JDK的)

https://blog.csdn.net/cafeshadow/article/details/104510837
Spring

注解的方式注入Bean

IoC又叫依赖注入(DI)。它描述了对象的定义和依赖的一个过程。依赖的对象通过构造参数、工厂方法参数或者属性注入,当对象实例化后依赖的对象才被创建,当创建bean后容器注入这些依赖对象。这个过程基本上是反向的。

1. 在Spring中,一个类我们为它加上注解就可以被识别为一个Bean。

@Component:将该类声明为 Spring 的组件,使其能够被 Spring 容器管理和自动扫描。

例如你在一个类上加上一个@Component注解,它在配置类的@ComponentScan注解扫描的包下,或者把这给个类在配置类中加上@Bean注解,那么它就被识别为Bean,加入到Spring容器里。

@Component
public class FirstBean {

}

或者直接把这个类在Spring配置类里实例化然后使用@Bean注解。

@Configuration
@ComponentScan("com.imooc.spring.demo")
public class SpringBeanConfiguration {

    @Bean
    public FirstBean firstBean() {
        return new FirstBean();
    }
}

2. 在一个Bean中调用另外一个Bean,就需要依赖注入。

@Component
public class SecondBean {
    private FirstBean firstBean;

    @Autowired
    public SecondBean(FirstBean firstBean) {
        this.firstBean = firstBean;
    }
    
    @Override
    public String toString() {
        return "SecondBean{firstBean=" + firstBean + '}';
    }
}

一个Bean要调用另一个Bean,直接调用是允许的,需要通过自动装配注解@Autowired进行依赖注入才能达成目的。

常用注解

注解 解释
@Configuration 标记的类是配置类
@ComponentScan(“包”) 指定哪个包,就扫描哪个包下的注解并识别。
@Autowired Bean的自动装配,可以标注在类的属性、方法及构造函数上。
@Component 把普通类标记为Bean,加入到容器里,并且是单例模式。
@Bean 定义一个Bean对象,加入到Spring容器里
@Order(数字) 容器加载Bean的优先级,数字越小优先级越高

2 @Autowired 和 @Resource 注解的区别?

@Autowired 是 Spring 提供的注解,按类型(byType)注入。
@Resource 是 Java EE 提供的注解,按名称(byName)注入。

因为 @Resource 属于 Java EE 标准的注解,如果使用其他 IOC 容器而不是 Spring 也是可以兼容的。

@Resource这个注解,一般是基于什么规则去定义一个Bean来做注入的。

Spring 提供了 4 种自动装配类型:
https://javabetter.cn/sidebar/sanfene/spring.html#_12-spring-有哪些自动装配的方式
byName:根据名称进行自动匹配,假设 Boss 有一个名为 car 的属性,如果容器中刚好有一个名为 car 的 bean,Spring 就会自动将其装配给 Boss 的 car 属性

posted @ 2025-04-20 15:19  kuki'  阅读(23)  评论(0)    收藏  举报