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的实例时,不仅可以完成 ...
随机推荐
- Java常用编程类库
Java语言已经有许多非常成熟的开源基础类库,封装了日常开发中的各种常用操作,如:对象判空,字符串编码,本地缓存等等. 可以直接在项目中引入对应类库使用即可,或者参与完善相应类库的方法. 现将常用的基 ...
- RK3568开发笔记(一):瑞芯微RK3568芯片介绍,入手开发板的核心板介绍
前言 目前主流国产芯片为RV11XX.RK33XX.Hi35XX系列,本系列开启RK3568系列的技术教程笔记分享. 本篇主要介绍RK3568芯片和入手开发板的核心板详细介绍. RK3568 ...
- 文心一言 VS 讯飞星火 VS chatgpt (204)-- 算法导论15.3 3题
三.考虑矩阵链乘法问题的一个变形:目标改为最大化矩阵序列括号化方案的标量乘法运算次数,而非最小化.此问题具有最优子结构性质吗?需要写代码的时候,请用go语言. 文心一言,代码正常运行: 首先,我们要明 ...
- 【Azure Cloud Service】云服务升级后,查看配置文件发现编码变为utf-16
问题描述 通过Migrate to ARM,把经典云服务升级成云服务(外延支持)后,在查看云服务的配置XML文件,发现文件的编码格式由 UTF-8 改变为 UTF-16 由此,引发了三个问题 1)Cl ...
- 【Azure 事件中心】Event Hub 消费端出现 Timeout Exception,errorContext中 LINK_CREDIT为0的解释
问题描述 在使用Event Hub SDK消费数据过程中,出现大量的Timeout Exception,详细消息为: com.microsoft.azure.eventhubs.TimeoutExce ...
- kafka 为什么能那么快?高效读写数据,原来是这样做到的
1. 利用 Partition 实现并行处理 我们都知道 Kafka 是一个 Pub-Sub 的消息系统,无论是发布还是订阅,都要指定 Topic. Topic 只是一个逻辑的概念.每个 Topic ...
- React函数式组件使用@emotion时一定要注意的问题!
怎么说呢,一个坑,踩了两天,总觉得是useSate和input的传值方法问题 在useMemo和useCallback反复测试问题 最后没办法,通过最傻方式,一点点注释代码,发现了问题 const C ...
- MetaGPT day06 Environment组件源码 多智能体辩论
Environment 环境中通常具有一定的规则,而agent必须按照规则进行活动,MetaGPT提供了一个标准的环境组件Environment,来管理agent的活动与信息交流. MetaGPT 源 ...
- python Ai 应用开发基础训练,字符串,字典,文件
-------------------------------------- 编程能是大模型应用的天花板............................................. ...
- XAF新手入门 - 数据字典示例
前言 通过前面文章的介绍,大家应该对模块与类型信息子系统有所了解,再通过一个示例来加深大家对它的理解. 在准备写这个系列文章之前,就准备是概念+示例的组合,这样大家对概念的理解会更深刻.之前的规划是在 ...