在官网1.2节中对Spring容器的描述如下: The 这段话的意思主要是:
在官网中对Spring Bean描述如下: A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container. Otherwise, a bean is simply one of many objects in your application Spring Bean定义的大致意思如下:
在官网1.1节中对IOC有详细的描述,大概意思如下: IOC(控制反转)也称为依赖注入,IOC容器负责Spring Bean的创建、装配、生命周期的管理以及Bean与Bean之间的关系。在这整个过程当中,IOC容器完成了一个完整Bean的实例化,包括其依赖的Bean的实例化,那么这个依赖的Bean实例化是由IOC容器完成,而不是由开发人员去实例化的,这个过程就是IOC(控制反转)了,就是将依赖的的Bean的实例化的交由IOC容器管理和注入。 Spring官网给出了一个Spring容器工作图: 这里所说的POJO对象就是JAVA对象,配置原数据信息就是开发人员自己配置的一些Bean的信息,比如Bean是单例还是原型?是按类型加载Bean还是按名称加载Bean等等…,目前可以用xml或者注解的方式配置元数据信息。 Spring官网提供了三种实例化Bean方式,分别如下: 俗话说,不是手撸的代码是得不到它的真传的,所以现在把官网所给的Demo撸一遍,跟着Spring源码看一看每一种Bean实例化过程的内在世界。 Demo结构如图所示: 用Debug方式启动main方法,进入到getBean()方法,在 然后用Ddbug启用Main方法,进入到getBean()方法,在 instantiateUsingFactoryMethod()方法过程可以分为以下三步: 工厂实例方法可以看做是是前面两个方法的结合, -此时的MyServiceBean类的内容更改如下,注解可以更换以上三种的任意一种 然后用Ddbug启用Main方法,进入到getBean()方法,在 -此时的MyServiceBean类的内容更改如下,注解可以更换以上三种的任意一种 然后用Ddbug启用Main方法,进入到getBean()方法,在 本章主要介绍的是官网的1.1、1.2、1.3节中的内容,涉及Spring的IOC容器概念和Bean的实例化源码解析过程。但是,请注意,这个时候只是进行了Bean的实例化,此时的Bean还不是一个完整的Spring的Bean,因为它还没有走过一个完整的Spring的生命周期。 1、Spring容器是什么? 2、Spring Bean和java对象有什么区别? 3、Spring bean的实例化方式有几种? 欢迎各位关注我的JAVAERS公众号,陪你一起学习,一起成长,一起JAVA路上的诗和远方。在公众号里面都是JAVA这个世界的朋友,公众号每天会有技术类文章,面经干货,也有进阶架构的电子书籍,如Spring实战、SpringBoot实战、高性能MySQL、深入理解JVM、RabbitMQ实战、Redis设计与实现等等一些高质量书籍,关注公众号即可领取哦。 欢迎大家加入JAVA后端讨论群。
本章节主要是学习Spring官网的1.1、1.2和1.3节内容,有兴趣的同学可以跟着官网一起学习。
文章目录
1、Spring容器和IOC
1.1、Spring容器是什么?
org.springframework.context.ApplicationContext
interface represents the Spring IoC container and is responsible for instantiating, configuring, and assembling the beans.
org.springframework.context.ApplicationContext
接口的一个实例化对象1.2、Spring Bean是什么?
1.3、IOC是什么?
2、Spring容器如何实例化一个Bean
从上面的图片中可以看出,Spring容器通过POJO对象和配置的元数据信息可以产生一个充分配置的可以使用的系统。2.1、Bean的实例化
2.2、构造方法实例化Bean
2.2.1、Demo搭建
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="https://www.springframework.org/schema/beans" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="myServiceBean" class="com.spring.spring.MyServiceBean"/> </beans>
public class MyServiceBean { public MyServiceBean() { } }
2.2.2、源码分析
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
方法处打一个断点,跟着源码看一下构造方法实例化Bean的具体实现,该方法的具体内容如下,省略和这次分析无关的代码,只分析相关的代码:/** * 创建实例对象的函数 **/ protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) { // 调用无参构造方法实例化对象 return instantiateBean(beanName, mbd); } /* * 获取对象的class属性,然后利用反射获取对象的构造方法。根据构造方法实例化对象 **/ protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) { //申明对象变量 Object beanInstance; //获取当前的BeanFactory final BeanFactory parent = this; //这一步就是利用反射获取构造方法,根据构造方法实例化对象 beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent); //将实例化的对象放到BeanWrapper中 BeanWrapper bw = new BeanWrapperImpl(beanInstance); //返回已经实例化的对象 return bw; } } /** * 通过反射获取构造方法,通过构造方法实例Bean对象。 **/ public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) { // Don't override the class with CGLIB if no overrides. if (!bd.hasMethodOverrides()) { Constructor<?> constructorToUse; synchronized (bd.constructorArgumentLock) { constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod; if (constructorToUse == null) { //通过RootBeanDefinition获取对象class final Class<?> clazz = bd.getBeanClass(); //根据class利用反射获取到构造方法 constructorToUse = clazz.getDeclaredConstructor(); //将构造方法赋值给RootBeanDefinition的一个属性中去 bd.resolvedConstructorOrFactoryMethod = constructorToUse; } } //通过构造方法实例化对象,至此整个过程结束 return BeanUtils.instantiateClass(constructorToUse); } }
总结:
通过构造方法实例化Bean,可以分为三步
2.3、静态工厂方法实例化Bean
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="https://www.springframework.org/schema/beans" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="myServiceBean" class="com.spring.spring.MyServiceBean" factory-method="createInstance"/> </beans>
public class MyServiceBean { private static MyServiceBean myServiceBean = new MyServiceBean(); public static MyServiceBean createInstance() { return myServiceBean; } }
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
方法处打一个断点,静态方法实例化的源码过程如下,省略和这次分析无关的代码,只分析相关的代码:/** * 通过静态方法实例化Bean对象 **/ protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) { //获取xml配置文件中的factory-method属性,本次配置名为createInstance //调用instantiateUsingFactoryMethod()方法实例化Bean if (mbd.getFactoryMethodName() != null) { //调用类的静态方法实例化Bean return instantiateUsingFactoryMethod(beanName, mbd, args); } } /** *最终实例化方法 **/ public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, @Nullable Object factoryBean, final Method factoryMethod, Object... args) { //反射调用静态方法,获取实例化对象 //此时的factoryBean没有实例化,为Null,因为factoryMethod为静态方法 Object result = factoryMethod.invoke(factoryBean, args); return result; }
2.4、实例工厂方法实例化Bean
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="https://www.springframework.org/schema/beans" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 实例化MyServiceBean --> <bean id="myServiceBean" class="com.spring.spring.MyServiceBean"> </bean> <!-- 工厂实例的MyServiceBean对象调用createInstance()方法实例化一个Bean --> <bean id="clientService" factory-bean="myServiceBean" factory-method="createInstance"/>
public class MyServiceBean { private static MyServiceBean myServiceBean = new MyServiceBean(); public MyServiceBean createInstance() { return myServiceBean; } }
factoryBean已经实例化了
。2.5、注解实例化Bean
2.5.1、@compent、@Service、@Configuration注解实例化Bean
@Component public class MyServiceBean { }
public class TestInstantiationBean { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyServiceBean.class); MyServiceBean myServiceBean = applicationContext.getBean(MyServiceBean.class); System.out.println(myServiceBean); } }
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
方法处打一个断点,可以发现其最终也是通过无参构造函数实例化Bean的,和构造方法实例化Bean的过程完全一致,有兴趣的同学可以自行Debug验证。2.5.2、@Bean注解实例化Bean
@Configuration public class MyServiceBean { @Bean public MyServiceBean createMyServiceBean(){ return new MyServiceBean(); } }
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
方法处打一个断点,可以发现其和实例方法实例化Bean的过程完全一致
,有兴趣的同学可以自行Debug验证。3、总结
3.1、 实例化Bean的方式
4、面试
答:Spring容器是ApplicationContext接口的一个实例化对象,主要负责实例化、配置和装配Spring的Bean对象。
答:Spring bean需要经过Spring容器创建、装配并走过一个完整的Spring Bean的生命周期。java对象不一定是Spring bean,但是Spring bean一定是java对象。
答:三种。构造方法、静态方法和实例方法。
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算