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 属性