`

spring4.0源码分析━━━(AbstractBeanDefinition类)

 
阅读更多

上一篇有讲解析xml,其中有说道BeanDefinition,但是不够详细。AbstractBeanDefinition是spring配置文件bean标签的实现,了解这个类很关键。源代码如下:

 

public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
		implements BeanDefinition, Cloneable {

	/**
	 * Constant for the default scope name: "", equivalent to singleton status
	 * but to be overridden from a parent bean definition (if applicable).
	 */
	public static final String SCOPE_DEFAULT = "";


	/**
	 * Constant that indicates no autowiring at all.
	 * @see #setAutowireMode
	 */
	public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO;

	/**
	 * Constant that indicates autowiring bean properties by name.
	 * @see #setAutowireMode
	 */
	public static final int AUTOWIRE_BY_NAME = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;

	/**
	 * Constant that indicates autowiring bean properties by type.
	 * @see #setAutowireMode
	 */
	public static final int AUTOWIRE_BY_TYPE = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;

	/**
	 * Constant that indicates autowiring a constructor.
	 * @see #setAutowireMode
	 */
	public static final int AUTOWIRE_CONSTRUCTOR = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR;

	/**
	 * Constant that indicates determining an appropriate autowire strategy
	 * through introspection of the bean class.
	 * @see #setAutowireMode
	 * @deprecated as of Spring 3.0: If you are using mixed autowiring strategies,
	 * use annotation-based autowiring for clearer demarcation of autowiring needs.
	 */
	@Deprecated
	public static final int AUTOWIRE_AUTODETECT = AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT;


	/**
	 * Constant that indicates no dependency check at all.
	 * @see #setDependencyCheck
	 */
	public static final int DEPENDENCY_CHECK_NONE = 0;

	/**
	 * Constant that indicates dependency checking for object references.
	 * @see #setDependencyCheck
	 */
	public static final int DEPENDENCY_CHECK_OBJECTS = 1;

	/**
	 * Constant that indicates dependency checking for "simple" properties.
	 * @see #setDependencyCheck
	 * @see org.springframework.beans.BeanUtils#isSimpleProperty
	 */
	public static final int DEPENDENCY_CHECK_SIMPLE = 2;

	/**
	 * Constant that indicates dependency checking for all properties
	 * (object references as well as "simple" properties).
	 * @see #setDependencyCheck
	 */
	public static final int DEPENDENCY_CHECK_ALL = 3;


	private volatile Object beanClass;

	private String scope = SCOPE_DEFAULT;

	private boolean singleton = true;

	private boolean prototype = false;

	private boolean abstractFlag = false;

	private boolean lazyInit = false;

	private int autowireMode = AUTOWIRE_NO;

	private int dependencyCheck = DEPENDENCY_CHECK_NONE;

	private String[] dependsOn;

	private boolean autowireCandidate = true;

	private boolean primary = false;

	private final Map<String, AutowireCandidateQualifier> qualifiers =
			new LinkedHashMap<String, AutowireCandidateQualifier>(0);

	private boolean nonPublicAccessAllowed = true;

	private boolean lenientConstructorResolution = true;

	private ConstructorArgumentValues constructorArgumentValues;

	private MutablePropertyValues propertyValues;

	private MethodOverrides methodOverrides = new MethodOverrides();

	private String factoryBeanName;

	private String factoryMethodName;

	private String initMethodName;

	private String destroyMethodName;

	private boolean enforceInitMethod = true;

	private boolean enforceDestroyMethod = true;

	private boolean synthetic = false;

	private int role = BeanDefinition.ROLE_APPLICATION;

	private String description;

	private Resource resource;

。。。。。。。。。

}

 

         可以看到上面很多是不是都很面熟。其中的singleton,prototype等这些。这些其实就是配置文件中bean可以有的属性,但是singleton和prototype只是对应scope而已,并且其中很多是有默认值的,像autowireMode默认为不自动装配,lazyinit为false。还有一个synthetic,意思为合成,用户配置的都是bean默认都为false。但是spring启动的时候会自己创建一些bean加入到容器中(会在AOP讲解中详细说明),如果是spring的一般会设置为true了。BeanDefinition中两个重要的属性为ConstructorArgumentValues和MutablePropertyValues。其中我们知道spring有通过默认的构造函数创建bean,用户也可以指定构造器来实例化bean。这里的ConstructorArgumentValues就是构造函数事用到的。这里参照下面的测试类代码说明:

public class Model1 {
	private int age;
	private String sex;
	private String name;
	
	public void init(){
		System.out.println("init");
	}
	
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	public Model1(){
		
	}
	
	public Model1(int age, String sex, String name) {
		super();
		this.age = age;
		this.sex = sex;
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "Model1 [age=" + age + ", sex=" + sex + ", name=" + name + "]";
	}
}

@Test
public void testSpringBeanDefinitionConstructorArgumentValues(){
		AbstractBeanDefinition beanDefinition = new GenericBeanDefinition();
		beanDefinition.setBeanClass(Model1.class);
		beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(new ConstructorArgumentValues.ValueHolder(21));
		beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(new ConstructorArgumentValues.ValueHolder("female"));
		beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(new ConstructorArgumentValues.ValueHolder("C++"));
		RootBeanDefinition mbd = new RootBeanDefinition(beanDefinition);
		mbd.setScope("prototype");
		mbd.setInitMethodName("init");
		BeanDefinitionRegistry reg=new DefaultListableBeanFactory();  
		reg.registerBeanDefinition("model", mbd);  
		BeanFactory factory=(BeanFactory)reg;  
		Model1 model1=(Model1)factory.getBean("model");
		Model1 model2=(Model1)factory.getBean("model");
		System.out.println(model1.getAge());
		Assert.assertEquals(false, model1==model2);
}

 

 

 

        读取配置文件xml的时候会创建 GenericBeanDefinition类,它继承了AbstractBeanDefinition。而beanDefinition.getConstructorArgumentValues().addGenericArgumentValue就是向构造函数的参数设置。当然这里也可以指定参数的索引位置的方法addIndexedArgumentValue,索引是从0开始。如果没有指定,那就是按代码的执行前后顺序和类型来判断。  

       

       MutablePropertyValues则是实例化属性时用到,测试代码如下:

 

@Test
	public void testSpringBeanDefinitionMutablePropertyValues(){
		AbstractBeanDefinition beanDefinition = new GenericBeanDefinition();
		beanDefinition.setBeanClass(Model1.class);
		MutablePropertyValues properties=new MutablePropertyValues();  
		//设置属性的值
		properties.add("age", 21);
		properties.add("sex", "male");
		properties.add("name", "java bean");
		beanDefinition.setPropertyValues(properties);
		RootBeanDefinition mbd = new RootBeanDefinition(beanDefinition);
		mbd.setScope("singleton");
		mbd.setInitMethodName("init");
		BeanDefinitionRegistry reg=new DefaultListableBeanFactory();  
		//向IOC容器注册Bean
		reg.registerBeanDefinition("model", mbd);  
		BeanFactory factory=(BeanFactory)reg;  
		Model1 model1=(Model1)factory.getBean("model");
		Model1 model2=(Model1)factory.getBean("model");
		System.out.println(model1.getAge());
		Assert.assertEquals(false, model1==model2);
}

 

       如果是用这种方式,那bean一定要有默认的无参构造函数,并且是标准的javabean类。即set方法要正确,否则要报错。

分享到:
评论

相关推荐

    spring4.0源码

    现在,我们将深入探讨Spring 4.0源码中的关键知识点。 1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一就是DI,它通过容器管理对象及其依赖关系,使代码更加灵活和可测试。在源码中,我们可以...

    spring4.0.x源码

    Spring 4.0.x 更加注重Java配置,`@Configuration` 类可以替代传统的XML配置,使得配置更加简洁和直观。同时,`@EnableXXX` 注解用于启用特定的 Spring 功能,如 `@EnableWebMvc` 启用 MVC 功能。 九、Spring Boot ...

    Spring 4.0.x源码

    通过学习Spring 4.0.x的源码,开发者不仅可以深入了解Spring的工作原理,还能学习到最佳实践和设计模式,这对于提升个人技能和解决实际问题大有裨益。深入研究每个模块的实现细节,有助于更好地利用Spring框架提供的...

    spring4.0框架demo

    《Spring 4.0框架深度探索:基于Maven构建的实战Demo》 Spring框架作为Java企业级应用开发的基石,自推出以来就以其强大的功能和灵活性赢得了广大开发者的心。Spring 4.0作为其一个重要版本,引入了许多改进和新...

    Spring4.0 jar包

    Spring4.0版本是该框架的一个重要里程碑,它引入了多项增强功能和优化,提升了性能和开发者体验。在此,我们将深入探讨Spring4.0中的关键知识点。 首先,Spring4.0对Java版本的支持升级至Java 7,这意味着开发者...

    spring 4.0.x源码

    8. **API清理**:Spring 4.0.x删除了许多已废弃的方法和类,以保持API的清洁和一致性。这种做法鼓励开发者使用最新的API,避免了依赖过时的代码。 9. **更好的类型安全**:Spring 4增强了类型安全,例如在Bean的...

    spring4.0完整jar包

    这个"spring4.0完整jar包"包含了Spring4.0框架的所有核心组件和相关模块,使得开发者能够一站式获取所有必要的库,方便集成到项目中。 首先,让我们深入了解一下Spring框架的核心组成部分: 1. **IoC(Inversion ...

    spring4.0 jar包

    4. **改进的JDBC抽象层**:Spring 4.0的JdbcTemplate和NamedParameterJdbcTemplate类进行了优化,提高了性能并降低了内存占用。同时,增加了对JDBC 4.1和4.2规范的支持,包括更好的类型处理和批处理操作。 5. **...

    Spring4.0源代码

    Spring框架是Java开发中最广泛应用的轻量级...通过分析源码,我们可以学习到设计模式的运用,以及如何在大型项目中实现模块化和松耦合。此外,对源码的理解也有助于我们定制和扩展Spring框架,以满足特定的项目需求。

    Spring4.0的jar包,官方源码,javadoc

    源码分析是提升技能的绝佳途径,Spring4.0的源码揭示了框架内部的工作机制。例如,你可以看到AOP(面向切面编程)如何实现、IoC(控制反转)容器如何管理Bean、以及事件监听和事务管理的底层逻辑。通过阅读源码,...

    SPRING 4.0 中文指南

    Spring 4.0版本是该框架的一个重要里程碑,引入了许多改进和新特性,使得开发者能够更加高效地工作。这篇指南将深入探讨Spring 4.0的关键知识点。 一、Spring核心模块 Spring的核心模块包括IoC(Inversion of ...

    spring4.0框架所需的jar包

    Spring 4.0框架是Java开发中的一个关键组件,它为构建可扩展、模块化且易于维护的应用程序提供了强大的支持。这个压缩包包含了Spring 4.0版本所必需的jar包,不含Maven依赖管理和其他框架的jar包,确保了纯净的...

    Spring4.0-API

    Spring4.0-API CHM格式,很难得的,希望能帮到大家!

    spring4.0详细教程

    spring4.0详细教程,简单明了,一看即懂 ,适合初学者

    spring4.0jar

    《Spring 4.0 Jar:核心框架的深度解析》 Spring 框架作为Java企业级应用开发的首选,其4.0版本的发布在业界引起了广泛关注。Spring 4.0 jar 包,包含了该版本所有开发所需的核心组件,使得开发者能够更便捷地构建...

    spring4.0+spring MVC4.0+hibernate4.3全注解

    标题 "spring4.0+spring MVC4.0+hibernate4.3全注解" 涉及的是一个基于Java的Web开发技术栈,它整合了Spring 4.0、Spring MVC 4.0和Hibernate 4.3这三个流行框架。这个案例旨在展示如何在不使用XML配置的情况下,...

    spring4.0 全部jar包 spring4.0

    Spring 4.0作为其一个重要版本,引入了许多改进和新特性,旨在提升开发效率和应用程序性能。下面将详细介绍Spring 4.0中的关键知识点。 1. **模块化结构**: Spring 4.0对原有的模块进行了重构,使其更加独立,...

Global site tag (gtag.js) - Google Analytics