spring中的bean对象的有关了解
@Configuration
public class AppConfig { @Bean
public MyBean getMyBean() {
MyBean myBean = new MyBean();
myBean.setName("Example");
return myBean;
} // 其他的@Bean方法...
}
上述是一个配置类,里面有个@Bean注解修饰,@Configuration注解的类里面的方法在Spring容器启动时并不会立即执行,而是在需要获取被@Bean注解标记的Bean实例时才会被调用。这样可以实现懒加载,只有在需要使用某个Bean时才去创建它。
如何获取到这个类呢
第一种:
@Autowired
private MyBean myBean;
第二种:
@Autowired
private ApplicationContext applicationContext;
public void someMethod() {
AppConfig appConfig= applicationContext.getBean(AppConfig.class);
MyBean myBean = appConfig.getMyBean();
// 使用获得的 MyBean 对象
}
需要注意的是默认情况下会注入同一个对象实例。这是因为被 @Bean 注解标记的方法的返回值默认是单例的,也就是说在整个应用程序的生命周期中,都会共享同一个对象实例。不管在哪个类里面调用,也都是同一个对象,
如果在任何地方重新对该对象 进行赋值,那么所有使用到这个对象的地方都会受到影响,因为它们引用的都是同一个对象实例
问题来了,当时多线程的时候,就会出现线程安全问题,对于这种线程安全问题,可以采取以下几种策略
- 使用同步机制:通过在关键代码块或方法上添加
synchronized关键字,确保同一时间只有一个线程可以进入该代码块或方法public class ThreadSafeBean {
private int count; public synchronized void increment() {
count++;
} public synchronized int getCount() {
return count;
}
}在上面的示例中,通过使用
synchronized关键字修饰increment()和getCount()方法,确保在多线程环境下对count属性的访问和操作是线程安全的 - 使用线程安全的数据结构:使用线程安全的数据结构,如
java.util.concurrent.atomic包下的原子类,可以避免使用同步机制来实现线程安全。
public class ThreadSafeBean {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
在上面的示例中,使用AtomicInteger类来替代普通的int类型,它提供了原子性操作,避免了使用synchronized关键字来实现线程安全。
- 使用线程安全的容器:使用线程安全的容器来存储和访问
Bean实例,确保多线程环境下的访问操作是线程安全的。import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import java.util.concurrent.ConcurrentHashMap; @Component
public class ThreadSafeBeanContainer {
private ConcurrentHashMap<String, ThreadSafeBean> beanMap; @Autowired
public ThreadSafeBeanContainer() {
beanMap = new ConcurrentHashMap<>();
} public void addBean(String name, ThreadSafeBean bean) {
beanMap.put(name, bean);
} public ThreadSafeBean getBean(String name) {
return beanMap.get(name);
}
}在上面的示例中,使用
ConcurrentHashMap作为线程安全的容器来存储ThreadSafeBean实例,并提供线程安全的访问方法。 - 使用线程安全的注解:Spring提供了一些线程安全的注解,例如
@Scope("prototype")将bean的作用域设置为原型模式,每次请求都会创建一个新的实例,从而避免线程安全问题。@Component
@Scope("prototype")
public class UserService {
private int count = 0; public void addUser() {
count++;
} public int getUserCount() {
return count;
}
}
spring中的bean对象的有关了解的更多相关文章
- spring中创建bean对象的三种方式以及作用范围
时间:2020/02/02 一.在spring的xml配置文件中创建bean对象的三种方式: 1.使用默认构造函数创建.在spring的配置文件中使用bean标签,配以id和class属性之后,且没有 ...
- 170630、springboot编程之普通类中调用spring管理的bean对象
我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...
- 手动获取被spring管理的bean对象工具
在netty handler开发中,我们无法将spring的依赖注入到Handler中,无法进行数据库的操作,这时候我们就需要手动获取被spring管理的bean对象: 创建一个 imp ...
- 传统javabean与spring中的bean的区别
javabean已经没人用了 springbean可以说是javabean的发展, 但已经完全不是一回事儿了 用处不同:传统javabean更多地作为值传递参数,而spring中的bean用处几乎无处 ...
- 1.2(Spring学习笔记)Spring中的Bean
一.<Bean>的属性及子元素 在1.1中我们对<Bean>有了初步的认识,了解了一些基本用法. 现在我们进一步理解<Bean>属性及子元素. 我们先来看下< ...
- Spring IOC的Bean对象
---恢复内容开始--- 在Spring IOC模块中Bean是非常重要的.在这里我想给大家讲讲关于Bean对象实例化的三种注入方式: 首先,我先讲一下关于Bean对象属性值的两种注入方式:set注入 ...
- spring 中的 bean 是线程安全的吗?
spring 中的 bean 是线程安全的吗? Spring 不保证 bean 的线程安全. 默认 spring 容器中的 bean 是单例的.当单例中存在竞态条件,即有线程安全问题.如下面的例子 计 ...
- Spring 中的bean 是线程安全的吗?
结论: 不是线程安全的 Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体sco ...
- 【Spring】Spring中的Bean - 5、Bean的装配方式(XML、注解(Annotation)、自动装配)
Bean的装配方式 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 文章目录 Bean的装配方式 基于XML的装配 基于注解 ...
- 【Spring】Spring中的Bean - 3、Bean的作用域
Bean的作用域 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 通过Spring容器创建一个Bean的实例时,不仅可以完成 ...
随机推荐
- 单表查询,多表查询,子查询---day37
1.单表查询 # ### part1 单表查询 # sql 查询语句的完整语法 '''select..from..where..group by..having..order by..limit..' ...
- 【LeetCode贪心#08】根据身高重建队列(还是涉及处理两个维度的信息)
根据身高重建队列 力扣题目链接(opens new window) 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序).每个 people[i] = [hi ...
- 【Azure 环境】IntelliJ IDEA Community Edition 2021.2.3登陆Azure账号时,无法切换到中国区
问题描述 在IntelliJ IDEA Community Edition 2021.2.3中开发Azure Function程序,最后准备部署到中国区 Azure Function中.如下,在Int ...
- [Python] 端口转发代码分享
我的魔法被公司防火墙限制了,所以我只能让我的代理流量从我自己的服务器过一遍,但是服务器上面的客户端只能允许本机使用,不能开放公网访问,所以就想到了端口转发 但是网络上面找到的端口转发工具需要各种配置, ...
- Java 多态性的使用
1 package com.bytezreo.duotai3; 2 3 /*** 4 * 5 * @Description 练习多态性的使用 6 * @author Bytezero·zhenglei ...
- 摆脱鼠标系列 - vscode 软件 最大化快捷键 - win + ↑
摆脱鼠标系列 - vscode 软件 最大化快捷键 - win + ↑ vscode默认打开不是最大化,所以按 win + 上箭头 使其最大化 不想按 F11 那个不太方便,左上角就没有项目名称了 优 ...
- 瑞云与宜宾职院开展校企合作,同深圳VR联合会共建元宇宙产业学院
2022年7月9日,宜宾职业技术学院携手深圳市虚拟现实产业联合会和深圳市瑞云科技有限公司,合作共建的"元宇宙职业教育研究与应用中心"."元宇宙产业学院"授牌仪式 ...
- C#中的For与Foreach循环:一场性能对话与实战解析
引言 在C#编程实践中,选择适当的循环结构对程序性能至关重要,尤其是在处理大量数据或追求极致运行效率时.本文将深入探讨C#中的两种主要迭代机制--传统的for循环和基于集合迭代器的foreach循环之 ...
- View事件机制源码分析
目录介绍 01.Android中事件分发顺序 02.Activity的事件分发机制 2.1 源码分析 2.2 点击事件调用顺序 2.3 得出结论 03.ViewGroup事件的分发机制 3.1 看一下 ...
- 三维模型3DTile格式轻量化在网络传输中的重要性分析
三维模型3DTile格式轻量化在网络传输中的重要性分析 三维模型3DTile格式轻量化在网络传输中扮演了至关重要的角色.随着数字化和虚拟化技术的发展,越来越多的应用需要通过网络来获取和分享大规模三维地 ...