Весна основных компонентов работы Brief

Spring Framework состоит из трех основных компонентов: Spring Core, Spring Контекст и Spring Beans, они заложили основу для весны и подпирали рамки весны. Другие функции, такие как Spring Web, АОП, JDBC и т.д. разработаны на основе ее реализации.

Бобовые компоненты

Spring использовать объект управления в режиме завода (Bean), используемый в программе, верхний Bean растение интерфейса BeanFactory, простую точка зрения, растение представляет собой соответствующий обратный Bean экземпляр необходимо.

public interface BeanFactory {
    //...        
    Object getBean(String name);
}

В фабричном режиме, класс реализации завода генерируется Bean возвращается вызывающим клиент, который требует от клиента предоставить экземпляр необходимого класса для создания своего собственного класса фабрики, увеличить нагрузку на клиентах. Пружина соединение с контрольной и инверсии зависимостей, необходимой инъекции дают примеры для клиента, что упрощает работу клиента. Конкретная реализация выглядит следующим образом.

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
        implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
    /** Map of bean definition objects, keyed by bean name */
    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>;
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition){     
        //...
    }
}

beanDefinitionMap Конкретные Bean контейнер, объекты Spring создан экземпляр сохранить их. Клиенты должны использовать getBean метод установку, чтобы попытаться дать соответствующий экземпляр, если экземпляр уже существует, то этот экземпляр будет возвращен, если он не существует, первая генерацию соответствующего экземпляра метод registerBeanDefinition сохранить в beanDefinitionMap в (отложенной инициализации ), а затем вернуть экземпляр к клиенту.

13341631-fa7f8c2ee4ded7fa.png
Наследование Spring Bean Factory

Весна пакет соответствующего кода является org.springframework.beans

не beanDefinitionMap напрямую сохранить сам экземпляр, но будет храниться в экземпляре инкапсулирует объект BeanDefinition. экземпляр BeanDefinition содержит всю информацию, которая определена в следующей упрощенной версии.

public class BeanDefinition {
    private Object bean;

    private Class<?> beanClass;
    private String beanClassName;

    // Bean 属性字段的初始化值
    private BeanPropertyValues beanPropertyValues;

    //...
}

производство Spring Bean Factory, когда Bean

  1. Сохранить первый экземпляр параметр типа и beanClass beanClassName, чтобы сохранить необходимо инициализировать имена beanPropertyValues ​​и значение полей, этот процесс достигается путем регулирования инверсии Spring, вторая секция будет кратко описана здесь
  2. Создание экземпляра компонента, и необходимо будет инициализировано с помощью записи боба значения поля экземпляра механизма отражения, хранятся в экземпляре компонента, полная конструкция BeanDefinition.
    Предположим , мы выполнили шаг 1) операции, после того, как процесс выражается следующим кодом.
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition){
    //生成 bean 实例,并完成初始化
    Object bean = createBean(beanDefinition);
    //将 bean 实例保存在 beanDefinition 中
    beanDefinition.setBean(bean);
    //将 beanDefinition 实例保存在 Spring 容器中
    beanDefinitionMap.put(beanName, beanDefinition);
}

protected Object createBean(BeanDefinition beanDefinition) {
    try{
        Object bean = beanDefinition.getBeanClass().newInstance();
        try {
            setBeanPropertyValues(bean, beanDefinition);
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException e) {
            e.printStackTrace();
        }
        return bean;
    }catch(InstantiationException e){
        e.printStackTrace();
    }catch(IllegalAccessException e){
        e.printStackTrace();
    }

    return null;
}

protected void setBeanPropertyValues(Object bean, BeanDefinition beanDefinition) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
    for(PropertyValue pv : beanDefinition.getBeanPropertyValues().getBeanPropertyValues()){
        Field beanFiled = bean.getClass().getDeclaredField(pv.getName());
        beanFiled.setAccessible(true);
        beanFiled.set(bean, pv.getValue());
    }
}

Контекст Компоненты

В целом, традиционный дизайн программы, либо использовать завод , чтобы создать экземпляр или создать экземпляр, примеры вызывающей должны сначала взять на себя инициативу , чтобы создать экземпляр , прежде чем использовать. Инверсия управления (обратный контроль) будет передана для создания экземпляра контейнера реализации процесса, вызывающий абонент будет передать управление, так называемой инверсию контроля.
Внедрение зависимостей (зависимость Инъекции) дополнительно на основе контроля на повороте. Если нет инъекции зависимостей контейнера не создает экземпляр и сохранен, вызывающий должен использовать getBean (String beanName) , чтобы получить к экземпляру. При использовании инъекции зависимостей, контейнер будет автоматически вводится в завершении экземпляра компонента вызывающий соответствующую конфигурацию для дальнейшего использования.

Компонент контекста вышеописанного управления впрыском и инверсия зависимостей помогающей реализует контейнер Spring IoC. Здесь мы объясним экземпляр Bean в соответствии с требованиями к классу обслуживания. Практическое применение, нам нужно будет управлять много, например Spring Bean.

public class SampleService {
    private String service;
        public String getService() {
        return service;
    }
    public void setService(String service) {
        this.service= service;
    }
}

Программа работает, вам нужно SampleService, мы не даем новый экземпляр вызывающего абонента, но экземпляры SampleService переданы весеннем контейнер управляет конфигурационный файл и указать его параметры инициализации. Это конфигурация ресурсов файл, который выглядит следующим образом.

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean name="sampleService " class="com.service.SampleService ">
        <property name="service" value="This is a service"></property>
    </bean>
</beans>

Spring Основной ResourceLoader компонент предоставляет интерфейс для облегчения чтения XML-файлы или другие файлы ресурсов. Код функции ядра должен быть обеспечен следующим образом.

public class ResourceLoader {
    public Resource getResource(String location){
        URL resource = this.getClass().getClassLoader().getResource(location);
        return new UrlResource(resource);
    }
}

// UrlResource 的功能代码
public class UrlResource implements Resource {
    private final URL url;

    public UrlResource(URL url){
        this.url = url;
    }

    @Override
    public InputStream getInputStream() throws IOException {
        URLConnection urlConnection = url.openConnection();
        urlConnection.connect();
        return urlConnection.getInputStream();
    }

}

Это загрузить файл ресурсов и возвращается в виде потока данных. Контексте ресурсы определяются с образованием соответствующей фасоли и хранятся в контейнере, имя фасоли SampleService, программа для дальнейшего использования. Это завершает инверсию контрольной работы. Затем нам нужно вводить sampleService использовать его там , где это необходимо, операция инъекции зависимостей , т.е. завершается.
Допустим теперь , что объекты , используемые SampleController SampleService, весна предусматривает три инъекции зависимостей образом, внедрение конструктора, инъекции и инкубационных аннотаций инъекций.

public class SampleController {
    /**
     * 3\. 注解注入
    **/
    /* @Autowired */
    private SampleService sampleService;

    /**
     * 1\. 构造器注入
    **/
    public SampleController(SampleService sampleService){
        this.sampleService = sampleService;
    }
    //无参构造函数
    public SampleController(){}

    // 类的核心功能
    public void process(){
        System.out.println(sampleService.getService());
    }
    /**
     * 2\. setter 注入
    **/
    /*public void setService(SampleService service) {
        this.service= service;
    }*/
}

Режим Injection, соответствующий трех видов различных конфигураций, в конфигурационном файле, на основе предыдущего файл XML, мы можем достичь инъекции этих трех способов, соответственно. Следует отметить SampleController генерируется с использованием управления контейнером Spring в IoC.

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean name="sampleService " class="com.service.SampleService ">
        <property name="service" value="This is a service"></property>
    </bean>

<!-- 1\. 构造器注入方式为SampleContorller 的 bean 注入 SampleService -->
    <bean name="sampleContorller" class="com.controller.SampleContorller">
        <!-- index 是构造方法中相应参数的顺序 -->
        <constructor-arg index="0" ref="sampleService"></constructor-arg>
    </bean>

<!-- 2\. setter 注入方式为SampleContorller 的 bean 注入 SampleService -->
<!--    
    <bean name="sampleContorller" class="com.controller.SampleContorller">
        <property name="sampleService " ref="sampleService"></property>
    </bean>
-->

<!-- 3\. 注解注入方式为SampleContorller 的 bean 注入 SampleService -->
<!--    
    <bean name="sampleContorller" class="com.controller.SampleContorller">

    <!-- 不需要配置,Spring 自动按照类型注入相应的 bean -->
    </bean>
--> 
</beans>

рекомендация

отblog.csdn.net/weixin_34220179/article/details/90794229