在非web环境中,经常使用ClassPathXmlApplicationContext来建立ApplicationContextjava
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
web
下面以ClassPathXmlApplicationContext来看加载流程。spring
public static void main(String[] args) throws ClassNotFoundException {
//1 声明BeanDefinition
BeanDefinition userDaoDefinition = new RootBeanDefinition(UserDao.class);
BeanDefinition beanDefinition = BeanDefinitionReaderUtils.createBeanDefinition(null, User33Service.class.getName(), null);
//2 建立BeanFactory,并注册beanDefinitions
beanDefinition.getPropertyValues().addPropertyValue("userDao", new RuntimeBeanReference("userDao"));
List<Integer> values = new ManagedList<>();
values.add(1);
values.add(2);
values.add(3);
beanDefinition.getPropertyValues().addPropertyValue("values", values);
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerBeanDefinition("userService", beanDefinition);
beanFactory.registerBeanDefinition("userDao", userDaoDefinition);
User33Service user33Service = (User33Service) beanFactory.getBean("userService");
System.out.println(user33Service.getUser());
}
复制代码
BeanDefinition中经过 beanDefinition.getPropertyValues().addPropertyValue 设置bean的属性。app
- 属性:
- ref : RuntimeBeanReference
- value : TypedStringValue
- property的子标签:
- bean: BeanDefinitionHolder
- ref : RuntimeBeanReference
- idref : RuntimeBeanNameReference
- value : TypedStringValue
- null : TypedStringValue
- array : ManagedArray or List 代码中已经被强制转换为List
- list : ManagedList or List 代码中已经被强制转换为List
- set : ManagedSet or Set 代码中已经被强制转换为Set
- map : ManagedMap or Map 代码中已经被强制转换为Map
- props : ManagedProperties
Spring中的ApplicationContext基本都是继承自AbstractRefreshableConfigApplicationContext,好比ClassPathXmlApplicationContext,FileSystemXmlApplicationContext等。ide
自定义ApplicationContext:spa
public class MyContext extends AbstractRefreshableConfigApplicationContext {
public MyContext(){
super.addApplicationListener(new MyListener());
super.refresh();
}
@Override
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
RootBeanDefinition beanDefinition = new RootBeanDefinition(CustomService.class);
beanFactory.registerBeanDefinition("testBean", beanDefinition);
beanFactory.registerBeanDefinition("childBean", new GenericBeanDefinition(beanDefinition));
GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
genericBeanDefinition.setBeanClass(CustomService.class);
beanFactory.registerBeanDefinition("genericBean", genericBeanDefinition);
}
}
复制代码
- 1 继承AbstractRefreshableConfigApplicationContext;
- 2 实现loadBeanDefinitions,注册bean。
1.继承AbstractRefreshableConfigApplicationContext;code
2.实现loadBeanDefinitions;cdn
3.建立BeanDefinition(AbstractBeanDefinition, RootBeanDefinition, 或 GenericBeanDefinition);xml
4.经过beanDefinition.getPropertyValues().addPropertyValue设置bean的属性;对象
5.beanFactory.registerBeanDefinition注册bean。