文章目录[隐藏]
本文是通过AnnotationConfigApplicationContext读取配置类来一步一步去来源gaodaimacom搞#^代%!码网了解Spring的启动过程。
在看源码之前,我们要知道某些类的作用,这样更方便后续的了解。
1、BeanDefinition
BeanDefinition就是Bean的定义,它是用来描述Bean的,里面存放着关于Bean的一系列信息,比如Bean的作用域,Bean所对应的Class,是否懒加载等等,BeanDfinition与Bean的关系可以看作是类和class的关系,那么有人说,有class对象就好啦,但是Class不能完完全全的抽象出Bean,比如说,Bean的注入模型,是否懒加载,是否是工厂bean等等,这些是class无法去抽象出来的,所以需要BeanDefinition来描述Bean,在Spring中,我们可以通过<Bean><Bean/>、@Component、BeanDefinition来定义Bean
//定义一个BeanDefinition AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition(); //设置当前bean的class 1、通过class获取 2、通过类的全限定类名获取 //beanDefinition.setBeanClass(Testt.class); beanDefinition.setBeanClassName("com.beans.Testt"); //将beanDefinition注册到BeanFactory中 DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); factory.registerBeanDefinition("BEAN",beanDefinition); //获取Bean factory.getBean("BEAN");
还可以直接使用RootBeanDefinition来获取BeanDefinition
//生成BeanDefinition RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Testt.class); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); //将BeanDefinition注册到工厂中 factory.registerBeanDefinition("tt",rootBeanDefinition); Object tt = factory.getBean("tt"); System.out.println(tt);
通过上述三种方式我们就可以定义一个Bean。
假设我们有一个实体类Testt
public class Testt { public String name; public void sayHello(){ System.out.println("Hello World!"); } public void setName(String name){ this.name = name; } public String getName(){ return name; } }
我们还可以通过beanDefinition来给name属性赋值
//生成一个BeanDefinition RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Testt.class); //赋值属性name为123 rootBeanDefinition.getPropertyValues().addPropertyValue("name","123"); //获取name的值 Object name = rootBeanDefinition.getPropertyValues().getPropertyValue("name").getValue(); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); factory.registerBeanDefinition("tt",rootBeanDefinition); Testt tt = (Testt) factory.getBean("tt"); System.out.println(tt); //通过实例获取name的值 String name1 = tt.getName(); System.out.println(name1); //123 System.out.println(name);//123
BeanDefinition还可以
beanDefinition.setScope("prototype"); // 设置作用域 beanDefinition.setInitMethodName("init"); // 设置初始化方法 beanDefinition.setAutowireMode(0); // 设置自动装配模型 0默认装配模式不自动注入,1 ByName 2 ByType 3 构造器注入 ......