Spring生态的核心思想

发布于:2025-05-23 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、Spring Framework

1. IoC容器:依赖管理

        Spring的核心是控制反转(IoC),它通过容器管理对象的生命周期和依赖关系。以ApplicationContext为例,其初始化过程涉及Bean定义的加载、解析和实例化:

// Bean定义加载过程
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(AppConfig.class); // 注册配置类
context.refresh(); // 触发BeanFactory的初始化
UserService userService = context.getBean(UserService.class); // 获取Bean

refresh()方法调用AbstractApplicationContext中的obtainFreshBeanFactory(),触发BeanFactory的创建,随后通过BeanPostProcessor对Bean进行增强。

        在Spring框架中,BeanPostProcessor是用于干预Bean创建过程的核心接口。其增强机制主要体现在两个关键阶段:

  1. 初始化前增强 通过实现postProcessBeforeInitialization方法,在Bean的以下生命周期节点介入:
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        // 可在此处修改Bean属性值
        if(bean instanceof MyService) {
            ((MyService)bean).setConfig(defaultConfig);
        }
        return bean;
    }
     
    

  2. 初始化后增强 通过postProcessAfterInitialization方法,在Bean完成初始化后进行处理。典型应用是创建AOP代理:
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        if(bean.getClass().isAnnotationPresent(Transactional.class)) {
            return Proxy.newProxyInstance(...); // 生成事务代理
        }
        return bean;
    }
     
    

2. AOP:面向切面

        AOP通过动态代理实现日志、事务等通用逻辑的横向切入。以下是一个JDK动态代理的简化实现:

public class JdkDynamicProxy implements InvocationHandler {
    private Object target;
    public JdkDynamicProxy(Object target) { this.target = target; }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before method: " + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("After method: " + method.getName());
        return result;
    }
}
// 使用代理
UserService proxy = (UserService) Proxy.newProxyInstance(
    UserService.class.getClassLoader(),
    new Class[]{UserService.class},
    new JdkDynamicProxy(new UserServiceImpl())
);

AOP的本质是分离,使得业务逻辑与系统服务(如事务)解耦。

3. 数据访问与事务管理

        Spring通过JdbcTemplate简化JDBC操作,其核心在于模板方法模式的应用:

public class JdbcTemplate {
    public <T> T query(String sql, ResultSetExtractor<T> extractor) {
        Connection con = DataSourceUtils.getConnection(dataSource);
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        return extractor.extractData(rs); // 回调处理结果集
    }
}

        事务管理则通过@Transactional注解与AOP结合,利用事务拦截器在方法调用前后开启/提交事务。

二、Spring Boot:约定大于配置

1. 自动装配:条件化Bean加载

        Spring Boot的自动装配基于@Conditional注解族实现。以DataSourceAutoConfiguration为例:

@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class}) // 类路径存在时生效
@EnableConfigurationProperties(DataSourceProperties.class) // 绑定配置
public class DataSourceAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean // 当用户未自定义DataSource时生效
    public DataSource dataSource(DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().build();
    }
}

启动流程SpringApplication.run()触发SpringFactoriesLoader加载META-INF/spring.factories中的自动配置类,通过条件判断决定是否生效。


    网站公告

    今日签到

    点亮在社区的每一天
    去签到