@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 注解标记的方法的返回值默认是单例的,也就是说在整个应用程序的生命周期中,都会共享同一个对象实例。不管在哪个类里面调用,也都是同一个对象,

如果在任何地方重新对该对象 进行赋值,那么所有使用到这个对象的地方都会受到影响,因为它们引用的都是同一个对象实例

问题来了,当时多线程的时候,就会出现线程安全问题,对于这种线程安全问题,可以采取以下几种策略

  1. 使用同步机制:通过在关键代码块或方法上添加synchronized关键字,确保同一时间只有一个线程可以进入该代码块或方法

    public class ThreadSafeBean {
    private int count; public synchronized void increment() {
    count++;
    } public synchronized int getCount() {
    return count;
    }
    }

    在上面的示例中,通过使用synchronized关键字修饰increment()getCount()方法,确保在多线程环境下对count属性的访问和操作是线程安全的

  2. 使用线程安全的数据结构:使用线程安全的数据结构,如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关键字来实现线程安全。

  1. 使用线程安全的容器:使用线程安全的容器来存储和访问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实例,并提供线程安全的访问方法。

  2. 使用线程安全的注解: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对象的有关了解的更多相关文章

  1. spring中创建bean对象的三种方式以及作用范围

    时间:2020/02/02 一.在spring的xml配置文件中创建bean对象的三种方式: 1.使用默认构造函数创建.在spring的配置文件中使用bean标签,配以id和class属性之后,且没有 ...

  2. 170630、springboot编程之普通类中调用spring管理的bean对象

    我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...

  3. 手动获取被spring管理的bean对象工具

       在netty handler开发中,我们无法将spring的依赖注入到Handler中,无法进行数据库的操作,这时候我们就需要手动获取被spring管理的bean对象:    创建一个  imp ...

  4. 传统javabean与spring中的bean的区别

    javabean已经没人用了 springbean可以说是javabean的发展, 但已经完全不是一回事儿了 用处不同:传统javabean更多地作为值传递参数,而spring中的bean用处几乎无处 ...

  5. 1.2(Spring学习笔记)Spring中的Bean

    一.<Bean>的属性及子元素 在1.1中我们对<Bean>有了初步的认识,了解了一些基本用法. 现在我们进一步理解<Bean>属性及子元素. 我们先来看下< ...

  6. Spring IOC的Bean对象

    ---恢复内容开始--- 在Spring IOC模块中Bean是非常重要的.在这里我想给大家讲讲关于Bean对象实例化的三种注入方式: 首先,我先讲一下关于Bean对象属性值的两种注入方式:set注入 ...

  7. spring 中的 bean 是线程安全的吗?

    spring 中的 bean 是线程安全的吗? Spring 不保证 bean 的线程安全. 默认 spring 容器中的 bean 是单例的.当单例中存在竞态条件,即有线程安全问题.如下面的例子 计 ...

  8. Spring 中的bean 是线程安全的吗?

    结论: 不是线程安全的 Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体sco ...

  9. 【Spring】Spring中的Bean - 5、Bean的装配方式(XML、注解(Annotation)、自动装配)

    Bean的装配方式 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 文章目录 Bean的装配方式 基于XML的装配 基于注解 ...

  10. 【Spring】Spring中的Bean - 3、Bean的作用域

    Bean的作用域 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 通过Spring容器创建一个Bean的实例时,不仅可以完成 ...

随机推荐

  1. 2024-02-24:用go语言,给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1, 同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti

    2024-02-24:用go语言,给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1, 同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti ...

  2. c# rdkafka 设置偏移量(offset)

    参考资料: librdkafka: 如何设置Kafka消费者订阅消息的起始偏移位置 领导要求kafka消费者端消费最新的数据. 不知道怎么设置偏移量,查了资料. 用惯了封装好的东西,都不知道怎么设置了 ...

  3. 简单看下最近的Spring Secrurity、Spring漏洞(CVE-2024-22234、CVE-2024-22243)

    最近的这两个cve我看国内很多情报将其评为高危,所以想着去看看原理,看完发现都比较简单,利用要求的场景也相对有限(特别是第一个),所以就随便看下就行了 Spring Security 用户认证绕过(C ...

  4. java 考试易考识记题目(一)

    笔者擅长 C# 语言,4月份要考试,学习 JAVA 是为了考试罢了. 如何在最短时间内学习 JAVA 基础语法和通过考试考核呢~ 学习 JAVA ,要为了应付考试,判断.循环这部分,C.C++.C#. ...

  5. 『Echarts』基本使用

    一.前言 本篇文章是『Echarts』文章的第 2 篇,主要介绍『Echarts』基本使用 在『Echarts』第 1 篇文章中,我们介绍了 Echarts 的概述及其强大的数据可视化功能.本篇将继续 ...

  6. 谈谈在incubator-dolphinscheduler 中为啥不能及时看到python任务输出的print日志

    一.incubator-dolphinscheduler 中如何获取shell类型的节点或者python类型的节点任务的日志 1.在org.apache.dolphinscheduler.server ...

  7. Openssl命令详解 - 密钥篇

    非对称算法密钥生成和公钥提取 # ecc算法 openssl ecparam -out pri.key -name prime256v1 -genkey #生成ec密钥,国密使用-name SM2 o ...

  8. Zabbix技术分享——snmp异常排查指南

    大家好,我是乐乐.在IT运维中,难免会碰上设备snmp不通的情况,那么,当问题出现的时候,运维工程师该如何快速找到问题所在呢?下面让我们一起来看看吧!   1.IP配置检查 首先检查zabbix监控上 ...

  9. win10 有 休眠 功能,将内存保存到文件,开机10秒左右,恢复之前idea等所有软件

    休眠 休眠 休眠 重要的事情说三遍. 提示,默认不显示,需要控制面板 电源里面设置下.

  10. 后端基础SQL—数据库简介与SQL语法

    数据库简介与SQL语法 1.数据库简介 2.数据库结构 3.SQL语句 4.SQL基本语法 5.MySQL基础查询语句 6.高级查询与子查询 7.渗透测试常用函数 8.判断闭合类型 一.数据库简介 数 ...