Spring - 更简单的获取 Bean 对象

news/2025/1/2 0:58:57/

目录

二、获取 Bean 对象(对象装配或者对象注入)

1. 属性注入

1.1 属性注入的优点和缺点:

2. Setter注入

 2.1 Setter注入的优点和缺点

3. 构造方法注入(spring 官方推荐的对象注入方式)

3.1 构造方法的优点和缺点

4. @Autowired 注解 和 @Resource 注解的区别

4.1 @Autowired 和 @Source 的区别


前言

    上一篇文章讲到了如何更简单的存储 Bean 对象,有两种方式:  1. 使用五大 类注解,2. 使用 @Bean 方法注解。这篇文章继续介绍如何更简单的获取 Bean 对象。

二、获取 Bean 对象(对象装配或者对象注入)

    对象注入 :  更加简单的读取 Bean 对象(指的是从 Spring 容器中读取某个对象,放到当前类里面)

    在 Spring 中实现依赖注入的常见方式有三种:

1. 属性注入
2. Setter 注入
3. 构造方法注入

1. 属性注入

    目标:在 Controller 中 得到一个 Service 对象:(如下代码所示,使用 @Autowired 的方式来实现对象注入)

    注:如果是在一个静态方法中或者是一个静态属性,此时加载的时机是在 spring容器初始化之前开始执行的,所以不能在静态方法中使用属性注入获取 Bean 对象的。

    所以在启动类的 main 方法中还是用原来的方式获取到 Controller 对象,重点是关注使用属性注入的方式是否可以拿到 Service 这个 Bean 对象。

     如上图代码运行结果:就是使用属性注入的结果。

1.1 属性注入的优点和缺点:

    优点:属性注入的最大的优点就是实现简单,使用简单,只要给变量上边加上一个注解(@Auotwired),就可以在不 new 对象的情况下直接获取注入的对象了,(这就是DI,依赖注入)

    缺点:属性注入同样也会有很多问题,甚至编译器都不推荐使用这种方法,属性注入的缺点包含以下三个:

1. 功能性问题:无法注入一个不可变的对象(被 final 修饰的对象)

2.兼容性问题:只能适用于 IoC 容器,也就是在IoC容器之外这种方式就不适用了。
3. 设计原则问题:容易违反单一谁原则(单一原则:一个类或者一个方法就只实现一个功能)但是加了属性注入之后,就有了更多的 Bean 对象,此时承担的职责也就更多了。

2. Setter注入

     运行结果:

 2.1 Setter注入的优点和缺点

    优点:完全符合单一设计的原则,每一个Setter 只针对一个对象。

    缺点:

1. 不能注入不可变对象(final 修饰的对象)

2. 注入的对象可以被修改

 

 3. 构造方法注入(spring 官方推荐的对象注入方式)

     运行结果:

    特点: 如果当前类中只有一个构造方法的时候,允许在构造方法上面不加 @Autowired 注解,然后也是可以拿到 UserService 这个对象的;如下图运行结果:

     运行结果:

3.1 构造方法的优点和缺点

    优点:

1. 可以注入一个不可变的对象。(final 修饰的对象)在Java中,被final 修饰的对象必须满足两个条件中的任意一个:

    (1)final 修饰的对象,要么直接进行赋值。

    (2)final 修饰的对象,要么必须在构造方法中赋值。

2. 注入的对象不会被修改。(因为构造方法只能调用一次)
3. 注入的对象完全被初始化。(一个类是先执行实例化,然后执行初始化,在初始化时就会把 Bean 对象注入到当前类当中)
4. 兼容性更好。(构造方法是所有框架都支持的,所以脱离IoC容器也可以使用)

4. @Autowired 注解 和 @Resource 注解的区别

    在进行类注入的时候除了使用 @Autowired 注解之外,还可以使用 @Resource 注解,两种在大部分的场景下使用是没有区别的,都可以实现对象注入,但是也是有一点点区别的

4.1 @Autowired 和 @Source 的区别

  1. 出身不同:@Autowired 是属于spring 的,而 @Resource 来自于JDK的注解。

  2. 使用时设置的参数不同:相对 @Autowired,@Resource 支持更多的参数设置,我们可以看下两个注解的源码:

 

  3. @Autowired 可以在三种注入方法中都可以使用,但是 @Resource 只可以在 Setter注入和属性注入中使用,不能用在构造方法上,如下代码:

 


http://www.ppmy.cn/news/881661.html

相关文章

比亚迪半导体IPO再生波折:又被中止审核 红杉小米是股东

雷递网 雷建平 4月1日报道 2022年1月底刚刚过会的比亚迪半导体上市再生波折,于2022年3月31日的审核再度被中止。 这不是比亚迪半导体IPO审核第一次被深交所中止。2021年8月8日,因律师北京市天元律师事务所被中国证监会立案调查,比亚迪半导体被…

小米上市 365 天:雷军的坚守与败退

雷军一直憧憬,让小米从硬件公司转型互联网公司,经过一年的努力,这个浩荡的工程远没有完工。所有的调整,都还处于“让子弹飞一会儿”的状态,尚未见到成效。 作者 | 刘亚杰 本文经授权转载自一点财经(ID&…

Vue3+ts;枚举(enum);Partial全部可选/Pick选一部分/配置 svg 图标/unplugin-vue-components组件自动按需加载

项目的创建 使用 create-vue 脚手架创建项目。 1.执行创建命令 pnpm create vue # or npm init vuelatest # or yarn create vue2.选择项目依赖内容。 ✔ Project name: … //项目名 ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router …

重磅!大基金、华为、小米共同投资这家芯片公司!

近日,思特威(上海)电子科技有限公司在21日发生工商变更,此轮融资新增投资方包括大基金二期、小米长江产业基金、安芯投资等知名机构。 今年8月初,思特威刚刚获得华为旗下哈勃投资的注资。2018年8月,在思特威…

营收超10亿元,又一家英特尔与小米投资的中国半导体企业即将上市

点击添加图片描述(最多60个字)编辑 2020年5月21日,上交所科创板上市委2020年第25次审议会议上,芯原微电子(上海)股份有限公司的首发申请获通过。芯原股份后面等着上市IPO了! 点击添加图片描述&…

创米数联创业板IPO被终止:曾拟募资6.44亿 小米是重要股东

雷递网 雷建平 12月13日 上海创米数联智能科技发展股份有限公司(简称:“创米数联”)日前IPO被终止,其曾在2022年6月递交招股书,准备在深交所创业板上市。 创米数联曾计划募资6.44亿元,其中,4.06…

【观察】小米上市后首次发布财报 同比增长75.4%背后的秘密

申耀的科技观察 读懂科技,赢取未来! 8月22日,小米发布了2018年二季度财报,这是小米自7月份港交所上市之后公布的首份财报。 财报显示,小米二季度实现净利润146.3亿元,销售额增长68.3%至452.36亿…

小米今日登陆港交所 上市估值达540亿美元

7月9日凌晨消息,香港首支同股不同权的新股小米(01810-HK)将于今天上午在港交所正式挂牌交易。 7月6日,小米公布了IPO配售结果,小米公告称共收到1,034,986,800股认购申请,相当于超额认购约9.5倍。如按17港元发售价计算,…