Java 后台开发,大家用 @Autowired 多么 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
NoKey
V2EX    程序员

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

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

    到处文章都在说,不建议 @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
    不推荐,建议使用构造函数注入
    KotlinAmai
        3
    KotlinAmai  
       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-0723 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   3
    看样子很多人不知道,单构造函数的类甚至不需要标注任何 `@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     Solana     2474 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 01:39 PVG 09:39 LAX 18:39 JFK 21:39
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86