V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NoKey
V2EX  ›  程序员

Java 后台开发,大家用 @Autowired 多么

  •  
  •   NoKey · 2022-07-23 12:46:26 +08:00 · 6277 次点击
    这是一个创建于 861 天前的主题,其中的信息可能已经有所发展或是发生改变。

    到处文章都在说,不建议 @Autowired ,推荐构造器注入 但是我见识的项目,大部分都是 @Autowired 想请教一下大家,平时用哪种注入比较多

    第 1 条附言  ·  2022-07-23 14:46:02 +08:00
    表达有问题

    我的意思是 @Autowired 字段注入

    谢谢大家
    50 条回复    2022-07-25 11:25:43 +08:00
    bootvue
        1
    bootvue  
       2022-07-23 12:51:54 +08:00
    用构造方法注入吧 配合 lombok 写起来还省事
    beginor
        2
    beginor  
       2022-07-23 13:06:41 +08:00 via Android
    不推荐,建议使用构造函数注入
    actar
        3
    actar  
       2022-07-23 13:09:40 +08:00
    构造器注入配合 lombok 的 @RequiredArgsConstructor 注解,挺省事的
    chendy
        4
    chendy  
       2022-07-23 13:14:24 +08:00
    依赖全部 private final
    再来一个 lombok 的 RequiredArgsConstructor
    完事
    Akitora
        5
    Akitora  
       2022-07-23 13:16:53 +08:00 via Android
    构造注入+1
    zed1018
        6
    zed1018  
       2022-07-23 13:21:58 +08:00
    service/component 构造注入,bean function 形参注入,可写可不写。
    dcsuibian
        7
    dcsuibian  
       2022-07-23 13:23:06 +08:00   ❤️ 1
    一时没反应改来。 @Autowired 也可以用在构造器和独立的构造器参数上,不冲突。
    你说的应该是直接在字段上 @Autowired ,那个 IDEA 应该会有下划线的( test 的没有)。
    fpure
        8
    fpure  
       2022-07-23 13:44:50 +08:00   ❤️ 1
    我不管,我就要用 Autowired 注入
    EastLord
        9
    EastLord  
       2022-07-23 14:05:36 +08:00
    我用 private final ,组里其他同事用 @Autowired
    dqzcwxb
        10
    dqzcwxb  
       2022-07-23 14:06:39 +08:00
    @Resource 完美平替 @Autowired 而且还是 java 注解,为什么还有这么多用 @Autowired
    zjp
        11
    zjp  
       2022-07-23 14:09:10 +08:00
    公司项目,经常一个 service 二三十个依赖项,还有循环依赖,不用字段注入会疯的...
    Dragonphy
        12
    Dragonphy  
       2022-07-23 14:24:55 +08:00
    最近看到流行 @Resource 了,不过我还是倾向于构造器注入的
    NoKey
        13
    NoKey  
    OP
       2022-07-23 14:25:09 +08:00
    @dqzcwxb 应该是用 @Resource 还是用 @Autowired 都一样,反正 spring 用到死😂
    NoKey
        14
    NoKey  
    OP
       2022-07-23 14:26:18 +08:00
    @actar 我知道了,使用 lombok 的这个注解,解决了自己写构造器,参数太多的情况
    vate32
        15
    vate32  
       2022-07-23 14:38:22 +08:00
    表达的有问题吧,Autowired 就是用来注入的,但是可以用到字段、setter 方法、构造方法上,这些是有一些差别的
    vate32
        16
    vate32  
       2022-07-23 14:39:09 +08:00
    注入方式的问题,我之前就有提问过
    https://v2ex.com/t/713586#reply27
    wanguorui123
        17
    wanguorui123  
       2022-07-23 14:46:23 +08:00
    @Autowired 注入,@Scope("prototype") 创建实例
    SpringChang
        18
    SpringChang  
       2022-07-23 14:49:49 +08:00
    用 Spring 的话,@Autowired 很省事!
    fkdog
        19
    fkdog  
       2022-07-23 14:55:13 +08:00
    旧项目的话,因为存在大量循环引用依赖,private final 构造器注入(配合 lombok )会出现错误,因此还是用 @Autowired
    xaplux
        20
    xaplux  
       2022-07-23 15:19:38 +08:00
    不想看到警告提示,要么把 IDEA 警告关了,要么换成 @Resource ,用了多少年了都,花里胡哨的,不改就不改
    unregister
        21
    unregister  
       2022-07-23 15:24:38 +08:00
    不建议使用,@Autowired Spring 不推荐,但是呢大家都在用。构造器有利于进行单元测试。
    nosugar
        22
    nosugar  
       2022-07-23 15:29:50 +08:00 via iPhone
    项目中用的还是挺多的
    savingrun
        23
    savingrun  
       2022-07-23 15:49:26 +08:00
    建议使用构造函数注入 +1
    配合 lombok 的 @RequiredArgsConstructor

    例子:

    @Service
    @RequiredArgsConstructor
    public class xxxxServiceImpl implements xxxAppService, xxxAdminService {

    private final xxxxDao dao;

    }
    Bingchunmoli
        24
    Bingchunmoli  
       2022-07-23 16:50:24 +08:00 via Android
    普通用构造函数,循环依赖用 autowired , 没有谁更好只有谁更适合
    chrisia
        25
    chrisia  
       2022-07-23 17:09:45 +08:00
    @Autowired 能解决循环依赖,所以出现循环依赖我就用 @Autowired ,其他情况用构造注入
    fpure
        26
    fpure  
       2022-07-23 17:11:16 +08:00   ❤️ 5
    我不太理解,为什么有人愿意使用 Lombok 这种语法层侵入的库却排斥 Autowired
    kkkiio
        27
    kkkiio  
       2022-07-23 17:30:11 +08:00
    @fpure 因为 Lombok 很容易去掉(自己写 /生成一个构造函数就可以了),而 Autowired 依赖 Spring IoC 才能实现正确:你可以简单 new 一个 component ,不给 /忘记给它设置标志了 @Autowired 的属性,编译能过但运行错误。

    用构造函数取代 Autowired 核心就是用语言标准取代第三方标准,用编译错误取代运行时错误。
    kkkiio
        28
    kkkiio  
       2022-07-23 17:32:40 +08:00
    @kkkiio 用 Autowired 会遇到麻烦的最常见情景是单元测试,你要么暴露 Autowired 字段的 setter ,要么改成构造函数去初始化该字段
    mind3x
        29
    mind3x  
       2022-07-23 18:41:36 +08:00   ❤️ 2
    看样子很多人不知道,单构造函数的类甚至不需要标注任何 `@Autowired`, Spring 默认就会从构造函数注入。
    kaneg
        30
    kaneg  
       2022-07-23 19:27:19 +08:00 via iPhone
    的确知道应该使用构造方法而不是 Autowired ,但它就是顺手啊
    ychost
        31
    ychost  
       2022-07-23 20:37:59 +08:00
    很多时候需要 require = false 方便点
    Oktfolio
        32
    Oktfolio  
       2022-07-23 20:50:43 +08:00
    我不用
    Oktfolio
        33
    Oktfolio  
       2022-07-23 20:51:23 +08:00
    同事用 @Resource 比 @Autowired
    Rumble66
        34
    Rumble66  
       2022-07-23 21:29:49 +08:00
    构造器注入不能够像 Autowired 那样解决循环依赖
    另外有一点, 为什么说循环依赖的代码是烂代码呢? AB 两个服务相互调用不是很常见的事情吗?
    wellerman
        35
    wellerman  
       2022-07-24 01:07:18 +08:00
    构造器注入+setter 注入,循环依赖都解决了。
    Bingchunmoli
        36
    Bingchunmoli  
       2022-07-24 01:13:22 +08:00 via Android
    @mind3x 通常没有构造方法
    iPisces77
        37
    iPisces77  
       2022-07-24 02:18:42 +08:00
    同事喜欢用 @Autowired,我更喜欢自己用构造器注入,顺便循环依赖开始的时候就解决掉,重构
    11232as
        38
    11232as  
       2022-07-24 11:28:42 +08:00
    构造器注入啊,写测试多舒服
    sutra
        39
    sutra  
       2022-07-24 11:44:25 +08:00
    @wellerman @Lazy 可以解决循环依赖吧。
    bthulu
        40
    bthulu  
       2022-07-24 12:13:02 +08:00
    @unregister 有利个屁, 几十个依赖, 测某个方法用到其中一个依赖, 你一个个去数要塞到构造器第几个参数里么?
    windyboy
        41
    windyboy  
       2022-07-25 08:33:00 +08:00
    最好在构造器注入
    siweipancc
        42
    siweipancc  
       2022-07-25 09:01:35 +08:00 via iPhone
    “最好”的选择在企业开发中往往崩,需求一个依赖一个的
    jsdfzongkai
        43
    jsdfzongkai  
       2022-07-25 09:12:41 +08:00
    @dqzcwxb 确认是平替吗?知道两者区别不?
    dqzcwxb
        44
    dqzcwxb  
       2022-07-25 09:39:00 +08:00
    @jsdfzongkai #43
    @Resource 可以根据 name 和 type 查找 bean 不需要额外支持
    @Autowired 默认只支持 type,需要和 @Qualifie 一起使用才能支持 name 查找
    这不是平替什么是平替?你说的区别又指哪个?
    nothingistrue
        45
    nothingistrue  
       2022-07-25 09:50:39 +08:00
    不使用字段上的 @Autowired 的唯一好处是,去掉 Spring 后你仍然可以手动注入。这在 Spring 几乎不可能被去掉的前提下,属于过度设计。而且还是很严重那种,因为替代方式都有问题:
    隐式构造器依赖注入(就是说得 private final + @RequiredArgsConstructor )需要有强的团队约定否则就严重影响代码可读性。
    构造器注入容易出问题,而且参数多了会影响可读性
    Setter 注入器因为 lombok 尚不能很好的支持,没法用。
    jsdfzongkai
        46
    jsdfzongkai  
       2022-07-25 10:07:15 +08:00
    @dqzcwxb 默认注入方式都不同 何来的平替
    dqzcwxb
        47
    dqzcwxb  
       2022-07-25 10:48:06 +08:00
    @jsdfzongkai #46
    @Resource 会根据 name 查找,查找不到会按照 type 查找
    @Autowired 只能根据 type 查找,查找不到需要手动加上 @Qualifie 指定 name
    Resource 从功能上是大于等于 Autowired,你要是觉得还是不一样
    你干脆说名字不一样得了
    dqzcwxb
        48
    dqzcwxb  
       2022-07-25 10:53:18 +08:00
    @nothingistrue #45 如果存在不使用 spring 的场景,更推荐使用 Resource 这是 javax 注解
    jsdfzongkai
        49
    jsdfzongkai  
       2022-07-25 10:55:20 +08:00   ❤️ 1
    @dqzcwxb 不想跟你杠,只是不想你误导大家,现在你自己说清楚差别了,省的有些同学看到你上面的回复以为真的是平替
    NeoZephyr
        50
    NeoZephyr  
       2022-07-25 11:25:43 +08:00
    @beginor 容易循环依赖
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2795 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 05:51 · PVG 13:51 · LAX 21:51 · JFK 00:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.