1. ClassPathXmlApplicationContext
В не-веб-среде ClassPathXmlApplicationContext обычно используется для создания ApplicationContext.
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
1.1 Отношения наследования
Давайте посмотрим на процесс загрузки с помощью ClassPathXmlApplicationContext.
2. Шаг загрузки
-
- ClassPathXmlApplicationContext устанавливает положение профиля.
-
- AbstractApplicationContext.refresh(): установите контекст Spring, создайте BeanFacotry и настройте его.
-
- AbstractRefreshableApplicationContext.refreshBeanFactory.
-
- AbstractRefreshableApplicationContext.loadBeanDefinitions, абстрактный метод, реализуемый подклассами.
-
- AbstractXmlApplicationContext.loadBeanDefinitions: чтение информации о конфигурации xml и создание BeanDefinition, зарегистрированного в среде Spring.
-
- AbstractAutowireCapableBeanFactory.createBean: создание объекта bean-компонента, ранее созданного BeanFactory, и установка различных свойств и интерфейса вызова.
3. основные классы
- BeanDefinition: класс определения Bean, который соответствует конфигурации в xml один за другим;
- BeanFacotry: интерфейс фабрики компонентов;
- BeanDefinitionRegistry: Интерфейс определения регистрации BeanDefinition;
- DefaultListableBeanFactory: реализация по умолчанию ListableBeanFactory (расширяет BeanFactory) и BeanDefinition, обеспечивающая функцию регистрации BeanDefinition;
- ApplicationContext: контекст Spring;
- AbstractApplicationContext: выполнить метод refresh();
- AbstractRefreshableApplicationContext: Предоставляет абстрактный метод loadBeanDefinitions(DefaultListableBeanFactory beanFactory) для загрузки BeanDefinitions.
3.1 BeanDefinition
- 1.RootBeanОпределение: обычный боб.
- 2. ChildBeanDefinition: дочерний компонент, используемый Spring для внутреннего использования, вместо этого обычно рекомендуется использовать GenericBeanDefinition;
- 3. Вы можете вызвать BeanDefinitionReaderUtils.createBeanDefinition для создания, и он вернет AbstractBeanDefinition.
3.1.1 Создание определения компонента вручную
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());
}
- 1. Создайте объект BeanDefinition, и поля BeanDefinition согласуются с узлами конфигурации в xml;
- 2. Создайте объекты DefaultListableBeanFactory или реализуйте интерфейс BeanFactoryPostProcessor для доступа к текущему beanFactory;
- 3. Вызовите определение RegisterBeanFactory DefaultListableBeanFactory.
Пройдено в BeanDefinitionbeanDefinition.getPropertyValues().addPropertyValueЗадайте свойства бина.
3.1.2 тэг xml и сопоставление типов атрибутов BeanDefinition:
- Атрибуты:
- ссылка: RuntimeBeanReference
- value : TypedStringValue
- подвкладки свойств:
- bean: BeanDefinitionHolder
- ref : RuntimeBeanReference
- idref : RuntimeBeanNameReference
- value : TypedStringValue
- null : TypedStringValue
- array : ManagedArray или List были преобразованы в List в коде
- list : ManagedList или List были преобразованы в список в коде.
- set : ManagedSet или Set были преобразованы в Set в коде.
- map : код ManagedMap или Map был преобразован в Map
- props : ManagedProperties
3.2 ApplicationContext
ApplicationContext весной в основном унаследован от AbstractreFreshableConfigApplicationContext, такой как ClassPathXMLApplicationContext, FileSystemxMlaplicationContext и т. Д.
Пользовательский контекст приложения:
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-компоненты.
3.3 Реализуйте собственную среду Spring
-
1. Унаследуйте AbstractRefreshableConfigApplicationContext и вызовите super.refresh() в конструкторе;
-
2. Реализовать loadBeanDefinitions;
-
3. Создайте BeanDefinition (AbstractBeanDefinition, RootBeanDefinition или GenericBeanDefinition);
-
4. Задайте свойства бина через beanDefinition.getPropertyValues().addPropertyValue;
-
5.beanFactory.registerBeanDefinition для регистрации компонента.