在Spring中,Bean是指由Spring容器管理的对象,这些对象是由Spring IoC容器负责创建、组装和管理的。Bean可以是Java类的实例,也可以是其他Spring管理的组件,例如数据源、事务管理器等。
Bean的声明可以通过注解或者XML文件进行配置,这里主要使用现在流行的注解模式进行讲解
在Bean对象对应的类上添加@Component 、@Repository 、@Service、@Controller中的任意一个注解,但是要注意这几个注解一般是为了让开发人员识别Bean对象的作用,比如@Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
@Configuration
public class RedisTemplateConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
redisTemplate.setKeySerializer(RedisSerializer.string());
return redisTemplate;
}
}
常见的注入方式有@AutoWired和@Resource这两个注解
@Component
public class AnalysisController {
@Resource
private Service service1;
@Autowired
private Service service2;
}
Autowired 属于 Spring 内置的注解,默认的注入方式为byType(根据类型进行匹配),也就是说会优先根据接口类型去匹配并注入 Bean (接口的实现类)。
这会有什么问题呢? 当一个接口存在多个实现类的话,byType这种方式就无法正确注入对象了,因为这个时候 Spring 会同时找到多个满足条件的选择,默认情况下它自己不知道选择哪一个。
例如:现在容器中有两个Bean [
区别
Resource与Autowired相反,它是先byName找,如果没找到,再byType
@Scope("singleton")
public class MySingletonBean {
// ...
}
@Scope("prototype")
public class MyPrototypeBean {
// ...
}
@Scope("session")
public class MySessionBean {
// ...
}
@Scope("request")
public class MyRequestBean {
// ...
}
@Scope("globalSession")
public class MyGlobalSessionBean {
// ...
}
选择适当的作用域取决于应用的需求,通过合理配置作用域可以提高应用性能、降低资源消耗,并更好地管理Bean的生命周期。
在Spring中,Bean的线程安全问题主要涉及到在多线程环境下共享的Bean实例。Spring默认情况下,Bean是单例的,即在整个应用中只有一个实例。在多线程环境下,如果多个线程同时访问和修改这个单例Bean,就可能引发线程安全问题。
我们这里以最常用的两种作用域 prototype 和 singleton 为例介绍。几乎所有场景的 Bean 作用域都是使用默认的 singleton ,重点关注 singleton 作用域即可。
prototype 作用域下,每次获取都会创建一个新的 bean 实例,不存在资源竞争问题,所以不存在线程安全问题。singleton 作用域下,IoC 容器中只有唯一的 bean 实例,可能会存在资源竞争问题(取决于 Bean 是否有状态)。如果这个 bean 是有状态的话,那就存在线程安全问题(有状态 Bean 是指包含可变的成员变量的对象)。
不过,大部分 Bean 实际都是无状态(没有定义可变的成员变量)的(比如 Dao、Service),这种情况下, Bean 是线程安全的。
对于有状态单例 Bean 的线程安全问题,常见的有两种解决办法:
ThreadLocal 成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式)。在Spring框架中,Bean的生命周期是管理和控制对象创建、初始化、使用和销毁的全过程。理解和掌握Bean的生命周期对于使用Spring框架开发应用程序是非常重要的一部分。
Bean的生命周期管理是为了确保在对象创建、初始化、使用和销毁的过程中,Spring容器能够正确地执行各种任务,如依赖注入、初始化方法、销毁方法等。通过Bean的生命周期管理,Spring可以更好地控制对象的行为,提高系统的可维护性和灵活性。
Bean的生命周期包括以下阶段:

InitializingBean接口、@PostConstruct注解等。init-method配置、@PostConstruct注解等。InitializingBean接口、@PostConstruct注解等。DisposableBean接口、@PreDestroy注解等。destroy-method配置、@PreDestroy注解等。Bean的生命周期是Spring框架的一个重要概念,通过生命周期管理,Spring容器能够更好地控制对象的创建、初始化、使用和销毁过程。理解Bean的生命周期有助于开发者更好地利用Spring框架的特性,编写出高质量、易维护的应用程序。在实际应用中,可以通过实现特定接口、配置初始化和销毁方法、使用注解等方式来定制Bean的生命周期。
如果觉得本篇文章对于你理解Spring的Bean有帮助,可否点个小赞😺;篇幅较长建议收藏🫠;关注一手等待后续更新更多干货🚀
参考链接:https://javaguide.cn/system-design/framework/spring/spring-knowledge-and-questions-summary.html