SpringBoot 注解 @Autowired

作用

实现依赖注入
查找方式:@Autowired是先到容器查找类型,如果该类型只有一个那么就直接注入,有多个时再根据名字找
使用范围:构造器、方法、参数、字段、注解
参数:required -> 标注的对象是否必须注入,可能这个对象在容器中不存在,如果为true的时候,找不到匹配的候选者就会报错,为false的时候,找不到也没关系,不会报错

定义

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
public @interface Autowired { 
  /*** Declares whether the annotated dependency is required. 
  * <p>Defaults to {@code true}. 
  */ 
  boolean required() default true; 
}

使用

1、用于构造方法

将@Autowired注解应用于构造函数,通过构造器注入依赖对象

public class Service {
    private Service1 service1;
    
    public Service(){
        System.out.println(this.getClass() + "无参构造器");
    }

    @Autowired
    public Service(Service1 service1){
    		System.out.println(this.getClass() +"有参构造器");
        this.service1 = service1;
    }
}

2、用于普通方法

将@Autowired标注在方法,spring从容器中查找方法参数相关的bean,然后注入依赖的对象,如果该方法有多个参数,默认多个参数都可以自动注入依赖

@Component
public class Service {

    private Service1 service1;
  
  	private Service2 service2;

    @Autowired
    public void injectService1(Service1 service1){
        this.service1 = service1;
    }
  
  	@Autowired
    public void injectService1(Service1 service1, Service2 service2){
        this.service1 = service1;
        this.service2 = service2;
    }
}

3、用于setter方法

可能通过构造器,和通过普通的一个方法注入,这两种方式不是很常见,可以将@Autowired标注在set方法上面来注入指定的对象,如下所示

@Component
public class Service {

    private Service1 service1;

    @Autowired
    public void setService1(Service1 service1){
        this.service1 = service1;
    }
}

4、用于方法参数上

@Autowired直接标注于方法的具体参数上,在多个参数的时候,方法上面的@Autowired默认对方法中所有的参数起效,如果我们想对其中某个参数进行特定的配置,则有以下两种方法实现:

1、可以在需依赖注入的参数前面加上@Autowired,就能实现自动依赖注入。

@Component
public class Service {

    private Service1 service1;
    private String name;
  
    public void injectService(@Autowired Service1 service1, String name){
        this.service1 = service1;
        this.name = name;
    }
}

此时方法的第一个参数则受到@Autowired约束,而第二个参数则不受约束

2、在不需要强制注入的参数前面加@Autowired,并设置required为false,这样则表示这个bean不是强制注入,能找到相应的bean就注入,找不到的话就注入一个null对象,如下 :

@Component
public class Service {

    private Service1 service1;

    private String name;

    @Autowired
    public void injectService(Service1 service1, @Autowired(required = false) String name){
        this.service1 = service1;
        this.name = name;
    }
}

此时方法的第一参数被上面的@Autowired约束,第二个参数受@Autowired(required=false)约束

5、用于字段上

@Autowired直接标注于具体的字段,则会自动进行依赖注入,Spring会去容器中按照类型查找相关类型的bean,然后将设置到相应的属性。

@Component
public class Service {

    @Autowired
    private Service1 service1;
}

6、用于Collection、Map中

1、注入到Collection中,被注入的类型为Collection类型或者Collection子接口类型,注意必须是接口类型

Collection<IService> 
List<IService> 
Set<IService>

2、注入到Map中,被注入的类型为Map类型或者Map子接口类型,注意必须是接口类型

Map<String,IService>

示例如下:
下面分别先定义一个接口,两个接口的实现类

public interface IService {
}
@Component 
public class Service1 implements IService { 
}
@Component 
public class Service2 implements IService { 
}
@Component 
public class Service { 

	@Autowired 
  private List<IService> services;  //@1
  
  @Autowired 
  private Map<String, IService> serviceMap;  //@2
  
}

原创文章,作者:jiafegn,如若转载,请注明出处:https://www.techlearn.cn/archives/254

Previous 2022年9月2日
Next 2022年9月14日

相关推荐

  • SpringBoot 过滤器

    简介 SpringBoot过滤器在web开发中可以过滤指定的URL,比如拦截掉不需要的接口请求,同时也可以对request和response的内容进行修改。 使用场景 Spring…

    springboot 2023年4月30日
    241
  • springboot 注解 @ComponentScan

    作用 @ComponentScan用于批量注册bean,这个注解会让spring去扫描某些包及其子包中所有的类,然后将满足一定条件的类作为bean 注册到spring容器中。主要使…

    springboot 2022年11月8日
    219
  • Springboot 注解 @Resource

    作用 和@Autowired注解类似,也是用来注入依赖对象的,spring容器会对bean中所有的字段、方法进行遍历,标注有@Resouce注解的,都会进行注入。@Autowire…

    springboot 2022年9月14日
    270
  • SpringBoot CRUD基础开发 入门

    需求简介 环境准备 1、新建项目 新建一个crud的项目,如下: 2、新建数据库脚本 新建curd数据库 初始化数据库 引入依赖 1、引入web依赖 2、引入Lombok依赖 3、…

    2023年3月26日
    178
  • Springboot 注解 @DependsOn

    作用 @DependsOn用来指定当前bean依赖的bean,spring在创建bean的时候,如果bean之间没有依赖关系,那么spring容器很难保证bean实例创建的顺 序,…

    springboot 2022年9月1日
    368
  • SpringBoot 缓存

    简介 缓存主要是为了提高数据的读取速度。 因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大…

    springboot 2023年4月23日
    133
  • SpringBoot 整合 Lombok

    简介 Lombok其实和Spring Boot关系不太大,只是这个工具太好用了,这里也整理记录一下。 Lombok是一个Java库可以与Java IDE(ItelliJ IDEA、…

    2024年8月28日
    261
  • SpringBoot 定时器

    spring提供了@Scheduled和@EnableScheduling两个注解用来快速开发定时器,使用很简单 用法: 1、Springboot的启动类中加上@EnableSch…

    springboot 2023年4月23日
    136
  • SpringBoot 缓存 – Redis

    引入依赖 缓存配置 启用缓存 修改项目启动类,增加注解@EnableCaching,开启缓存功能,如下: 配置缓存类 新建Redis缓存配置类RedisConfig,如下: 添加缓…

    2023年4月23日
    161
  • SpringBoot 整合Mybatis

    简介 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBat…

    2024年8月28日
    309