Spring原理解析

AbstractXmlApplicationContext.class -> AbstractApplicationContext.class -> DefaultResourceLoader.class

1.容器初始化,主要完成了ioc容器建立beanDefinition数据映射。并没有看到ioc容器对bean依赖关系进行注入。

AbstractApplicationContext.refresh()  -> 
	.obtainFreshBeanFactory() -> AbstractRefreshableApplicationContext.refreshBeanFactory() ->
AbstractXmlApplicationContext.loadBeanDefinitions(beanFactory) ->
	.loadBeanDefinitions(beanDefinitionReader) ->
XmlBeanDefinitionReader.loadBeanDefinitions(configResources)	

2.IOC容器依赖注入

AbstractBeanFactory.doGetBean(name,...)  ->
AbstractAutowireCapableBeanFactory.createBean(beanName)

3.Spring生命周期
00–>MyLifeCycleBean 构造函数

----initializeBean -> invokeAwareMethods【setBeanName、setBeanClassLoader、setBeanFactory】-----
01–>BeanNameAware接口被调用了, 获取到的beanName:xmlmyLifeCycleBean
02–>BeanFactoryAware接口被调用了

----initializeBean -> invokeAwareInterfaces【setEnvironment、setEmbeddedValueResolver、setResourceLoader、setApplicationEventPublisher、setMessageSource、setApplicationContext】-----
03–>ApplicationContextAware接口被调用了

----initializeBean -> postProcessBeforeInitialization-----
04–>调用postProcessBeforeInitialization方法, 获取到的beanName: xmlMyLifeCycleBean

----initializeBean -> afterPropertiesSet -----
05–>InitializingBean接口被调用了

06–>myInit方法被调用了

----initializeBean -> postProcessAfterInitialization-----
07–>调用postProcessAfterInitialization, 获取到的beanName: xmlmyLifeCycleBean

08–>bean可以被使用了, beanInfo: MyLifeCycleBean{name=‘张三’, age=25}

MyLifeCycleBeanTest.class

package linag.test.spring;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyLifeCycleBeanTest {
    @Before("")
    public void before() {
        System.out.println("---bean生命周期开始---\n");
    }

    @After("")
    public void after() {
        System.out.println("\n---bean生命周期结束---");
    }

    /**
     * 生命周期测试
     */
    @Test
    public void testDefaultConstructor() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        MyLifeCycleBean myLifeCycleBean = applicationContext.getBean(MyLifeCycleBean.class);
        System.out.println("08-->bean可以被使用了, beanInfo: " + myLifeCycleBean.toString());
        ((ClassPathXmlApplicationContext) applicationContext).destroy();
    }
}

MyBeanPostProcessor.class

package linag.test.spring;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if(!(bean instanceof  MyLifeCycleBean)) {
            return bean;
        }
        System.out.println("04-->调用postProcessBeforeInitialization方法, 获取到的beanName: " + beanName);
        ((MyLifeCycleBean) bean).setName("李四");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if(!(bean instanceof  MyLifeCycleBean)) {
            return bean;
        }
        System.out.println("07-->调用postProcessAfterInitialization, 获取到的beanName: " + beanName);
        ((MyLifeCycleBean) bean).setAge(30);
        return bean;
    }

}

MyLifeCycleBean.class

package linag.test.spring;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;


public class MyLifeCycleBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean,
    DisposableBean {

    // 姓名
    private String name;
    // 年龄
    private int age;

    public MyLifeCycleBean() {
        System.out.println("00-->MyLifeCycleBean 构造函数");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("01-->BeanNameAware接口被调用了, 获取到的beanName:" + name);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("02-->BeanFactoryAware接口被调用了");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("03-->ApplicationContextAware接口被调用了");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("05-->InitializingBean接口被调用了");

    }

    public void myInit() {
        System.out.println("06-->myInit方法被调用了");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("09-->DisposableBean接口被调用了");
    }

    public void myDestroy() {
        System.out.println("10-->自定义destroy-method方法被调动了");
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "MyLifeCycleBean{" + "name='" + name + '\'' + ", age=" + age + '}';
    }
}

applicationContext.xml

   <bean name="xmlmyLifeCycleBean" class="linag.test.spring.MyLifeCycleBean" destroy-method="myDestroy"
          init-method="myInit">
        <property name="name" value="张三"/>
        <property name="age" value="25"/>
    </bean>
内容概要:本文档为《400_IB Specification Vol 2-Release-2.0-Final-2025-07-31.pdf》,主要描述了InfiniBand架构2.0版本的物理层规范。文档详细规定了链路初始化、配置与训练流程,包括但不限于传输序列(TS1、TS2、TS3)、链路去偏斜、波特率、前向纠错(FEC)支持、链路速度协商及扩展速度选项等。此外,还介绍了链路状态机的不同状态(如禁用、轮询、配置等),以及各状态下应遵循的规则和命令。针对不同数据速率(从SDR到XDR)的链路格式化规则也有详细说明,确保数据包格式和控制符号在多条物理通道上的一致性和正确性。文档还涵盖了链路性能监控和错误检测机制。 适用人群:适用于从事网络硬件设计、开发及维护的技术人员,尤其是那些需要深入了解InfiniBand物理层细节的专业人士。 使用场景及目标:① 设计和实现支持多种数据速率和编码方式的InfiniBand设备;② 开发链路初始化和训练算法,确保链路两端设备能够正确配置并优化通信质量;③ 实现链路性能监控和错误检测,提高系统的可靠性和稳定性。 其他说明:本文档属于InfiniBand贸易协会所有,为专有信息,仅供内部参考和技术交流使用。文档内容详尽,对于理解和实施InfiniBand接口具有重要指导意义。读者应结合相关背景资料进行学习,以确保正确理解和应用规范中的各项技术要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值