@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. 掌握云容器网络:何为ipvs

    本文分享自华为云社区<[理解云容器网络]2-基础篇-ipvs介绍>,作者: 可以交个朋友. IPVS简介 ipvs是工作在Linux内核态的4层负载均衡:和用户态的负载均衡软件(如ngin ...

  2. C++ 多线程的错误和如何避免(10)

    线程中的异常可以使用 std::rethrow_exception 抛给主线程 问题分析:一个线程中抛出的异常是没法被另一个线程捕获的.假如我们在主线程中创建一个子线程,子线程中的函数抛出了异常,主线 ...

  3. CSDN的Markdown编辑器使用说明

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...

  4. 案例分享:Qt出版社书籍配套U盘资源播放器软件定制(脚本关联播放器与资源文件,播放器,兼容win7,win10和mac)

    红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术.树莓派.三维.OpenCV.OpenGL.ffmpeg.OSG.单片机.软硬结合等等)持续更新中-(点击传送门) 合作案例专栏:案例分享(体 ...

  5. 【LeetCode字符串#04】左旋转字符串,以及反转函数使用说明

    左旋转字符串 力扣题目链接(opens new window) 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"a ...

  6. 私有git服务器搭建-gitlib版

    目录 环境 centos6.5 这里有官网安装地址教程: 这里有机器配置安装需求 CPU Memory 安装步骤 安装配置依赖项 添加GitLab仓库,并安装到服务器上 启动GitLab 配置 git ...

  7. 如何使用 perf 分析 splice 中 pipe 的容量变化

    如何使用 perf 分析 splice 中 pipe 的容量变化 这个文章为了填上一篇文章的坑的,跟踪内核函数本来是准备使用 ebpf 的,但是涉及到了低内核版本,只能使用 kprobe 了. 恰好, ...

  8. C++ STL 容器-Vector类型

    C++ STL 容器-Vector类型 std::vector是C++标准库中的一个动态数组容器,它提供了随机访问迭代器,因此你可以像使用普通数组一样使用vector. vector容器可以动态地增长 ...

  9. Java实现对ES数据的新增,删除,修改,及合并

    Java实现对ES数据的新增,删除,修改,及合并 新增数据 代码: @Autowired private RestHighLevelClient client; /** * @description ...

  10. leetcode数据库sql之Department Top Three Salaries

    leetcode原文引用: How would you print just the 10th line of a file? For example, assume that file.txt ha ...