专业的编程技术博客社区

网站首页 > 博客文章 正文

Spring源码中很重要的4个接口,贯穿Spring运行的整个生命周期

baijin 2024-08-12 13:40:18 博客文章 22 ℃ 0 评论


Spring FrameWork,这个名字本身就充满了生机与活力,仿佛春天的气息扑面而来。

它是Java开发Web服务不二之选,为企业级应用开发带来了革命性的变革。在庞大的Java生态系统中,Spring框架犹如一位智者,默默地支撑着无数的应用程序,让它们在高效、稳定的同时,也变得无比优雅。

想象一下,你正在开发一款复杂的企业级应用,面对各种繁杂的业务逻辑和数据处理,你可能会感到有些力不从心。但有了Spring,一切都变得井然有序。

它不仅提供了丰富的功能,如依赖注入、面向切面编程、事务管理等,还让你的代码更加清晰、简洁,让开发变得更加高效。

既然Spring框架如此重要,那他的核心接口也一定有其设计的奥妙之处,本文整理了我认为Spring框架最重要的五个接口。

每个接口都能做自定义扩展,借助Spring的扩展能力能你可以实现很多好用的功能。

BeanFactory

org.springframework.beans.factory.BeanFactory是Spring框架的核心接口之一,它定义了一个简单的工厂接口,用于获取Bean的实例。

在Spring中,BeanFactory负责初始化、配置和管理Bean的生命周期,并且提供了Bean的自动装配功能。

BeanFactory接口定义了几个关键的方法,其中最重要的是getBean()方法,该方法返回指定名称的Bean实例。如果Bean已经存在,则直接返回;否则,BeanFactory会根据配置信息创建一个新的Bean实例。

此外,BeanFactory还提供了其他一些方法,例如containsBean()和isSingleton()等,用于查询和管理Bean的状态。

// User类
public class User {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

// UserService类
public class UserService {
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

// Main类
public class Main {
    public static void main(String[] args) {
        // 创建BeanFactory实例
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();

        // 注册UserService为Bean
        beanFactory.registerSingleton("userService", new UserService());

        // 获取UserService实例
        UserService userService = (UserService) beanFactory.getBean("userService");

        // 获取User实例
        User user = userService.getUser();

        // 打印User实例的name属性
        System.out.println(user.getName());
    }
}

在上面的示例中,我们首先创建了两个类:User和UserService。

然后在Main类中创建了一个DefaultListableBeanFactory实例,并注册了UserService为Bean。

通过调用getBean()方法获取UserService的实例,并通过getUser()方法获取User实例,最后打印出User实例的name属性。

在这个过程中,BeanFactory负责管理和初始化Bean,而不需要我们在代码中显式地创建和管理Bean的实例。

需要注意的是,BeanFactory是一种轻量级的容器,它不支持复杂的Bean配置,如依赖注入等。对于更复杂的需求,建议使用ApplicationContext接口。

ApplicationContext

org.springframework.context.ApplicationContext是Spring 框架的一个高级接口,继承自 EnvironmentCapableListableBeanFactoryHierarchicalMessageSourceApplicationEventPublisherResourceLoaderApplicationContextAwareSmartLifecycle 接口。

ApplicationContext虽然继承自BeanFactory,但是提供了比基础的BeanFactory更多的企业级功能,ApplictionContext提供的能力如下:

  • 国际化支持:ApplicationContext 提供了一套完整的国际化支持,可以通过 MessageSource 接口获取消息资源,使得应用能够根据不同地区的文化环境显示不同的消息。
  • 事件发布机制:ApplicationContext 支持事件发布机制,允许在应用中发布事件,并且可以订阅这些事件。
  • 资源加载:ApplicationContext 允许通过统一的方式加载资源,如文件、URL等。
  • BeanFactoryPostProcessor:允许在BeanFactory初始化后,但在任何Bean实例化之前,修改BeanFactory的配置。

以下是我整理的ApplicationContext的一些Api,希望对你有帮助:

// 主要方法
- getBean(String name):根据名称获取Bean实例。
- getBean(String name, Class<T> requiredType):根据名称和类型获取Bean实例。
- containsBean(String name):检查是否存在指定名称的Bean。
- isSingleton(String name):检查指定名称的Bean是否为单例。
- getType(String name):获取指定名称的Bean的类型。
- getAliases(String name):获取指定名称的Bean的别名。

// 事件传播
- publishEvent(ApplicationEvent event):发布一个应用程序事件。
- addApplicationListener(ApplicationListener<?> listener):添加一个应用程序监听器。
- removeApplicationListener(ApplicationListener<?> listener):移除一个应用程序监听器。
- getApplicationListeners():获取所有应用程序监听器。

// 资源访问
- getResource(String path):获取指定路径的资源。
- getResourceAsStream(String path):获取指定路径的资源输入流。
- getResourceLoader():获取资源加载器对象。

// 应用程序上下文
- getApplicationName():获取应用程序名称。
- getEnvironment():获取应用程序环境信息。
- getParent():获取父应用程序上下文。

// 生命周期
- refresh():刷新应用程序上下文。
- close():关闭应用程序上下文。

DispatcherServlet

org.springframework.web.servlet.DispatcherServlet是Spring MVC框架的入口点,它是Spring MVC的核心组件之一。

每当有HTTP请求到达服务器时,DispatcherServlet就会拦截这个请求,并将其转发到相应的控制器或视图。

它充当了一个中央调度中心的角色,将请求分发到正确的处理器,并协调各个组件之间的协作。

相关源码和注释如下:

package org.springframework.web.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DispatcherServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取请求路径
        String path = request.getPathInfo();
        
        // 获取处理器映射
        HandlerMapping handlerMapping = getHandlerMapping();
        
        // 获取处理器
        Object handler = handlerMapping.getHandler(path);
        
        if (handler == null) {
            throw new ServletException("No handler found for path: " + path);
        }
        
        // 处理请求
        ModelAndView modelAndView = handleRequest(request, response, handler);
        
        // 渲染视图
        render(modelAndView, request, response);
    }

    protected ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 处理请求
        return ((HandlerAdapter) handler).handleRequest(request, response);
    }

    protected void render(ModelAndView modelAndView, HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 渲染视图
        View view = modelAndView.getView();
        view.render(modelAndView.getModel(), request, response);
    }
}

PlatformTransactionManager

PlatformTransactionManager是Spring框架中的事务管理接口,他是注解@Transactional的具体实现。

PlatformTransactionManager提供了事务管理的基本操作。它允许开发者控制事务的边界,执行事务性的操作,以及处理事务相关的异常。

以下是PlatformTransactionManager接口的部分源码:

package org.springframework.transaction;

public interface PlatformTransactionManager {

    TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;

    void commit(TransactionStatus status) throws TransactionException;

    void rollback(TransactionStatus status) throws TransactionException;

    boolean isNewTransaction() throws TransactionException;

    void setTransactionTimeout(int seconds) throws TransactionException;

    int getTransactionTimeout() throws TransactionException;
}
  • getTransaction(TransactionDefinition definition):获取一个新的 TransactionStatus 实例,该实例代表当前事务的状态。这个方法通常用于开始一个新的事务。
  • commit(TransactionStatus status):提交事务。提交事务意味着所有在事务中所做的更改都会被持久化到数据库中。
  • rollback(TransactionStatus status):回滚事务。如果在事务执行过程中出现异常,可以通过此方法撤销所有变更,使数据库状态回到事务开始之前。
  • isNewTransaction():判断当前线程是否是一个新的事务。
  • setTransactionTimeout(int seconds):设置事务超时时间(秒)。如果事务在这段时间内没有完成,则自动回滚。
  • getTransactionTimeout():获取当前事务的超时时间(秒)。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表