spring容器里存取bean

spring容器里存取bean

spring容器存取bean的过程是什么?
Map中是怎么存放值的?

首先 , 先把各个对象码出来,把过程搭建好

1 . 建配置类 , 为这个类配置了一个包扫描 , 代码如下:
@ComponentScan(
value=“com.db”,excludeFilters=
// 过滤掉@Controller.class, @ControllerAdvice.class描述的类
{@Filter(type=FilterType.ANNOTATION,classes={Controller.class, ControllerAdvice.class})})
public class AppRootConfig {

}

2 . 在这个 com.db 包下新建一个类
@Lazy
@Component
public class LruCache {

}

3 . 测试
//用AppRootConfig 配置类初始化spring容器
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(AppRootConfig.class);
@Test
public void testLruCache(){
LruCache lruCache=
ctx.getBean(“lruCache”,LruCache.class);
System.out.println(lruCache); // com.db.common.cache.LruCache@1c27493
}

从 1 中可以看到, 我们用注解的方式配置了一个"包扫描", @ComponentScan 就类似于我们xml文件中的
<context:component-scan base-package=“com.db”>
<context:include-filter type=“annotation” expression=""/>
<context:exclude-filter type=“annotation” expression=“Controller.class, ControllerAdvice.class”/>
</context:component-scan>

初始化spring容器的时候,会读取AppRootConfig.class这个配置类 , 执行包扫描 , 把符合条件的类 , 比如:LruCache ,存到spring容器的Map集合中 , 当我们调用的时候 , 它就会从spring容器底层创建一个bean给我们

从 2 可以看出,我们是用了懒加载的 , 当配置类扫描到类的时候 , 会把这个类的描述信息, 以包名加类名的方式存到一个Map中,
Map<String,BeanDefinition> , 其中 Spring 是Key , 默认是类名首字母小写 , BeanDefinition , 存的是类的定义(描述信息) , 我们通常叫BeanDefinition接口为 : bean的定义对象
这是底层的源码:在这里插入图片描述

在这里插入图片描述
这就是第一个Map , 如果没有用懒加载 , spring容器底层会自动基于第一个Map中的数据创建bean给第二个Map封装起来,当外部调用这个bean时, 第二个Map会根据给出的键来找对应的bean , 把bean给出, 但是这种方式在数据量多的时候极其消耗内存

所以一般采用懒加载的方式 @Lazy, 这种方式的好处是 , spring容器底层不会自动创建bean, 而是当外部调用这个bean时创建, 走一遍过程, 这样不会浪费内存 .
下面是第二个Map的源代码:
在这里插入图片描述
singleton 是bean的作用域, bean 默认是单例
从源码可以看出, 第二个Map里面是存储的bean的实例

猜你喜欢

转载自blog.csdn.net/weixin_43532718/article/details/84452401