原来 @Autowired 注解还可以这么玩!你不试试?

Java技术迷

共 3623字,需浏览 8分钟

 ·

2021-05-02 14:26

来源 | 小黑十一点半(ID:US_stocks

Hello,大家好,我是楼下小黑哥~

Spring 是我们平常开发中离不开的核心框架,每天开发都在使用 Spring 的功能。

还记得刚开始学习  Spring 的时候,那个时候 Spring 的版本还很低,大概是 Spring 3.X 的版本。那个时候 Spring 编程一切都离不开 XML 文件,所有 Bean 需要在 XML 中定义,也需要通过 XML 方式的注入到起到 Bean 中。

后来,Spring 注解的方式开始火了,我们可以直接使用 @Component 等生成 Bean ,也可以直接通过 @Autowired注解的方式注入 Bean。

最近翻看 Spring 的文档,才发现原来 @Autowired 注解使用方式还有很多种,有些方式使用起来很有意思,巧加利用的话,可以非常节省我们的开发时间。

@Autowired 字段

我们可以把 @Autowired 注解标注在类文件中的字段属性上,通过这种方式,Spring 容器启动的时候会查找相应的 Bean ,然后通过反射的方式注入到这个字段中。

例子如下:

@Controller
public class PayController {
    @Autowired
    PayService aliPayService;
}

这种方式使用起来非常方便,而且对于字段的要求也比较低,它可以是 public,也可以是 private范围。

日常编程中,我一般是直接使用这种方式,简洁又便利。

@Autowired 构造方法

第二种方式,我们可以使用类中的构造函数注入相应属性,例子如下:

@Controller
public class PayController {
    
    PayService aliPayService;
    
    @Autowired
    public PayController(PayService aliPayService) {
        this.aliPayService = aliPayService;
    }
}

@Autowired 构造方法里的传参,可以是一个,也可以是多个。如果是多个参数,那 Spring 一起都注入进来。

@Controller
public class PayController {

    PayService aliPayService;
    
    OrderService orderService;
    
    @Autowired
    public PayController(PayService aliPayService, OrderService orderService) {
        this.aliPayService = aliPayService;
        this.orderService=orderService;
    }
}

这种方式在注入多个属性的时候用起来还是比较方便的。

那其实有一种情况下,如果一个类不存在无参的构造函数,只存在有参的构造函数,那实际上我们即使不用 @Autowired标注,Spring 也会帮我们注入相应的属性。

可以看到,上面的例子,我们没有在构造函数上使用 @Autowired标注,但是 IDEA 依然显示我们成功注入相应的属性。

@Autowired 方法

第三种方式,我们可以通过方法注入相应属性,例子如下:

@Controller
public class PayController {

    PayService aliPayService;
    
    @Autowired
    public void setAliPayService(PayService aliPayService) {
        this.aliPayService = aliPayService;
    }
}

那之前我一直以为这种方式只能使用  setxxx才可以成功的注入属性 ,那其实是我理解错了,这个方法可以任意的命名。

那方法注入,其实跟构造方法一样,也可以同时有多个传参,Spring 将会把这些属性一起注入。

@Autowired  多个 Bean

最后一种方式,Spring 可以使用 @Autowired 标注 Array (数组),Collections(集合),甚至是 Map (散列表),通过这种命方式注入多个相同类型的 Bean

比如这种方式,将 PayService 接口所有实现类注入到 Array数组中。

也可以是这种方式,注入到 List 集合中。

上面的两个例子,数组与集合中的 Bean 的顺序是根据 Spring 创建的顺序。

如果你想指定里面排序的优先级,那你就需要使用 @Order或者 @Priority 指定一下优先级,比如这样:

或者这样:

@Order/Priority  注解中值越小,那它的优先级就越高。

最后我们还可以将 PayService 接口所有实现类注入到 Map  中,其中里面的 key 就是Spring 的 Bean 的名字。

ps: 使用 @Autowired 注入属性到 Map 中,key 必须是 String 类型。

这也可以理解,你要是其他类型,Spring 都不知道去哪里给你找。。。

总结

@Autowired注解可以把相应 Bean 注入到相关属性中,它的注入方式有很多种。

我们可以使用 @Autowired直接标注类中的字段,快速使用。

我们也可以使用 @Autowired 标注构造方法/普通的方法,这样可以方便注入多个 Bean

最后,我们还可以 @Autowired标注 Array (数组),Collections(集合),甚至是 Map (散列表),将所有匹配到的 Bean 注入进来。

那最后一种方式,其实在某些场景非常有用。比如说,我们通过 @Autowired将所有匹配到 Bean 注入到 Map 中,利用这个特性,我们可以快速实现策略模式。

下篇文章我们就用这个特性实现一下,886~


1、Intellij IDEA这样 配置注释模板,让你瞬间高出一个逼格!
2、吊炸天的 Docker 图形化工具 Portainer,必须推荐给你!
3、最牛逼的 Java 日志框架,性能无敌,横扫所有对手!
4、把Redis当作队列来用,真的合适吗?
5、惊呆了,Spring Boot居然这么耗内存!你知道吗?
6、全网最全 Java 日志框架适配方案!还有谁不会?
7、Spring中毒太深,离开Spring我居然连最基本的接口都不会写了

点分享

点收藏

点点赞

点在看

浏览 32
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报