两种生成bean的方式
- @ComponentScan
适用场景:适用于扫描同一个项目或包内的类,直接且简单。通过 @ComponentScan,Spring 可以扫描指定包及其子包中的类,并将其注册为 Spring 容器中的 Bean。
功能:通过注解(如 @Component、@Service、@Repository 等)来标识需要注册到 Spring 容器的类。然后,Spring 会在启动时扫描这些类并自动注册它们。
优点:简单直接,可以快速注册 Bean,适用于简单项目或较小的应用场景。
限制:无法与 Spring Boot 的自动配置机制完全兼容。对于大型应用或模块化系统,可能需要更复杂的自动配置机制。 - spring.factories
适用场景:这是 Spring Boot 推荐的自动配置机制,尤其适用于提供自动配置功能的模块或库。它通过 spring.factories 文件来注册自动配置类,可以根据不同条件加载和配置 Bean。
功能:通过 spring.factories 文件,Spring Boot 可以在启动时自动加载和配置相关的 Bean。自动配置类通常是条件化的(通过 @Conditional 注解),意味着只有满足特定条件时,自动配置才会被激活。
优点:
灵活性高:能够根据不同环境或条件判断是否加载配置。
与 Spring Boot 完全兼容:这是 Spring Boot 的核心配置方式,适合构建模块化、可扩展的应用。
解耦性:模块可以提供自动配置,而不需要修改应用的启动类。
适用场景:特别适用于希望提供自动配置的第三方库、插件或者模块。
总结:
@ComponentScan 适用于简单场景、项目内部的 Bean 注册,方便直接,但不适合复杂的自动配置场景。
spring.factories 更适合复杂的自动配置和条件加载,尤其是 Spring Boot 中的自动配置,提供更高的灵活性和解耦性。
两者都可以用来注册 Bean,但 spring.factories 更适合需要条件加载和自动配置的场景,而 @ComponentScan 更适合常规的 Bean 注册。
比如RedisTemplate,在我的项目中是直接自动注入的,因为是spring自动装配的这个bean,但是我也可以用@configuration和@bean注解来自定义配置这个bean
自动装配 RedisTemplate
如果使用的是 Spring Boot 并且依赖了 spring-boot-starter-data-redis
,RedisTemplate
会自动装配到你的项目中。Spring Boot 会根据你在 application.properties
或 application.yml
中的配置来自动配置 RedisTemplate
。你只需注入并使用它:
java复制代码@Autowired
private RedisTemplate<String, Object> redisTemplate;
这里,Spring Boot 自动配置了 RedisTemplate
,并根据 spring.redis.*
配置项自动填充其参数(如连接工厂等)。
自定义配置 RedisTemplate
如果你需要自定义 RedisTemplate
,比如自定义序列化方式、连接池配置等,你可以使用 @Configuration
和 @Bean
注解来手动配置:
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 自定义序列化方式(例如:JSON 序列化)template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));template.setKeySerializer(new StringRedisSerializer());return template;}
}
在这个自定义配置中,你可以指定自定义的 序列化器(比如使用 Jackson2JsonRedisSerializer
来将对象转换为 JSON)和其他 RedisTemplate
的细节配置。