在Spring框架中,IoC容器不仅是依赖注入的引擎,更是Bean生命周期的精密控制系统。本文将深入探讨如何定制Bean的各个阶段,并通过代码示例展示实际应用。
1. Bean生命周期定制
通过实现InitializingBean和DisposableBean接口,我们可以介入Bean的初始化和销毁阶段:
public class DatabaseService implements InitializingBean, DisposableBean {
private Connection connection;
@Override
public void afterPropertiesSet() throws Exception {
this.connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb");
System.out.println("数据库连接已建立");
}
@Override
public void destroy() throws Exception {
if (connection != null && !connection.isClosed()) {
connection.close();
System.out.println("数据库连接已关闭");
}
}
}
更现代的做法是使用注解:
@Component
public class CacheManager {
@PostConstruct
public void initCache() {
System.out.println("缓存预热完成");
}
@PreDestroy
public void clearCache() {
System.out.println("缓存已清空");
}
}
2. 作用域扩展与自定义
除了默认的单例和原型作用域,Spring支持自定义作用域:
@Configuration
public class ThreadScopeConfig implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) {
factory.registerScope("thread", new SimpleThreadScope());
}
}
@Component
@Scope("thread")
public class UserContext {
private final ThreadLocal<User> currentUser = new ThreadLocal<>();
}
3. 条件化Bean注册
通过@Conditional注解实现基于条件的Bean创建:
@Configuration
public class ConditionConfig {
@Bean
@Conditional(DevEnvironmentCondition.class)
public DataSource devDataSource() {
return new EmbeddedDatabaseBuilder().build();
}
@Bean
@Conditional(ProdEnvironmentCondition.class)
public DataSource prodDataSource() {
return new MysqlDataSource();
}
}
public class DevEnvironmentCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return "dev".equals(context.getEnvironment().getProperty("app.env"));
}
}
4. Bean后处理器深度定制
BeanPostProcessor提供了Bean初始化前后的钩子:
@Component
public class ValidationBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
if (bean instanceof Validatable) {
((Validatable) bean).validate();
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("Bean " + beanName + " 初始化完成");
return bean;
}
}
5. 综合示例:定制缓存管理器
@Configuration
@ConditionalOnProperty(name = "cache.enabled", havingValue = "true")
public class CacheConfig {
@Bean(initMethod = "init", destroyMethod = "shutdown")
@Scope("singleton")
public CacheManager cacheManager(Environment env) {
return new GuavaCacheManager(env.getProperty("cache.spec"));
}
}
public class GuavaCacheManager {
private Cache<Object, Object> cache;
public void init() {
this.cache = CacheBuilder.from(spec).build();
}
public void shutdown() {
cache.cleanUp();
}
@PostConstruct
public void logInitialization() {
System.out.println("缓存管理器初始化完成");
}
}
总结
通过精细控制Bean的生命周期、作用域和创建条件,开发者可以构建高度灵活和可维护的Spring应用。掌握这些定制技术不仅能够解决复杂业务场景下的特定需求,更能提升应用程序的性能和稳定性。
3316

被折叠的 条评论
为什么被折叠?



