一个.java文件是如何转为Spring能识别的bean

java文件在经过编译器编译后会生成.class 文件。.class文件会包含类的一些基本信息,比如类名,构造函数,属性,方法等。

.class 文件会由jvm 加载到jvm。至于这个类是如何加载到jvm的,是遵从类的加载机制:双亲委任原则。

类加载到jvm后,在spring 的环境下,会统一转为能使用的bean,并由IOC来统一管理

  • 1一些类,比如jvm自己启动需要的类会先被加载进来
  • 2一些有注解的类,比如@Controller @Service @Repository @Component 这些注解修饰的类也会被加载进来
  • 3在2加载进来的过程中,如果有注解注入的类,比如@Autowired @Resource 修饰的属性类,也会被加载到ioc

ioc会管理所有初始化后的bean。一般情况下bean 的作用域都是单例的,也有protoful 的scope ,这种情况就是每次需要一个bean 都会去new一次。

这个过程需要注意:循环引用的问题,通过使用setter注入或注解注入来解决循环引用的问题。

另一个问题就是 ioc 的底层实现,就是这么多的bean 初始化后存在哪里,是用的什么数据结构在存储很显然,就是Map

那具体就是ConcurrentHashMap,一个java bean 在spring 中是通过BeanDefinition来定义的。可以看到DefaultListableBeanFactory中有对ioc容器的声明就是一个ConcurrentHashMap。

 

相关文章

这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原...
今天小编给大家分享的是一文解析spring中事务的传播机制,相...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓...