spring的三级缓存如何解决循环依赖

什么是循环依赖? 官方解释 虽然官方提倡使用构造方法来依赖注入,但是构造方法解决不了循环依赖,可以使用setter方法来解决。 个人理解 a对象持有b对象的引用,b对象持有a对象的引用。这样说好像察觉不到问题,可以试想下当我们自己创建a对象时,是不是先要调用a对象的构造方法,然后再进行属性的填充,这才是一个完整的a对象,但是当调用对象a的构造方法后,发现需要先拿到完整的b对象,则需要先完成b对象的创建,然后调用b对象的构造方法,b对象进行属性填充时,发现需要a对象,然后无限的循环下去。。。 ...

August 17, 2023 · 3 min

springBean了解

springBean了解 1. 定义springBean 2. Beandefinition 元信息 3. 命名spring bean 4. spring bean的别名 5. 注册spring Beandefinition 注册BeanDefinition 方式 1. xml <beans> <description>ggBall的bean工厂</description> <import resource="textBean.xml"/> <alias name="veryComplexDomain" alias="vcd"/> <bean id="user" class="com.zhu.entity.User" > <constructor-arg index="0"> <ref bean="son"/> </constructor-arg> </bean> <bean id="son" class="com.zhu.entity.Son"> <property name="id" value="1"/> <property name="name" value="小名"/> </bean> </beans> 2. 注解 (@Bean,@Component,@Import) @Configuration @Import(User.class) public class Config { @Bean public User user(){ return new User(); } @Bean public Son son() { return new Son(); } } 3. java Api BeanDefinitionRegistry#registerBeanDefinition /** * 命名方式 注册BeanDefinition * registry.registerBeanDefinition(beanName,beanDefinition); * @param registry * @param beanName * @param classBean */ public static void registerBeanDefinition(BeanDefinitionRegistry registry,String beanName,Class classBean) { BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(classBean); definitionBuilder.addPropertyValue("name","xxx") .addPropertyValue("id","1"); AbstractBeanDefinition beanDefinition = definitionBuilder.getBeanDefinition(); registry.registerBeanDefinition(beanName,beanDefinition); } BeanDefinitionReaderUtils#registerWithGeneratedName /** * 非命名方式 注册BeanDefinition * BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition,registry); * @param registry * @param classBean */ public static void registerBeanDefinition(BeanDefinitionRegistry registry,Class classBean) { BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(classBean); definitionBuilder.addPropertyValue("name","xxx_1") .addPropertyValue("id","1"); AbstractBeanDefinition beanDefinition = definitionBuilder.getBeanDefinition(); BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition,registry); } 6. 实例化spring bean 我个人理解bean的元信息是Bean初始化时所需要的配置参数。 ...

April 19, 2022 · 3 min

spring的配置信息

spring的配置信息 当bean注入BeanFactory和ApplicationContext,分析依赖对象的来源,是否是ioc容器内的Bean? ...

April 14, 2022 · 1 min

spring管理bean之间的协同方式

spring管理bean互相协同的方式 Dependency Injection(依赖注入) Constructor-based Dependency Injection(构造方法注入) Autowired注入 xml配置 Setter-based Dependency Injection(set方法注入) Autowired注入 xml配置 Method Injection(方法注入,通过代理方式注入) 通过applcationContext容器获取bean注入 Lookup Method Injection(通过@LookUp注解注入) Arbitrary Method Replacement(xml配置replace method)

March 30, 2022 · 1 min

Bean的生命周期

Bean的生命周期的完全实现需要两个阶段 容器的启动 bean的实例化过程(涵盖了bean生命周期的大部分) 容器启动阶段 重点是收集到元信息配置信息,即创建bean需要的信息(beanDefinition) 通过BeanDefinitionReader,读取到beanDefinition信息,再通过beanDefinitionRegistry,将BeanDefinition注册到其里面 // 这是 PropertiesBeanDefinitionReader 把从properties文件读取到的配置信息, // 通过 BeanDefinitionRegistry 注册 BeanDefinition的过程 AbstractBeanDefinition bd = BeanDefinitionReaderUtils.createBeanDefinition( parent, className, getBeanClassLoader()); bd.setScope(scope); // 作用域 默认singleton bd.setAbstract(isAbstract); // 是否是抽象 默认false 如果是抽象的,容器不会实例化bean,而是将beanDefinition信息作为其子类使用 bd.setLazyInit(lazyInit); // 懒加载 默认false 如果是false,容器一启动就会加载bean bd.setConstructorArgumentValues(cas); // 构造参数 bd.setPropertyValues(pvs); // 属性信息 getRegistry().registerBeanDefinition(beanName, bd); // 注册Beandefinition BeanDefinitionReader 有多种,包括: ...

March 28, 2022 · 7 min
总访问量 总访客数