当前位置: 首页 > article >正文

Spring 实现注入的方式

一、XML配置文件注入

  • 概念:这是一种传统的依赖注入方式,通过在XML文件中配置bean的相关信息来实现依赖注入。在Spring框架中,需要在applicationContext.xmlspring-config.xml等配置文件中定义bean,并通过<property>标签或构造方法参数等方式来指定依赖关系。
  • 优点:可以使依赖注入的配置与代码分离,便于集中管理和修改依赖关系;对于一些复杂的依赖关系配置,XML文件可以提供更丰富的配置选项和更清晰的结构。
  • 缺点:XML配置文件的维护成本较高,当bean的数量较多或依赖关系复杂时,配置文件会变得庞大且难以理解;而且XML配置文件与Java代码的耦合度较高,修改配置文件后需要重新编译项目,不利于快速开发和迭代。
  • 示例
// 定义接口和实现类
interface UserRepository {
    User getUserById(int id);
}

class UserRepositoryImpl implements UserRepository {
    @Override
    public User getUserById(int id) {
        // 从数据库中获取用户信息的逻辑
        return new User();
    }
}
<!-- 在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.xsd"
>
    <!-- 定义UserRepository bean -->
    <bean id="userRepository" class="com.example.UserRepositoryImpl"/>

    <!-- 定义UserService bean,并注入userRepository依赖 -->
    <bean id="userService" class="com.example.UserService">
        <property name="userRepository" ref="userRepository"/>
    </bean>
</beans>

二、注解 注入

  • 概念:指通过使用注解的方式来标识需要注入的依赖对象。在Spring框架中,常用的注解有@Autowired@Resource等。
  • 优点:可以使代码更加简洁和清晰,不需要编写额外的XML配置文件或手动调用注入方法;并且可以与IDE更好地集成,方便开发者进行代码编写和调试。
  • 缺点:如果过度使用注解注入,可能会导致代码的可读性下降,因为注解的使用可能会使代码的逻辑变得不那么直观;同时,注解注入也可能会导致代码与特定的框架紧密耦合,降低了代码的可移植性。

三、注解注入的不同点

① Autowired 注解

  1. 来源@Autowired 是 Spring 框架自身提供的注解,属于 Spring 核心的一部分。

  2. 使用方式:可以通过构造函数、字段、Setter 方法或任意方法参数上使用该注解,来表示需要依赖注入。使用时需要导入 包:org.springframework.beans.factory.annotation.Autowired 且只按照 byType 注入。

  3. 默认行为:如果未指定 required 属性,默认为 true,即如果找不到匹配的 Bean 会抛出异常;可以配合 @Qualifier 注解指定具体的 Bean 名称进行注入。

  4. 适用场景:适用于各种依赖注入场景,尤其是在需要明确指定注入特定类型的 Bean 时非常有用。

  5. 示例:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    @Service
    public class UserService {
        @Autowired
        private UserRepository userRepository;
        public void performService() {
            User user = userRepository.getUserById(1);
            // 对用户进行业务操作
        }
    }
    

② Resource

  1. 来源@Resource 注解最初来源于 Java EE 规范中的 JSR-250,后被 Spring 框架所支持。

  2. 使用方式:通常用于字段或 Bean 的方法上,也可以用于类级别。

  3. 默认行为:默认按照 Bean 的名称进行注入,如果名称相同则可以选择使用 name 属性指定具体的 Bean 名称;也可以通过 type 属性指定类型来进行注入。

  4. 适用场景:当需要根据名称注入依赖时,@Resource 注解更加方便;同时也适用于与 Java EE 环境集成的场景。

  5. Resource 装配顺序:
    ①如果同时指定了 name 和 type,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛 出异常。
    ②如果指定了 name ,则从上下文中查找名称(id)匹配的 bean 进行装配,找不到则抛出异常。
    ③如果指定了 type,则从上下文中找到类似匹配的唯一 bean 进行装配,找不到或是找到多个,都会 抛出异常。
    ④如果既没有指定 name ,又没有指定 type,则自动按照 byName 方式进行装配;如果没有匹配, 则回退为一个原始类型进行匹配,如果匹配则自动装配。

  6. 示例:

    import javax.annotation.Resource;
    import org.springframework.stereotype.Service;
    @Service
    public class UserService {
        @Resource
        private UserRepository userRepository;
        public void performService() {
            User user = userRepository.getUserById(1);
            // 对用户进行业务操作
        }
    }
    

http://www.kler.cn/a/532174.html

相关文章:

  • 【从零开始的LeetCode-算法】922. 按奇偶排序数组 II
  • 介绍一下Mybatis的Executor执行器
  • 【数据结构-Trie树】力扣648. 单词替换
  • C++:结构体和类
  • CNN的各种知识点(五):平均精度均值(mean Average Precision, mAP)
  • STM32 对射式红外传感器配置
  • 深入解析FastParquet库:高效处理Parquet文件的Python利器
  • 【华为OD-E卷 - 任务最优调度 100分(python、java、c++、js、c)】
  • 【STM32系列】在串口上绘制正弦波
  • 目前市场主流的AI PC对于大模型本地部署的支持情况分析-Deepseek
  • 线程的概念
  • Linux远程登陆
  • PAT甲级1032、sharing
  • 华水967数据结构2024真题(回忆版)
  • chatGPT写的网页版贪吃蛇小游戏
  • 【Linux】线程池封装与介绍
  • 【Java】位图 布隆过滤器
  • 牛客周赛 Round 79
  • Fortunately 和 luckily区别
  • UE GameMode
  • Java 数据库连接池:HikariCP 与 Druid 的对比
  • 进程的环境变量
  • 期末数据库课程设计基于Java+MySQL+JDBC+JavaSwing实现的图书进销管理系统源代码+数据库
  • 基于RK3588/RK3576+FPGA的巡检机器人六自由度机械臂的系统设计
  • vulkan入门--1windows环境搭建超详细版
  • 【算法】动态规划专题② ——LIS(最长递增子序列) python