Spring 依赖注入实现示例

下面我将详细讲解“Spring 依赖注入实现示例”的完整攻略。

简介

在 Spring 中,依赖注入是一种通过引入 bean,或者在文件中定义配置信息,Spring 就能自动地初始化一个类的实例,并注入到另一个类的属性中的方式。Spring 的依赖注入实现基于反射技术,可以极大地简化代码的编写,并且能够有效地降低耦合度。

基本用法

Spring 的依赖注入有三种基本方法:

  • Setter 注入
  • 构造函数注入
  • 字段注入

下面我们来分别说明这三种方法的基本使用方法。

Setter 注入

Setter 注入是通过调用目标类的 setter 方法来进行依赖注入的。这种方式需要在类中添加相应的 setter 方法,并且需要在 Spring 配置文件中定义 bean,并在属性中使用 ref 来引用其他 bean。

例如:

public class Example {
    private Dependency dependency;

    public void setDependency(Dependency dependency) {
        this.dependency = dependency;
    }

    // ...
}
<bean id="example" class="example.Example">
    <property name="dependency" ref="dependency"/>
</bean>

<bean id="dependency" class="example.Dependency">
    <!-- dependency 的属性 -->
</bean>

Setter 注入的优点是可以很方便地在类中添加或移除依赖,但缺点是该方法需要写代码来进行注入,需要编写大量重复的 setter 方法。

构造函数注入

构造函数注入是通过调用目标类的构造函数来进行依赖注入的。这种方式需要在类中添加相应的构造函数,并且需要在 Spring 配置文件中定义 bean,并在属性中使用 ref 来引用其他 bean。

例如:

public class Example {
    private Dependency dependency;

    public Example(Dependency dependency) {
        this.dependency = dependency;
    }

    // ...
}
<bean id="example" class="example.Example">
    <constructor-arg ref="dependency"/>
</bean>

<bean id="dependency" class="example.Dependency">
    <!-- dependency 的属性 -->
</bean>

构造函数注入的优点是可以创建不可变的依赖,但缺点是需要编写大量重复的构造函数。

字段注入

字段注入是通过直接设置目标类的属性来进行依赖注入的。这种方式需要在类中添加相应的属性,并且需要在 Spring 配置文件中定义 bean,并在属性中使用 ref 来引用其他 bean。

例如:

public class Example {
    @Autowired
    private Dependency dependency;

    // ...
}
<bean id="example" class="example.Example"/>

<bean id="dependency" class="example.Dependency">
    <!-- dependency 的属性 -->
</bean>

字段注入的优点是代码量少,但缺点是该方式会让类与 Spring 容器之间产生耦合。

示例

下面给出两个实例来说明 Spring 的依赖注入的用法。

示例一:基本使用

首先创建一个简单的程序,包含两个类:Hello 和 MessagePrinter。Hello 类用于封装一个打印消息的字符串,MessagePrinter 类用于打印 Hello 类封装的消息。它们的代码如下:

public class Hello {
    private String message = "Hello, World!";

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
public class MessagePrinter {
    private Hello hello;

    public void printMessage() {
        System.out.println(hello.getMessage());
    }

    public Hello getHello() {
        return hello;
    }

    public void setHello(Hello hello) {
        this.hello = hello;
    }
}

接下来我们需要在 Spring 配置文件中定义 Hello 和 MessagePrinter 的 bean,并且将它们关联起来:

<bean id="hello" class="example.Hello">
    <property name="message" value="Hello, Spring!"/>
</bean>

<bean id="printer" class="example.MessagePrinter">
    <property name="hello" ref="hello"/>
</bean>

最后我们通过创建一个 ApplicationContext 实例来获取 MessagePrinter 实例,并调用它的 printMessage 方法:

ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
MessagePrinter printer = context.getBean("printer", MessagePrinter.class);
printer.printMessage();

代码中,我们通过读取配置文件 config.xml 来创建 ApplicationContext 实例,然后通过 getBean 方法获取 MessagePrinter 实例,最后调用 printMessage 方法输出消息。

示例二:使用注解

除了上面介绍的 XML 配置方式外,Spring 还提供了注解方式来进行依赖注入。注解方式代码更加简洁,但使用需要注意一些细节。

首先我们需要在 MessagePrinter 类中添加 @Autowired 注解:

public class MessagePrinter {
    @Autowired
    private Hello hello;

    public void printMessage() {
        System.out.println(hello.getMessage());
    }

    // ...
}

然后我们需要在 Spring 配置文件中声明 MessagePrinter 和 Hello 的 bean,并且使用 标签来启用注解:

<bean id="hello" class="example.Hello">
    <property name="message" value="Hello, Spring!"/>
</bean>

<bean id="printer" class="example.MessagePrinter"/>

<context:annotation-config/>

这里的 标签可以自动扫描注解,并且创建与之匹配的 bean,非常方便。最后我们可以在代码中创建 ApplicationContext 实例,并通过 getBean 方法获取 MessagePrinter 实例,调用 printMessage 方法输出消息。

代码如下:

public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
    MessagePrinter printer = context.getBean(MessagePrinter.class);
    printer.printMessage();
}

这里需要注意,我们通过 context.getBean(MessagePrinter.class) 获取 MessagePrinter 实例时,Spring 会自动扫描 @Autowired 注解,并创建 bean。因此我们要保证 MessagePrinter 只有一个构造函数或者只有一个有 @Autowired 注解的构造函数。

至此,我们已经完成了 Spring 依赖注入实现示例的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring 依赖注入实现示例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Javabean转换成json字符并首字母大写代码实例

    当我们需要在Java程序中将一个JavaBean对象转化成JSON字符串时,可以使用Json-lib库提供的JSONObject对象来完成。以下是实现JavaBean转换成JSON字符串并且首字母大写的代码示例: 首先,我们需要在项目中引入Json-lib库依赖: <dependency> <groupId>net.sf.json-l…

    Java 2023年5月26日
    00
  • java连不上mysql8.0问题的解决方法

    以下是详细讲解”java连不上mysql8.0问题的解决方法”的完整攻略。 问题背景 在使用Java开发中,经常会使用MySQL作为数据存储的工具。但是在使用最新版本的MySQL(例如8.0版本)时,可能会出现无法连接数据库的问题。这可能是因为MySQL的默认加密机制所导致。 解决方法 方法一:设置MySQL的加密方式 在MySQL8.0版本中,默认采用了c…

    Java 2023年6月16日
    00
  • JavaBean和SpringBean的区别及创建SpringBean方式

    JavaBean和SpringBean的区别: JavaBean是Java语言编写的可重用组件,它是普通的Java类,遵循特定的约定(约定优于配置)。JavaBean将其属性封装在私有字段中,并提供公共的getter和setter方法以让外部程序可以访问这些私有属性。JavaBean可以在任何Java环境中被使用,例如Java SE、Java EE等。 Sp…

    Java 2023年5月19日
    00
  • Java面向对象之多态

    Java面向对象之多态 Java是一门面向对象的编程语言,其中最重要的特性之一就是多态。多态是指同一个方法或者同一个类,在不同的时间、不同的对象上具有不同的表现形式。下面我们来仔细分析Java中的多态。 引言 Java的多态性分为静态多态和动态多态。 静态多态性是指在编译期就可以确定方法的调用对象,也就是说,在程序编译时已经确定了将要调用的方法。在Java中…

    Java 2023年5月26日
    00
  • Java web Hibernate如何与数据库链接

    Java web是一种使用Java编程语言开发web应用程序的技术,Hibernate是一种基于Java的ORM框架。Hibernate允许将Java类映射到关系数据库表,从而实现无需编写SQL语句的数据库操作。 下面是Java web Hibernate如何与数据库链接的攻略: 1. 配置Hibernate配置文件 在项目的src目录下创建一个名为hibe…

    Java 2023年5月19日
    00
  • SpringSceurity实现短信验证码功能的示例代码

    下面我将详细讲解如何使用Spring Security实现短信验证码功能。这里假设你已经有了一个基于Spring Security的Web应用程序,现在要添加短信验证码功能。 准备工作 在开始实现之前需要进行一些准备工作: 1.添加Spring Security支持短信验证码功能的依赖; 在pom.xml中添加以下依赖: <dependency>…

    Java 2023年5月20日
    00
  • 使用list stream: 任意对象List拼接字符串

    使用List Stream将任意对象列表拼接成字符串,可以通过以下步骤完成: 准备任意对象类型的列表。 使用 List Stream 将列表转换为字符串。 使用 Collectors.joining() 方法拼接列表元素。 下面是将任意对象列表拼接为字符串的完整代码示例: List<User> userList = Arrays.asList( …

    Java 2023年5月27日
    00
  • SpringAop @Aspect织入不生效,不执行前置增强织入@Before方式

    在Spring AOP中,我们可以使用@Aspect注解来定义切面,并使用@Before注解来定义前置增强。但是有时候,我们可能会遇到@Aspect织入不生效的问题,即前置增强不执行。本文将详细介绍如何解决@Aspect织入不生效的问题,并提供两个示例说明。 1. 解决@Aspect织入不生效的问题 在解决@Aspect织入不生效的问题时,我们可以采取以下措…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部