张治峰的博客

Spring容器及Spring Bean

2019-12-01

Spring容器

什么是容器

官网解释

The org.springframework.context.ApplicationContext interface represents the Spring IoC container and is responsible for instantiating, configuring, and assembling the beans.

翻译内容:
1.Spring IOC容器就是一个org.springframework.context.ApplicationContext的实例化对象
2.容器负责了实例化,配置以及装配一个bean

总结:

  • 代码层面:Spring容器是实现了ApplicationContext接口的对象。
  • 功能层面:Spring容器是Spring框架的核心,作用是管理对象。容器会创建对象,连接对象,并管理它们整个生命周期(创建到销毁).

容器如何工作

官网介绍

Spring容器通过我们提交的POJO对象以及配置元数据产生一个充分配置的可以使用的系统。这里说的配置元数据,实际上我们就是我们提供的XML配置文件,或者通过注解方式提供的一些配置信息

Spring Bean

实例化bean

构造器创建

1.无参构造器
使用空构造器进行定义,使用此种方式,class属性指定的类必须有空构造器

<bean name="people" class="com.zzf.entity.People">
</bean>

2.有参构造器
使用标签指定构造器参数值,其中index表示位置,value表示常量值,也可以指定引用,指定引用使用ref来引用另一个Bean定义.

<bean name="people2" class="com.zzf.entity.People">
<constructor-arg index="0" value="zzf"></constructor-arg>
<constructor-arg index="1" value="18"></constructor-arg>
<constructor-arg index="2" ref="collection"></constructor-arg>
</bean>

静态工厂方法创建

public class People{
private String name;
private Integer age;
//getter setter 方法省略....
}
public class PeopleFactoty{
public static People newInstance(){
return new People();
}
}
<bean name="people3" class="com.zzf.factory.PeopleFactory" 
factory-method="newInstance">
</bean>

实例工厂方法创建

public class People{
private String name;
private Integer age;
//getter setter 方法省略....
}
public class PeopleFactoty1{
public People newInstance(){
return new People();
}
}
<bean name="peopleFactoty1" class="com.zzf.factory.PeopleFactoty1">
</bean>
<bean name="people3" factory-bean="peopleFactoty1"
factory-method="newInstance">
</bean>

源码查看

1.实例化容器

public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
People people = applicationContext.getBean(People.class);
}

2.org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
断点调试
3.源码分析

/**
* 实例化bean
* @param beanName
* @param mbd
* @param args
* @return
*/
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {

//获取这个bean的class属性,确保beanDefinition中beanClass属性已经完成解析
Class<?> beanClass = resolveBeanClass(mbd, beanName);
//对象是否可以创建异常判断
if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
}
// 通过FactoryMethod实例化这个bean
if (mbd.getFactoryMethodName() != null) {
return instantiateUsingFactoryMethod(beanName, mbd, args);
}

//这段代码都是在通过构造函数实例化这个Bean,分两种情况,
//一种是通过默认的无参构造,
//一种是通过推断出来的构造函数
boolean resolved = false;
boolean autowireNecessary = false;
if (args == null) {
synchronized (mbd.constructorArgumentLock) {
if (mbd.resolvedConstructorOrFactoryMethod != null) {
resolved = true;
autowireNecessary = mbd.constructorArgumentsResolved;
}
}
}
if (resolved) {
if (autowireNecessary) {
return autowireConstructor(beanName, mbd, null, null);
}
else {
return instantiateBean(beanName, mbd);
}
}

// 推断合适的构造方法集合
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null ||
mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
return autowireConstructor(beanName, mbd, ctors, args);
}

// 没有特殊处理默认使用无参构造器创建
return instantiateBean(beanName, mbd);
}
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章