一、不推荐把“线程”注入到spring

将线程注入到Spring容器中并不是一个常见的做法,而且通常也不推荐这样做,原因如下:

  1. 生命周期管理困难: Spring管理的Bean生命周期由Spring容器管理,而线程的生命周期由JVM管理。将线程注入到Spring容器中会导致线程的生命周期与Spring容器的生命周期绑定,这可能会导致线程的生命周期不受你的控制,难以达到预期的效果。

  2. 线程安全问题: Spring容器本身是线程安全的,但线程对象并不一定是线程安全的。如果将线程注入到Spring容器中,可能会引入线程安全问题,因为Spring容器对线程的管理方式与普通Bean不同。

  3. 可维护性和可读性差: 将线程注入到Spring容器中会增加代码的复杂度,降低代码的可维护性和可读性。开发人员不太容易理解和维护这样的代码。

  4. 不符合设计原则: 将线程注入到Spring容器中违反了单一职责原则和依赖倒置原则。线程应该由专门的线程管理类管理,而不应该与Spring容器耦合在一起。

因此,通常建议将需要使用Spring容器管理的Bean注入到线程中,而不是将线程注入到Spring容器中。

二、线程中使用spring的bean的方法

1、通过构造函数注入或Setter方法注入(推荐)

1.1、构造方法注入

如果你需要在线程中使用Spring的Bean,推荐通过依赖注入的方式将Bean传递到线程中。你可以通过构造函数注入或Setter方法注入,将需要的Bean传递给线程实例。这样做不仅符合Spring的依赖注入原则,还可以确保代码更易于测试和维护。

下面是一个通过依赖注入将Spring管理的Bean传递给线程的示例:

public class MyRunnable implements Runnable {
private final MyService myService; public MyRunnable(MyService myService) {
this.myService = myService;
} @Override
public void run() {
myService.performTask();
}
} // 在需要创建线程的地方使用依赖注入
@Autowired
private MyService myService; public void startThread() {
MyRunnable myRunnable = new MyRunnable(myService);
Thread thread = new Thread(myRunnable);
thread.start();
}

在这个示例中,通过构造函数将MyService注入到线程中,避免了直接从ApplicationContext获取Bean的做法。这样可以保持代码的灵活性、可测试性和可维护性。

1.2、Setter方法注入

当使用Setter方法注入时,需要在线程类中定义一个Setter方法,用于接收需要注入的Bean。以下是一个使用Setter方法注入的示例:

public class MyRunnable implements Runnable {
private MyService myService; // Setter方法用于注入MyService
public void setMyService(MyService myService) {
this.myService = myService;
} @Override
public void run() {
if (myService != null) {
myService.performTask();
} else {
throw new IllegalStateException("MyService has not been set.");
}
}
} // 在需要创建线程的地方进行Setter方法注入
@Autowired
private MyService myService; public void startThread() {
MyRunnable myRunnable = new MyRunnable();
myRunnable.setMyService(myService); // 使用Setter方法注入MyService
Thread thread = new Thread(myRunnable);
thread.start();
}

在这个示例中,MyRunnable类定义了一个setMyService方法,用于接收MyService实例。在startThread方法中,首先创建了MyRunnable实例,然后通过调用setMyService方法将MyService实例注入到线程中。这样就完成了使用Setter方法进行注入的操作。

2、Spring的getBean获取Bean,然后在线程中使用(不推荐)

可以使用Spring的ApplicationContext来获取Bean,并在线程中使用,但这种方式应该谨慎使用,并且通常不被推荐,因为它可能会带来一些潜在问题。

  1. 违背依赖注入原则: Spring推荐使用依赖注入来将Bean传递到组件中,而不是通过ApplicationContext直接获取。这种直接获取Bean的方法被称为"Service Locator"模式,这种模式会使代码耦合到Spring容器,从而降低代码的可测试性和灵活性。

  2. 不易于测试: 如果在线程中直接使用ApplicationContext获取Bean,这种代码在测试时需要模拟Spring容器,增加了测试的复杂性。

  3. 增加耦合: 线程直接获取Spring的Bean会使代码与Spring容器紧密耦合,这使得代码难以在不依赖Spring的环境中使用。

如果在某些特殊情况下确实需要在线程中获取Spring管理的Bean,请确保你在应用中正确配置了ApplicationContext,并且保证获取Bean的操作不会影响线程安全性。

在线程中使用Spring的Bean的方法、不推荐把“线程”注入到Spring的更多相关文章

  1. Spring获取bean工具类,可用于在线程里面获取bean

    Spring获取bean工具类,可用于在线程里面获取bean import java.util.Locale; import org.springframework.beans.BeansExcept ...

  2. 普通Java类获取Spring的Bean的方法

    普通Java类获取Spring的Bean的方法 在SSH集成的前提下.某些情况我们需要在Action以外的类中来获得Spring所管理的Service对象. 之前我在网上找了好几好久都没有找到合适的方 ...

  3. 普通java类获取spring容器bean的方法

    很多时候,我们在普通的java类中需要获取spring的bean来做操作,比如,在线程中,我们需要操作数据库,直接通过spring的bean中构建的service就可以完成.无需自己写链接..有时候有 ...

  4. Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)

    Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效) 前言 今天在使用Spring cache的Cacheable注解的过程中遇见了一个Cacheable注解失效的问题, ...

  5. Spring 中IOC(控制反转)&& 通过SET方式为属性注入值 && Spring表达式

    ### 1. Spring IoC IoC:Inversion of control:控制反转:在传统开发模式下,对象的创建过程和管理过程都是由开发者通过Java程序来实现的,操作权在开发者的Java ...

  6. 使用Spring实例化Bean的方法以及Bean取别名

    一.通过构造方法实例化Bean bean中加构造方法 public class Bean1 { public Bean1() { System.out.println("Bean1构造方法. ...

  7. C#学习之在辅助线程中修改UI控件----invoke方法

    Invoke and BeginInvoke 转载地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html 在Invo ...

  8. 老问题:Android子线程中更新UI的3种方法

    在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 方法一:用Handler 1.主线程中定义Handler: Handle ...

  9. 一个解决在非UI线程中访问UI 异常的小方法

    写 WPF 的童鞋可能都会碰到 在非UI线程中访问 UI 异常的问题.这是为了防止数据不一致做的安全限制. 子线程中更新UI还要交给主线程更新,引用满天飞,实在是麻烦. 接下来,我们推出一个可以称之为 ...

  10. Android子线程中更新UI的4种方法

    方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage ...

随机推荐

  1. DW:优化目标检测训练过程,更全面的正负权重计算 | CVPR 2022

    论文提出自适应的label assignment方法DW,打破了以往耦合加权的惯例.根据不同角度的一致性和非一致性指标,动态地为anchor分配独立的pos权重和neg权重,可以更全面地监督训练.此外 ...

  2. KingbaseES 配置 Hugepage

    前言 大页的作用是为了提升内存管理的效率,减少内存管理资源消耗(节省pagetable的开销),特别是对于大内存的情况,同时,由于hugepage相对与4k的页面,它更不容易被交换出内存,因此,它的作 ...

  3. ABC327 A-F

    vp on 2023.11.12 A: 使用 string 的 find,find 在找不到时会返回string::npos. B.C:略. D 发现原题相当于二分图判定. E 线性DP. F 原题相 ...

  4. 算法学习笔记【1】| LCA(最近公共祖先)

    LCA(最近公共祖先) Part 1:逐步上跳 假设u,v是所求的两点,先把深度大的点逐步上移直到深度相同. 然后两者同时上移,直到第一次遇到相同的点为止. 时间复杂度: O(n)<script ...

  5. 9 CSS背景属性

    CSS 背景属性 1. background-color(背景颜色) 页面的背景颜色有四种属性值表示,分别是transparent(透明),RGB十进制颜色表示,十六进制颜色表示和颜色单词表示. 属性 ...

  6. #博弈论#Poj 2505 A multiplication game

    题目 给你一个整数\(n\),你从1开始乘,乘2-9之间的任意一个数. 最先得到大于等于\(n\)的数的人胜利.Stan先手Ollie后手. 那么,请问给你一个数\(n\),Stan和Ollie都足够 ...

  7. 持续构建行业影响力|HarmonyOS SDK荣膺年度“技术卓越”奖项

    自2023年9月华为宣布鸿蒙原生应用全面启动以来,HarmonyOS SDK通过将HarmonyOS系统级能力对外开放,支撑开发者高效打造更纯净.更智能.更精致.更易用的鸿蒙原生应用,和开发者共同成长 ...

  8. centos部署Django二:项目上传及测试

    1. 上传项目 用 ftp 或者 sftp 上传项目到服务器. *:如果上传时,报各种错误,可以考虑下是不是服务器中文件夹权限的问题.如果是权限的问题,可以使用命令修改文件夹权限后在上传:chmod ...

  9. C++读取配置文件ini

    一.设置 ini 保存位置 // 保存到 appdata 中 LPCWSTR GetIniPath() { WCHAR buffer[MAX_PATH]; BOOL result = SHGetSpe ...

  10. MogDB/openGauss中merge的语法解析

    MogDB/openGauss 中 merge 的语法解析 近期了解学习了 MogDB/openGauss 中 merge 的使用,merge 语法是根据源表对目标表进行匹配查询,匹配成功时更新,不成 ...