首页 > 其他分享 >Spring注入Bean的几种方式

Spring注入Bean的几种方式

时间:2022-12-09 21:47:00浏览次数:39  
标签:属性 Spring 几种 Bean 工厂 注入 方法 构造函数

属性注入

属性注入即通过setXXX()方法注入bean的属性值或依赖对象。
由于属性注入方式具有可选择性和灵活性高的特点,因此它也是实际开发中最常用的注入方式。

Spring首先会调用bean的默认构造函数实例化bean对象,然后再通过反射的方法调用set方法来注入属性值。

属性注入要求bean提供一个默认的构造函数,并且为需要注入的属性提供set方法 。
默认的构造函数,即不带参数的构造函数。
如果类中没有自定义任何构造函数,则系统(JVM)会自动生成一个不带参的默认构造函数
如果类中显示的自定义了有参数的构造函数,则系统就不会在自动生成默认构造函数,需要自己手动再加一个无参的构造函数。

构造函数注入

构造函数注入是除属性注入之外的另一种常用的注入方式,它可以保证一些必要的属性在bean实例化时就得到了设置,并在实例化后就可以使用。

使用构造函数注入的前提是: bean必须提供带参的构造函数。
对于构造函数的注入,配置文件可以有以下几种方式:

按类型匹配入参
按索引匹配入参
联合使用类型和索引匹配入参
通过自身类型反射匹配入参

工厂方法注入

工厂方法是应用中被经常使用的设计模式,也是控制反转和单实例设计思想的主要实现方法。
工厂类负责创建一个或多个工厂类实例,工厂类方法一般以接口或抽象类变量的形式返回目标类实例。

工厂类对外屏蔽了目标类的实例化步骤,调用者甚至根本不用指定具体的目标类是什么。
由于Spring容器以框架的方法提供工厂方法的功能,并以透明的方式开放给开发者。因此很少需要手工编写工程方法。
但在一些遗留系统或第三方类库中还是会碰到工程方法,此时便可以使用Spring工厂注入的方法来进行Spring的注入。
Spring工厂注入的方法可以分为静态和非静态两种。
#
(1) 非静态工厂方法
有些工厂方法是非静态的,必须实例化工厂类之后才能调用工厂方法。
(2) 静态工厂方法

很多工厂类方法都是静态的,这意味着无需创建工厂类实例的情况下就可以调用工厂类方法。
因此静态工程方法比非静态工厂方法的调用更加方便简洁。

Spring提供了三种可供选择的注入方式,但在实际应用中,我们究竟该选择哪种注入方式,并没有统一的标准,如下是一些可以参考的理由:

构造函数注入理由:
  构造函数保证重要属性预先设置;
  无需提供每个属性的setter方法,减少类的方法个数;
  可以更好地封装类变量,避免外部错误调用。

属性注入理由:

  属性过多时,构造函数变得臃肿;

  构造函数注入灵活性不强,有时需要为属性注入null值;

  多个构造函数时,配置上产生歧义,复杂度升高;

  构造函数不利于类的继承和扩展;

  构造函数注入会引起循环依赖的问题。

其实Spring为我们注入参数提供了这么多方法,那么这些方法必然有他们存在的道理,
每个方法在某一问题上会有独特的优势,我们只需要按照我们具体的使用需求选择适合的方法来使用就好了,但一般不太推荐工厂方法注入。

标签:属性,Spring,几种,Bean,工厂,注入,方法,构造函数
From: https://www.cnblogs.com/NetUSA/p/16970039.html

相关文章

  • 基于springboot网吧管理系统设计与实现的源码+文档
    摘要随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各......
  • struts 2+hibernate 3+spring基本套路小结
    任何东西都是有一定的套路和规律的,struts2+hibernate3+spring也一样,struts2比struts1爽很多了,但目前唯一觉得不爽的是struts2居然没什么好的IDE工具去支持设计之,比......
  • Android截屏截图的几种方法总结
    Android截屏Android截屏的原理:获取具体需要截屏的区域的Bitmap,然后绘制在画布上,保存为图片后进行分享或者其它用途一、Activity截屏1、截Activity界面(包含空白的状态栏)/......
  • SpringCloud学习 系列七、EurekaServer集群创建
    系列导航SpringCloud学习系列一、前言-为什么要学习微服务SpringCloud学习系列二、简介SpringCloud学习系列三、创建一个没有使用springCloud的服务提供者和消费......
  • SpringBoot中MongoDB聚合管道查询操作$facet$lookup$unwind$group
    前言、官方文档、MongoTemplate中的概念前言最近在做基于SpringBoot的MongoDB的聚合管道操作,JSON语句不难写,但是理清楚逻辑、顺序很麻烦,而且在Java(Springboot)上操作聚合......
  • spring mvc环境之数据库ORM组件Mybaits配置(九)
    spring引入Mybaits功能,还是把握住主要步骤,1.引入相关jar包(spring-jdbc、spring-orm,spring-aop、spring-tx(有orm就可以)、spring-oxm(无关)、mybatis、mybatis-spring);2......
  • Spring boot与Spring cloud 之间的关系
     Springboot与Springcloud之间的关系Springboot是Spring的一套快速配置脚手架,可以基于springboot快速开发单个微服务,SpringBoot,看名字就知道是Spring的......
  • SQL Server 数据库查找重复记录的几种方法
    一、查某一列(或多列)的重复值。(只可以查出重复记录的值,不能查出整个记录的信息)例如:查找id,name重复的记录:selectid,namefromdatatablegroupbyid,namehaving(count(*)......
  • SpringBoot单元测试类
    1、注解:@SpringBootTest:表示标注当前的类是一个测试类,不会随项目一起打包;@RunWith(SpringRunner.class):表示启动这个单元测试类(单元测试类是不能运行的),需要传递一个参数,必......
  • 关闭ios虚拟键盘的几种方法
    在iOS应用开发中,有三类视图对象会打开虚拟键盘,进行输入操作,但如何关闭虚拟键盘,却没有提供自动化的方法。这个需要我们自己去实现。这三类视图对象分别是UITextField,UIText......