Spring Setter注入原理

老生谈spring(七):xml的setter注入原理 资深小白谈spring(七):xml的setter注入原理 1、xml的setter注入和构造器的注入原理相似,先对xml和Aclass修改成setter注入 public class A { private String name; public void setName(String name) { this.name = name; } @Override public String toString() { return " 阅读详情

本文内容如有错误、不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢。欢迎转载,转载请注明出处(https://blog.youkuaiyun.com/feng_xiaoshi/article/details/105832004),谢谢。

简介

本文讨论 Setter 注入方式的原理,通过了解 Setter 注入方式的原理,来加深对 Spring IOC 的认识。通过本文将了解如何使用 autowire属性的 byType,byName 执行依赖注入。以及手动模式的 API 配置元信息的案例。

前期工作
引入依赖

pom.xml 中添加 Spring 的库依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.6.RELEASE</version>         
</dependency>
创建依赖类

有一个依赖于实际上处理业务逻辑的服务的应用程序类:
IndexApp.java

public class IndexApp {
    private IndexService service;
...
}

IndexService 是一个接口:
IndexService.java

public interface IndexService {
    public String serve();
...    
}

该接口可以有多种实现。 一个潜在的实现 DefaultIndexServiceImpl:
DefaultIndexServiceImpl.java

public class IndexService implements IService {
    @Override
    public String serve() {
        return "Hello World";
    }
}

设计上,IndexApp 是一个高级组件,它依赖于称为 IndexService 的低级组件。
本质上,将 IndexApp 与 IndexService 的具体实现的关联关系实现脱钩,而和 IndexService 的接口进行关联,因为该实现可能会因各种因素而有所不同。

模式

Setter 的实现方式有手动和自动两种。

手动模式

依赖注入是一种通过外部容器提供对象的依赖关系的技术。 因此需要通过外部化配置来进行指定和约束需要装配的内容和规则。
主要有以下三种手动方式进行约束。

  • XML 资源配置元信息
  • Java 注解配置元信息
  • API 配置元信息
XML 资源配置元信息

XML

在 XML 的配置中将依赖项连接在一起:
bean-setter.xml

<bean
  id="defaultIndexService"
  class="com.feng.di.spring.DefaultIndexServiceImpl" />
      
<bean
  id="indexApp"
  class="com.feng.di.spring.IndexApp" >
    <property name="service" ref="defaultIndexService" />
</bean>   

可以看出,XML 配置创建 DefaultIndexServiceImpl 的实例并为其分配 ID 。默认情况下,bean 是单例。与此同时创建 IndexApp 的实例,在这个 bean 中,使用 setter 方法注入另一个 bean 。

测试代码:

/**
 * 基于 XML 资源的依赖 Setter 方法注入示例
 */
public class XmlDependencySetterInjectionDemo {

    public static void main(String[] args) {
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();

        XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(beanFactory);

        String xmlResourcePath = "classpath:META-INF/bean-setter.xml";
        // 加载 xml 资源,并生成 BeanDefinition 资源
        xmlReader.loadBeanDefinitions(xmlResourcePath);
        IndexApp indexApp = beanFactory.getBean(IndexApp.class);
    }
}
Java 注解配置元信息

Spring Annotation

从Spring 2.5开始,可以使用注释配置依赖项注入。因此,可以使用相关类,方法或字段声明上的注释,而不是使用XML来描述bean的连接,而是可以将bean配置移入组件类本身。
注释注入在XML注入之前执行。因此,对于通过两种方法连接的属性,后一种配置将覆盖前者。
默认情况下,Spring容器中的注释接线未打开。因此,在使用基于注释的连接之前,需要在Spring配置文件中启用它。

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context = "http://www.springframework.org/schema/context"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:annotation-config/>

</beans>

一旦配置了<context:annotation-config />,就可以开始注释代码,以指示Spring应该自动将值连接到属性,方法和构造函数中。
下面是一些注释列表:

序号注释与说明
1@Required批注适用于bean属性设置器方法。
2@Autowired批注可以应用于bean属性设置器方法,非设置器方法,构造函数和属性。
3@Qualifier注释和@Autowired可以通过指定将要连接的确切bean来消除混淆。
4Spring支持基于JSR-250的注释,包括@ Resource,@ PostConstruct和@PreDestroy注释。
Service 类例子

假设 向用户发送电子邮件和短息消息。对于依赖项注入,需要为服务提供一个基类。因此,MessageService 是用于发送消息的单一方法声明的接口。


package com.feng.spring.di.services;

public interface MessageService {

	boolean sendMessage(String msg, String rec);
}

现在, 有实际的实现类来发送电子邮件和短信消息。


package com.feng.spring.di.services;

public class EmailService implements MessageService {

	public boolean sendMessage(String msg, String rec) {
		System.out.println("Email Sent to "+rec+ " with Message="+msg);
		return true;
	}
}

package com.feng.spring.di.services;

public class SmsService implements MessageService {

	public boolean sendMessage(String msg, String rec) {
		System.out.println("Sms message Sent to "+rec+ " with Message="+msg);
		return true;
	}
}
Component 类例子

为上述 Service 编写一个消费者类。


package com.feng.spring.di.consumer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;

import com.feng.spring.di.services.MessageService;

@Component
public class MyApplication {

	// 基于变量的依赖注入
	//@Autowired
	private MessageService service;
	
//	基于构造参数的 dependency injection	
//	@Autowired
//	public MyApplication(MessageService svc){
//		this.service=svc;
//	}
	
	@Autowired
	public void setService(MessageService svc){
		this.service=svc;
	}
	
	public boolean processMessage(String msg, String rec){
		//验证,日志等信息
		return this.service.sendMessage(msg, rec);
	}
}

关于 MyApplication 类的注意点:

  • @Component 注释被添加到该类中,以便当 Spring 框架扫描组件时,该类将被视为组件。@Component 批注只能应用于类,其保留策略是运行时。
  • @Autowired 注解用于让 Spring 知道需要自动装配。这可以应用于字段,构造函数和方法。这个注释使我们能够在组件中实现基于构造函数,基于字段或基于方法的依赖注入。
配置类

对于基于注释的配置,我们需要编写一个Configurator类,该类将用于将实际的实现bean注入到组件属性中。


package com.feng.spring.di.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.feng.spring.di.services.EmailService;
import com.feng.spring.di.services.MessageService;

@Configuration
@ComponentScan(value={"com.feng.spring.di.consumer"})
public class DIConfiguration {

	@Bean
	public MessageService getMessageService(){
		return new EmailService();
	}
}
  • @Configuration 注解用于让 Spring 知道它是 Configuration 类。
  • @ComponentScan 注解与 @Configuration 注解一起使用以指定要查找组件类的包。
  • @Bean 批注用于使 Spring 框架知道该方法应用于使 Bean 实现注入到 Component 类中。

编写一个简单的程序来测试基于注释的 Spring Dependency Injection 示例:


package com.feng.spring.di.test;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.journaldev.spring.di.configuration.DIConfiguration;
import com.journaldev.spring.di.consumer.MyApplication;

public class ClientApplication {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DIConfiguration.class);
		MyApplication app = context.getBean(MyApplication.class);
		
		app.processMessage("Hi Pankaj", "pankaj@abc.com");
		
		// 关闭上下文
		context.close();
	}
}

AnnotationConfigApplicationContext 是 AbstractApplicationContext 抽象类的实现,用于在使用注释时将服务自动装配到组件。AnnotationConfigApplicationContext 构造函数将 Class 作为参数,用于获取 Bean 实现以注入组件类。

getBean(Class) 方法返回 Component 对象,并使用配置自动装配对象。上下文对象是资源密集型的,因此在完成操​​作后应将其关闭。
程序运行输出以下信息:

May 02, 2020 9:14:01 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@17f052a3: startup date [Sat May 02 21:14:01 CST 2020]; root of context hierarchy
Email Sent to pankaj@abc.com with Message=Hi Pankaj
May 02, 2020 9:14:02 PM org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@17f052a3: startup date [Sat May 02 21:14:01 CST 2020]; root of context hierarchy
API 配置元信息

API 配置元信息是通过构造 BeanDefinition 来实现的,代码如下:
ApiDependencySetterInjectionDemo.java

package com.feng.spring.di;

import com.feng.spring.di.consumer.MyApplication;
import com.feng.spring.di.services.EmailService;
import com.feng.spring.di.services.MessageService;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;

public class ApiDependencySetterInjectionDemo {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApiDependencySetterInjectionDemo.class);

        // 生成 MyApplication 的 BeanDefinition
        BeanDefinition beanDefinition = createMyApplicationBeanDefinition();
        // 注册 MyApplication的Bean
        context.registerBeanDefinition("myApplication", beanDefinition);
        
        MyApplication myApplication = context.getBean(MyApplication.class);
        myApplication.processMessage("hello bean definition", "abc@outlook.com");
        context.close();
    }

    private static BeanDefinition createMyApplicationBeanDefinition(){
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MyApplication.class);
        builder.addPropertyReference("service", "messageService");
        return builder.getBeanDefinition();
    }

    @Bean(name = "messageService")
    public MessageService getMessageService(){
        return new EmailService();
    }
}

输出信息如下:

May 02, 2020 10:06:19 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@238e0d81: startup date [Sat May 02 22:06:19 CST 2020]; root of context hierarchy
Email Sent to abc@outlook.com with Message=hello bean definition
May 02, 2020 10:06:19 PM org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@238e0d81: startup date [Sat May 02 22:06:19 CST 2020]; root of context hierarchy
自动模式
  • byName
  • byType

下面通过示例来解释自动模式:
Order.java

package com.feng.spring.di.beans;

public class Order {

    private String item;

    private String price;

    public String getItem() {
        return item;
    }
    public void setItem(String item) {
        this.item = item;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
}

PaymentGateway.java

package com.feng.spring.di.beans;

public class PaymentGateway {

    private Order order;

    public void setOrder(Order ord){
        this.order = ord;
    }

    public Order getOrder() {
        return order;
    }

    @Override
    public String toString(){
        return "ordering "+this.order.getItem()+" | price: "+this.order.getPrice();
    }
}

基于xml的配置文件,注入依赖项的常规方法:
spring-autowriting-conventional.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="paymentGateway" class="com.feng.spring.di.beans.PaymentGateway" >
        <property name="order" ref="orderBean" />
    </bean>

    <bean id="orderBean" class="com.feng.spring.di.beans.Order" >
        <property name="item" value="Java Book" />
        <property name="price" value="RS 225" />
    </bean>
</beans>

基于 byType 模式的自动注入:
spring-autowriting-by-type.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="paymentGateway" class="com.feng.spring.di.beans.PaymentGateway"
          autowire="byType"/>

    <bean id="orderBean" class="com.feng.spring.di.beans.Order" >
        <property name="item" value="Java Book" />
        <property name="price" value="RS 225" />
    </bean>
</beans>

基于 byName 模式的自动注入:
spring-autowriting-by-name.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="paymentGateway" class="com.feng.spring.di.beans.PaymentGateway"
          autowire="byName"/>

    <bean id="order" class="com.feng.spring.di.beans.Order" >
        <property name="item" value="Java Book" />
        <property name="price" value="RS 225" />
    </bean>
</beans>

测试类
AutoWiringDependencyInjectDemo.java

package com.feng.spring.di;

import com.feng.spring.di.beans.PaymentGateway;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AutoWiringDependencyInjectDemo {

    public static void main(String a[]){
        String confFile = "spring-autowriting-by-name.xml";
        ConfigurableApplicationContext context
                = new ClassPathXmlApplicationContext(confFile);
        PaymentGateway paymentGateway = (PaymentGateway) context.getBean("paymentGateway");
        System.out.println(paymentGateway.toString());
    }
}

自动注入通过 byType和byName ,一般在 XML 配置文件中用的较多。

总结

在本文中,举例说明了如何使用 Spring Framework 使用基于 XML 的配置注入依赖项的示例,通过上面的5个案例,分别通过手动模式和自动模式介绍了 Setter 依赖注入的方式,通过对手动模式的 API 配置元信息,能够更多的理解它底层的一个设计初衷,比如通过 BeanDefinitionBuilder#addPropertyReference 来达到引入相关依赖的目的。

参考资料

Spring Setter-based Dependency Injection(基于Spring Setter的依赖注入)

XML-Based Injection in Spring(Spring中基于XML的注入)

Spring Dependency Injection(Spring 依赖注入)

Spring - Dependency Injection example with annotation(Spring-带有注释的依赖注入示例)

深入理解Spring框架的setter注入方式 依赖注入(Dependency Injection, DI)是Spring框架的核心特性之一,它是一种实现控制反转(Inversion of Control, IoC)的设计模式。依赖注入允许将对象的依赖关系通过外部配置文件、注解或者编程方式进行配置,而不是通过硬编码方式在类的内部创建依赖对象。这样做可以降低类与类之间的耦合度,使得系统的可测试性、可维护性以及可扩展性得到显著提升。在Spring框架中,setter注入是一种依赖注入的方式,它依赖于对象的setter方法来实现依赖的设置。 阅读详情

相关推荐

SAP 屏幕增强:客户商主数据屏幕增强(KNA1、KNB1、KNVV)

本文介绍了SAP系统中针对客户主数据(KNA1、KNB1、KNVV)进行屏幕增强的具体实现方法。主要内容包括:1)在SPRO配置中创建新条目;2)通过SE80创建函数组和程序(LZKNA1TOP等);3)设置子屏幕9001并添加自定义结构字段;4)利用BADI(CUSTOMER_ADD_DATA等)实现数据交互逻辑。文章分别详细说明了针对客户主数据的一般数据(KNA1)、公司代码数据(KNB1)和销售数据(KNVV)三类不同数据的增强配置步骤,包括函数模块创建、屏幕设置和BADI方法调用等关键技术点。

SAP ABAP开发技能记录分享 1616

Spring 学习笔记

1.最初在UserServiceImpl中调用dao层 需要用接口去接收实现类,如下: Userdao userdao=new UserdaoImpl(); 而在springmvc中则变成如下方式,通过set注入的方式,要配置bean private Userdao userdao; public void setUserdao(Userdao userdao){ this.userdao=userdao; } ...

weixin_48494706的博客 231

光学材料仿真软件:FDTD Solutions_(4).材料属性的定义与应用

在光学材料仿真软件中,材料属性的定义和应用是至关重要的一步。正确地定义材料属性可以确保仿真结果的准确性和可靠性。本节将详细介绍如何在FDTD Solutions中定义和应用不同的材料属性,包括介质材料、金属材料、色散材料等,并提供具体的代码示例和数据样例。介质材料是光学仿真中最常见的材料类型之一。在FDTD Solutions中,可以通过多种方式定义介质材料,包括使用预定义的材料库、自定义材料参数或导入材料数据文件。FDTD Solutions内置了一个丰富的材料库,包含了许多常用材料的光学性质。

kkchenjj的博客 1401

依赖注入 setter注入 构造器注入 依赖自动装配 集合注入

依赖注入 setter注入 构造器注入 依赖自动装配 集合注入

weixin_46140377的博客 1816

C-Lodop打印服务系统存在任意文件读取

C-Lodop打印服务系统存在任意文件读取

weixin_43567873的博客 2873

RK3568平台开发系列讲解(安卓篇)LED呼吸灯系统流程

1.app层封装后使用NotificationManager发出:NotificationManager.notify() 2.Android 系统架构中:一个manager类对应一个aidl接口,一个manager对应一个底层的服务,notification也是这个架构

内核笔记 3646

【Spring】依赖注入方式(附代码理解使用)——setter与构造器注入;依赖自动装配;使用p命名空间注入属性值;注入数组集合类型

【依赖注入描述了容器中建立bean与bean之间依赖关系的过程,如果bean运行需要的是数字或字符串?①引用类型、②简单类型(基本数据类型与String)】一个HelloWorld类中写一个String类型对象,提供可访问的。在配置文件中使用property标签注入ref属性引用类型对象。【向一个类中传递数据的方式?①普通方法、②构造方法】一个String类型、一个int类型,并提供可访问的。在bean中定义引用类型属性并提供可访问的。在bean中定义引用类型属性并提供可访问的。

m0_70083523的博客 908

【WRF数据准备】制备月尺度静态地理数据:LAI、Fpar、LUCC

【WRF数据准备】制备月尺度静态地理数据:LAI、Fpar、LUCC

WW、forever的博客 803

Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)

依赖注入的方式有setter注入、构造器注入、自动装配、集合注入

坚持不懈的大白的博客 1703

RH850从0搭建Autosar开发环境【2】- Davinci Configurator配置工程导入DBC与CDD文件

Davinci Configurator配置工程导入DBC与CDD文件,开始Autosar开发

weixin_42412049的博客 8152

Oracle EBS Interface/API(29) - AP发票API

续上编文章《Oracle EBS Interface/API(28) - 客制化开发AP付款API》背景,介绍如调用官方提供标准AP发票API调用 用户界面 Invoices(Payables Manager->Invoices->Entry->Invoices) Open Interface Invoices(Payables Manager->Invoices->Entry->Open Interface Invoices) 快速参考 参考点 内容.

陈显平的专栏-Oracle EBS 1150

Sprng依赖注入(二):setter注入是如何工作的?

在Spring依赖注入(一):字段注入的方式是如何工作的?中主要分享了Spring bean依赖注入方式中的字段注入方式及其工作过程,这篇文章来分享一下SPrng bean依赖注入的第二种方式:setter方法注入,从名字来猜也能猜出一个大概,就是通过调用bean的setter方法进行注入,根本原理是java的反射技术。 settter注入方法以@Autowired注解为例,即把@Autowired注解标记在目标bean的引用bean的setter方法上;setter注入示例主要内容:1、定义Teacher

凡夫编程 1496

【20260309】【亲测可用】【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled

【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection。

奶爸的编程之路,也就一周冷个三天 2万+

Spring注入 @Autowired和setter方式区别原理

spring 的注入方式有:setter、constructor、静态工厂方法、实例工厂方法、注解@Autowired自动装配几种方式。 今天我们要了解的是:setter和@Autowired两种方式的区别,常用的setter方式很好理解,通过调用Bean的属性setter方法直观的赋值即可。而@Autowired方式,没有setter方法赋值又是通过什么方式实现的呢?看一下spring源码

wenluoxicheng的专栏 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

spring setter方法依赖注入(DI)原理

使用setter方法DI: beans.xml                    Bean1.java public class Bean1 {     private BeanDao beanDao;          public BeanDao getBeanDao() {         return beanDao;     }     pub

yhcelebrite的专栏 3623

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

(4) 利用 Setter方式实现 【第一种方式】 依赖注入,编码剖析Spring依赖注入的原理

import cn.itm.dao.PersonDao; public class PersonDaoBean implements PersonDao { public void add(){ System.out.println("执行PersonDaoBean的add方法。。。"); } } package cn.itm.dao; public in

1255

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

(3) 利用 Setter方式实现 【第一种方式】 依赖注入,编码剖析Spring依赖注入的原理

[java] view plaincopyprint? import cn.itm.dao.PersonDao;      public class PersonDaoBean implements PersonDao {              public void add(){          System.out.println("执行PersonDaoBean的a

cpf506497746的专栏 542

java中依赖注入原理_spring setter方法依赖注入(DI)原理

使用setter方法DI:beans.xmlBean1.java public class Bean1 {private BeanDao beanDao;public BeanDao getBeanDao() {return beanDao;}public void setBeanDao(BeanDao beanDao) {this.beanDao = beanDao;}public void s...

weixin_32722049的博客 223

(4) 利用 Setter方式实现 【第一种方式】 依赖注入,编码剖析Spring依赖注入的原理...

import cn.itm.dao.PersonDao; public class PersonDaoBean implements PersonDao { public void add(){ System.out.println("执行PersonDaoBean的add方法。。。"); } } package cn.itm.dao; public interf...

编程资料大全 289

【源码分析】Spring依赖注入原理

在Spring中提供了三种实现依赖注入的方式:`字段注入、构造器注入、Setter方法注入`。 首先我们先创建一个Service层的接口以及对应的实现类,基于以下实现类来实现依赖注入的方式:

我这么骄傲的一个人。 1996

编码剖析Spring依赖注入的原理

Spring的依赖注入前面我们就已经讲过所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。 Spring的依赖注入有两种方式: 通过构造器参数,让容器把创建好的依赖对象注入。 使用setter方法进行注入。 现在我们使用第二种方式进行依赖注入。以Spring管理的Bean的生命周期的案例为基础展开本文的说明。 首先在src目录下新建一个cn.itcast.dao包,并在该包下

李阿昀的博客 3123

使用 Setter 方法实现 Spring 依赖注入

依赖注入是一种设计模式,它将对象的依赖关系交给外部容器管理,而不是在对象内部自行创建这些依赖。Spring 框架通过 IoC(控制反转)容器实现了依赖注入,允许开发者轻松地管理对象及其依赖关系。Setter 方法注入是通过对象的 Setter 方法来注入依赖。这种方式的特点是可以在对象创建后再设置其依赖,因此比较灵活,可以在对象生命周期中动态更改依赖。

FireFox1997 955

Spring依赖注入三种方式详解:构造器、Setter与字段注入实战对比

依赖注入(DI)作为控制反转(IoC)的核心实现技术,是现代Java企业级应用开发的基石。其原理是通过外部容器管理对象间的依赖关系,而非在对象内部硬编码创建,从而实现组件间的解耦。这一机制的技术价值在于提升代码的可测试性、可维护性和灵活性,使得应用更易于扩展和重构。在Spring框架中,依赖注入广泛应用于服务层、数据访问层及控制器等组件的装配。本文聚焦于Spring依赖注入的三种主流实现方式:构造器注入、Setter方法注入和字段注入,深入剖析其设计哲学、适用场景及在**单元测试**和**循环依赖**处理中

Eric.Net的专栏 375

Spring-依赖注入原理

使用构造器注入使用属性setter方法注入使用Field注入(用于注解方式) 注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。 1.手工装配依赖对象2.自动装配依赖对象 在Spring学习笔记(3)中剖析了Spring管理Bean的原理,下面解释下Spring依赖注入的原理 在进行依赖注入时,我们的配置文件如...

liberty12345678的专栏 3924

04-Spring注入(Injection)

上一篇:03-Spring和日志框架log4j整合https://blog.youkuaiyun.com/fsjwin/article/details/109407627 1.什么是注入 通过spring工厂和配置文件为spring的成员变量赋值,就叫注入 工厂 配置文件 成员变量赋值 2.为什么需要注入 一般的写法 @Test public void test6() { ApplicationContext ctx = new ClassPathXmlApplicationCo

前路无畏的博客 1万+

java 什么是注入_spring注入的三种方式是什么

spring注入的三种方式是:1、构造器注入;2、setter注入;3、接口注入。构造器注入依赖于构造方法的实现,setter注入是通过setter方法注入。spring的依赖注入分为三种方式,如下:1、构造器注入2、setter注入3、接口注入构造器注入和setter注入是依赖注入的两种主要方式,接口注入是指从别的地方注入的方式。(通过在xml中描述,实现注入)(学习视频推荐:java视频教程)...

weixin_32661017的博客 3574
上一篇: Spring 依赖注入模式和类型
下一篇: 闻与MyBatis之MyBatis标签
feng_xiaoshi
博客等级 码龄11年 34粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值