Spring启动过程是Java面试经常被考的问题,下面我就来详解6大Spring启动过程@mikechen
1.加载
在这个阶段,Spring会扫描应用程序上下文中的所有类和配置文件,并通过Java的反射机制来加载它们。
Spring支持多种类型的Spring配置文件,包括XML文件、JavaConfig文件、注解等。
通常情况下,Spring会扫描classpath下的所有类和配置文件,然后将它们加载到内存中。
比如:通过ClassPathXmlApplicationContext来加载XML配置文件中的Bean:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
2.实例化
在加载完成之后,Spring会将所有Bean实例化,并将它们放入Bean容器中,这个容器会负责管理这些Bean的生命周期和依赖关系。
在实例化过程中,Spring会使用Java的反射机制来创建Bean的实例,并自动注入它们所需要的依赖关系。
这些依赖关系可以通过构造函数注入、Setter方法注入、字段注入等方式来实现。
如下所示:
<bean id="userService" class="com.example.UserService"> <constructor-arg ref="userDao" /> </bean> <bean id="userDao" class="com.example.UserDao" />
定义一个名为”userService”的Bean,并通过构造函数注入一个名为”userDao”的依赖。
3.配置
在这个阶段,Spring会对所有的Bean进行配置,这包括设置属性、调用初始化方法等。
Spring提供了多种方式来配置Bean,包括XML配置、JavaConfig配置、注解等,其中,XML配置是最常用的方式之一。
4.初始化
在配置完成之后,Spring会调用所有Bean的初始化方法,这些方法可以在Bean的定义中通过init-method属性来指定。
如下所示:
public class UserService { private void init() { // do initialization } } <bean id="userService" class="com.example.UserService" init-method="init"> <constructor-arg ref="userDao" /> <property name="logger" ref="logger" /> </bean>
在初始化方法中,Bean可以完成一些必要的初始化操作,例如:打开数据库连接、加载资源文件等。
5.后置处理
在这个阶段,Spring会对所有Bean进行后置处理,这包括:添加拦截器、代理等。
后置处理可以在Bean的定义中通过BeanPostProcessor接口来实现,通过实现这个接口,可以在Bean初始化前后进行一些额外的处理。
如下所示:
public class CustomBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // do something before initialization return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { // do something after initialization return bean; } } <bean id="customBeanPostProcessor" class="com.example.CustomBeanPostProcessor" />
Spring配置文件中定义一个实现BeanPostProcessor接口的类,并将其注册到Bean容器中。
6.就绪
在所有的初始化和后置处理都完成之后,Spring就可以将应用程序上下文视为已就绪,可以接受请求了。
UserService userService = context.getBean("userService", UserService.class); userService.doSomething();
以上就是Spring启动过程详解,更多Spring内容请查看:Spring教程(史上最全图文详解)
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》