Spring实现对象注入的三种方法详解

 更新时间:2023年07月28日 09:58:10   作者:摸鱼王胖嘟嘟  
这篇文章主要为大家学习介绍了Spring中实现对象注入的三种常用方法,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下

1.属性注入

属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。

package com.java.demo.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserRepository {
    public int add() {
        System.out.println("Do UserRepository add method.");
        return 1;
    }
}
package com.java.demo.service;
import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;
@Service
public class UserService {
    // 1. 属性注入
    @Autowired // DI(依赖注入)
    private UserRepository userRepository;
    public int add() {
        System.out.println("Do UserService add method.");
        // 传统写法
//        UserRepository userRepository = new UserRepository();
//        return userRepository.add();
        // Spring V1.0
//        ApplicationContext context =
//                new ClassPathXmlApplicationContext("spring-config.xml");
//        UserRepository userRepository = context.getBean("userRepository",UserRepository.class);
//
//        return userRepository.add();
        // Spring V2.0
        return userRepository.add();
    }
}

依赖注入 VS 依赖查找

-依赖查找依赖 Bean

-@Autowired 依赖注入流程:首先先根据getType(从容器中)获取对象,如果只获取一个,那么直接将此对象注入到当前属性上;如果获取到多个对象,才会使用getName(根据名称)进行匹配。

问题:同类型的Bean存储到容器多个,获取时报错的问题

解决方案:

1.将属性的名字和Bean的名字对应上。

2.使用@AutoWired+@Qualifier来筛选bean对象;

属性注入优缺点

优点:使用简单。

缺点:

a)无法注入一个不可变的变量(final修饰的变量)

b)只适用于IoC容器。

c)更容易违背单一设计原则,因为使用起来比较简单。

2.Setter注入

package com.java.demo.service;
import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService3 {
    private UserRepository userRepository;
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    public void sayHi() {
        System.out.println("Do UserService3 sayHi.");
        userRepository.add();
    }
}

Setter注入优缺点

优点:

通常Setter只set一个属性,所以Setter注入更符合单一设计原则

缺点:

a)无法注入一个final修饰的变量;

b)Setter注入的对象可以被修改。Setter本生就是一个方法,既然是一个方法就有可能被多次调用和修改。

3.构造方法注入(Spring 4.x之后推荐注入方式)

package com.java.demo.service;
import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService4 {
    private UserRepository userRepository;
    @Autowired
    public UserService4(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    public void sayHi() {
        System.out.println("Do UserService4 sayHi.");
        userRepository.add();
    }
}

如果当前类中存在一个构造方法时,@Autowired可以省略。

构造方法注入优缺点

优点:

a)可以注入一个final修饰的变量。

b)注入的对象不会修改,因为构造方法只会加载一次。

c)构造方法注入可以保证注入对象完全初始化。

d)构造方法注入通用性更好。

缺点:

a)写法比属性注入复杂。

b)使用构造方法注入,无法解决循环依赖的问题。

到此这篇关于Spring实现对象注入的三种方法详解的文章就介绍到这了,更多相关Spring对象注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何获取java新IO的Path文件大小

    如何获取java新IO的Path文件大小

    这篇文章主要介绍了如何获取java新IO的Path文件大小,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java中位运算(移位、位与、或、异或、非) 的简单实例

    Java中位运算(移位、位与、或、异或、非) 的简单实例

    Java中位运算(移位、位与、或、异或、非) 的简单实例,需要的朋友可以参考一下
    2013-02-02
  • 阿里巴巴 Sentinel + InfluxDB + Chronograf 实现监控大屏

    阿里巴巴 Sentinel + InfluxDB + Chronograf 实现监控大屏

    这篇文章主要介绍了阿里巴巴 Sentinel + InfluxDB + Chronograf 实现监控大屏,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Spring Boot 缓存 Cache 入门详解

    Spring Boot 缓存 Cache 入门详解

    本文主要介绍SpringBoot缓存的入门知识,包括缓存的必要性、常见的缓存策略、SpringCache的注解使用、SpringBoot与缓存的集成以及Ehcache和Redis的示例,同时,还提供了缓存面试问题的思路和答案,帮助读者更好地理解和掌握SpringBoot缓存的相关内容,感兴趣的朋友一起看看吧
    2025-03-03
  • CCF考试试题之门禁系统java解题代码

    CCF考试试题之门禁系统java解题代码

    这篇文章主要为大家详细介绍了CCF考试试题之门禁系统java解题代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 使用Java实现PDF填充图片功能

    使用Java实现PDF填充图片功能

    本文介绍了使用Java和iText库在PDF文件中填充图片的方法,包括基本步骤、准备工作、注意事项,以及如何使用ApachePDFBox处理批量图片并设置A4纸大小,还提供了性能优化建议,如版本兼容性、内存管理、流式处理等,需要的朋友可以参考下
    2025-09-09
  • SpringBoot中使用Jsoup爬取网站数据的方法

    SpringBoot中使用Jsoup爬取网站数据的方法

    这篇文章主要介绍了SpringBoot中使用Jsoup爬取网站数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • SpringBoot读取Resource下文件的4种方法

    SpringBoot读取Resource下文件的4种方法

    这篇文章主要介绍了SpringBoot读取Resource下文件的4种方法小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Collection stream使用示例详解

    Collection stream使用示例详解

    这篇文章主要介绍了Collection stream使用示例,stream流几乎可以完成对集合的任意操作,映射、去重、分组、排序、过滤等
    2022-12-12
  • Spring计划任务用法实例详解

    Spring计划任务用法实例详解

    这篇文章主要介绍了Spring计划任务用法,结合实例形式详细分析了spring计划任务相关原理、配置、使用方法及操作注意事项,需要的朋友可以参考下
    2019-11-11

最新评论