Процесс загрузки Spring и основные классы

Spring

1. ClassPathXmlApplicationContext

В не-веб-среде ClassPathXmlApplicationContext обычно используется для создания ApplicationContext.

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

1.1 Отношения наследования

Давайте посмотрим на процесс загрузки с помощью ClassPathXmlApplicationContext.

2. Шаг загрузки

    1. ClassPathXmlApplicationContext устанавливает положение профиля.
    1. AbstractApplicationContext.refresh(): установите контекст Spring, создайте BeanFacotry и настройте его.
    1. AbstractRefreshableApplicationContext.refreshBeanFactory.
    1. AbstractRefreshableApplicationContext.loadBeanDefinitions, абстрактный метод, реализуемый подклассами.
    1. AbstractXmlApplicationContext.loadBeanDefinitions: чтение информации о конфигурации xml и создание BeanDefinition, зарегистрированного в среде Spring.
    1. 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 для регистрации компонента.