ПОДРОБНОЕ ОБЪЯВЛЕНИЕ ТЕХНОЛОГИИ ДОСТАВКИ ВОЗДУШЕНИЯ (1)

Spring

Во-первых, введение SRING

Spring — универсальный магазин многоуровневых приложений Java SE/EE.轻量级开源框架. Весеннее ядроIOCиAOP.
К основным преимуществам Spring можно отнести:

  • Это удобно для разделения и упрощения разработки.Через контейнер IoC, предоставляемый Spring, мы можем передавать зависимости между объектами в Spring для управления, избегая высокой степени связанности программ, вызванной жестким кодированием.
  • Поддержка программирования АОП с помощью функции АОП, предоставляемой Spring, удобна для аспектно-ориентированного программирования.
  • Благодаря поддержке декларативных транзакций в Spring мы можем избавиться от монотонного и скучного кода управления транзакциями и гибко управлять транзакциями декларативным способом, чтобы повысить эффективность и качество разработки.
  • Это удобно для тестирования программ, и почти все работы по тестированию могут выполняться не зависящим от контейнера способом программирования.
  • Удобно интегрировать различные отличные фреймворки, а Spring обеспечивает прямую поддержку различных отличных фреймворков.

Во-вторых, архитектура Spring

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


Основной модуль (основной контейнер)

Основной модуль Spring реализует функцию IoC, которая отделяет зависимости между классами от кода и описывает зависимости способом конфигурации. Контейнер IoC отвечает за создание классов, управление, приобретение и т. д. Интерфейс BeanFactory является основным интерфейсом среды Spring и реализует многие основные функции контейнера.

Модуль Context построен на основном модуле и расширяет функции BeanFactory, включая интернационализацию, загрузку ресурсов, почтовую службу, планирование задач и другие функции. ApplicationContext — это основной интерфейс модуля Context.

Язык выражений (Expression Language) — это расширение Unified Expression Language (EL), которое поддерживает установку и получение свойств объекта, вызов методов объекта, манипулирование массивами, коллекциями и т. д. Используйте его, чтобы легко взаимодействовать с контейнером Spring IoC через выражения.

модуль АОП

Модуль Spring AOP предоставляет реализацию, которая соответствует спецификации AOP Alliance и интегрирует AspectJ, структуру уровня языка AOP. Сцепление может быть уменьшено с помощью АОП.

Модуль интеграции доступа к данным (доступ к данным/интеграция)

Этот модуль включает в себя JDBC, ORM, OXM, JMS и управление транзакциями:

  • Модуль транзакций: этот модуль используется для транзакций, управляемых Spring.Поскольку объекты, управляемые Spring, могут получать преимущества транзакций, управляемых Spring, нет необходимости в управлении транзакциями в коде, и он поддерживает программирование и декларативное управление транзакциями.
  • Модуль JDBC: Предоставляет пример шаблона JBDC. Использование этих шаблонов может устранить традиционное многословное кодирование JDBC и необходимый контроль транзакций, а также воспользоваться преимуществами транзакций, управляемых Spring.
  • Модуль ORM: обеспечивает бесшовную интеграцию с популярными объектно-реляционными платформами сопоставления, включая hibernate, JPA, MyBatis и другие. И вы можете использовать управление транзакциями Spring без дополнительного контроля над транзакцией.
  • Модуль OXM: Обеспечивает реализацию сопоставления Object/XML, сопоставления объектов Java с данными XML или сопоставления данных XML с объектами Java Реализации сопоставления Object/XML включают JAXB, Castor, XMLBeans и XStream.
  • Модуль JMS: используется для JMS (служба обмена сообщениями Java), предоставляя набор шаблонов «создатели сообщений, потребители сообщений» для более простого использования JMS, JMS для отправки между двумя приложениями или в распределенном системном сообщении для асинхронной связи.

Веб-модуль

Модуль построен на модуле ApplicationContext, обеспечивает функциональность веб-приложения, такую ​​как загрузка файлов, FreeMarker и т.д. Spring может интегрировать Struts2 и другие среды MVC. Кроме того, Spring предоставляет среду MVC Spring MVC.

тестовый модуль

Spring может выполнять почти всю работу по тестированию, не зависящую от контейнера, и поддерживает такие среды тестирования, как JUnit и TestNG.


3. Первое знакомство с Ioc и DI

Давайте сначала объясним концепцию IoC. IoC (инверсия управления: инверсия управления) является ядром контейнера Spring, но концепция IoC относительно неясна, поэтому людям трудно воспринимать ее буквально.

1. Инверсия управления IoC и внедрение зависимостей DI

В традиционном программировании нам нужно использовать метод объекта, и нам нужно сначала создать объект через new.Мы активны в это время, а IoC означает, что мы передаем управление созданным объектом контейнеру IoC, который контролируется контейнером. Помогите создать и внедрить зависимые объекты, наш程序被动的接受IoC容器创建的对象Инверсия контроля, поэтому она называется инверсией управления.

Поскольку IoC на самом деле недостаточно прямолинеен, предлагается концепция DI (Dependency Injection: Dependency Injection), то есть предоставление третьей стороне реализации внедрения для удаления зависимостей между нашими классами и классами, которые необходимо использовать. В общем, IoC — это цель, DI — это средство, а процесс создания объекта часто означает внедрение зависимостей. Чтобы реализовать IoC, метод создания объектов отличается от традиционного метода (новый), а контейнер IoC помогает нам внедрять (DI), когда нам нужно создавать связанные объекты.

Проще говоря, нам нужен еще один класс в нашем классе, просто пусть Spring поможет нам его создать, который называется控制反转; Затем Spring помогает нам установить необходимые объекты в наш класс, который называется依赖注入.

2. Несколько распространенных методов инъекции

  • Внедрить с помощью параметризованного конструктора
public class  User{
    private String name;
    public User(String name){
        this.name=name;
    }
} 

    User user=new User("tom");
  • Использовать внедрение свойств
public class  User{
    private String name;
    public void setName(String name){
        this.name=name;
    }
}

     User user=new User();
     user.setName("jack");
  • Использование внедрения интерфейса
// 将调用类所有依赖注入的方法抽取到接口中,调用类通过实现该接口提供相应的注入方法。 

public interface Dao{
    public void delete(String name);
} 

public class DapIml implements Dao{
    private String name;
    public void delete(String name){
        this.name=name;
    }
}

Внедрение зависимостей выполняется через контейнер

Все вышеперечисленные методы инъекции требуют от нас ручной инъекции, если есть第三方容器能帮助我们完成类的实例化, и сборка зависимостей, то нам нужно сосредоточиться только на разработке бизнес-логики. Spring является таким контейнером, который описывает зависимости между классами и классами через файлы конфигурации или аннотации и автоматически завершает инициализацию класса и внедрение зависимостей.

3. Пример Spring IoC

(1) Создайте проект и импортируйте пакет jar

Здесь мы выполняем только операцию IoC, поэтому нам нужно только импортировать пакет jar в основной модуль, bean-компоненты, ядро, контекст, выражение и т. д. Поскольку весной нет пакета jar, связанного с журналом, нам также необходимо импортировать log4j и commons-logging.

(2) Создать класс

public class User {
    public void add(){
        System.out.println("add.....");
    }
}

(3) Создайте файл конфигурации xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    //配置要创建的类  
    <bean id="user" class="com.cad.domain.User"/>        
</beans>

(4) Тест

//这只是用来测试的代码,后期不会这么写
public class Test {

    @org.junit.Test
    public void test(){
        //加载配置文件
        ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
        //获取对象
        User user=(User) context.getBean("user");
        System.out.println(user);
        //调用方法
        user.add();
    }
}

Когда контейнер запущен, Spring автоматически создаст экземпляр Bean и завершит сборку зависимостей в соответствии с информацией описания файла конфигурации.Экземпляр Bean можно получить из контейнера и использовать напрямую. Почему Spring может волшебным образом создавать и настраивать bean-компоненты, используемые программой, с помощью всего лишь простого файла конфигурации? Ответ черезJava的反射技术.

4. Пример DI Spring

Наш сервисный уровень всегда использует дао-уровень. Раньше мы всегда создавали новые дао-объекты на сервисном уровне. Теперь мы используем внедрение зависимостей для внедрения дао-слоя в сервисный уровень.

// UserDao
public class UserDao {
    public void add(){
        System.out.println("dao.....");
    }
}

// UserService
public class UserService {
    UserDao userdao;
    public void setUserdao(UserDao userdao){
        this.userdao=userdao;
    }

    public void add(){
        System.out.println("service.......");
        userdao.add();
    }
}

-------------------------------分割线--------------------------

// 配置文件
<bean id="userdao" class="com.cad.domain.UserDao"></bean> 
//这样在实例化service的时候,同时装配了dao对象,实现了依赖注入
<bean id="userservice" class="com.cad.domain.UserService">
    //ref为dao的id值
    <property name="userdao" ref="userdao"></property>
</bean>


В-четвертых, артефакт доступа к ресурсам Spring — интерфейс ресурсов

Классы для доступа к ресурсам (например, java.NET.URL, File), предоставляемые JDK, не могут очень хорошо и удобно удовлетворять требованиям доступа к различным базовым ресурсам. Spring разработал интерфейс ресурсов, чтобы предоставить приложениям более широкие возможности доступа к базовым ресурсам.Этот интерфейс имеет классы реализации, соответствующие различным типам ресурсов.

1. Основные методы интерфейса Resource

  • boolean exists(): существует ли ресурс
  • boolean isOpen(): открыт ли ресурс
  • URL getURL(): возвращает URL-адрес соответствующего ресурса.
  • File getFile(): возвращает соответствующий файловый объект
  • InputStream getInputStream(): возвращает входной поток соответствующего ресурса.

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

2. Конкретный класс реализации интерфейса Resource

  • ByteArrayResource: Ресурс, представленный двоичным массивом
  • ClassPathResource: Ресурсы в пути к классам, ресурсы представлены относительно пути к классам.
  • FileSystemResource: ресурсы файловой системы, ресурсы представлены путями файловой системы, например d:/a/b.txt.
  • InputStreamResource: ресурс, соответствующий InputStream
  • ServletContextResource: класс, предназначенный для доступа к ресурсам в контексте контейнера. Отвечает за загрузку ресурсов с путем относительно корня веб-приложения.
  • UrlResource: инкапсулирует java.net.URL. Пользователи могут получить доступ к любым ресурсам, которые могут быть представлены URL-адресом, таким как ресурсы Http, ресурсы Ftp и т. д.

3. Механизм загрузки ресурсов Spring

Чтобы получить доступ к различным типам ресурсов, необходимо использовать соответствующие классы реализации ресурсов, что является проблематичным. Spring предоставляет мощный механизм загрузки ресурсов, и соответствующие ресурсы могут быть загружены только посредством специальной идентификации адреса ресурса. Во-первых, давайте посмотрим на весну支持哪些资源类型的地址前缀:

  • classpath: например, класс: COM / CAD / домен / bean.xml. Загружать ресурсы из класса
  • fileНапример, файл: com / cad / domain / bean.xml. Используйте URLResource для загрузки ресурсов из каталога файловой системы.
  • http:// НапримерWoohoo. Baidu.com/resource/ не голоден…Загружать ресурсы с веб-сервера с помощью UrlResource
  • ftp://например, frp://10.22.10.11/bean.xml используйте UrlResource для загрузки ресурсов с ftp-сервера

Spring определяет набор интерфейсов для загрузки ресурсов. Интерфейс ResourceLoader имеет только один метод getResource(String location), который может загружать файловые ресурсы в соответствии с адресом ресурса. Адреса ресурсов поддерживают только адреса с префиксами типа ресурса, а не выражения пути к ресурсу в стиле Ant. ResourcePatternResolver расширяет интерфейс ResourceLoader и определяет новый метод интерфейса getResources(String locationPattern), который поддерживает выражения с префиксами типов ресурсов и путями к ресурсам в стиле Ant. PathMatchingResourcePatternResolver — это стандартный класс реализации, предоставляемый Spring.

4. Примеры

public class Test {
    public static void main(String[] args) throws IOException {
        ResourceLoader resloLoader = new DefaultResourceLoader();
        Resource res = resloLoader.getResource("https://www.baidu.com/");
        System.out.println(res instanceof UrlResource); // true
        BufferedReader bf = new BufferedReader(new InputStreamReader(res.getInputStream()));
        StringBuilder sb = new StringBuilder();
        String temp = null;
        while ((temp = bf.readLine())!= null) {
            sb.append(temp);
        }
        System.out.println(sb.toString());

        System.out.println("\n-----------------------------\n");
        res = resloLoader.getResource("classpath:test.txt");
        bf = new BufferedReader(new InputStreamReader(res.getInputStream()));
        sb = new StringBuilder();
        temp = null;
        while ((temp = bf.readLine())!= null) {
            sb.append(temp);
        }
        System.out.println(sb.toString());

        System.out.println("\n-----------------------------\n");
        res = resloLoader.getResource("file:C:\\Users\\ricco\\Desktop\\test\\test.txt");
        bf = new BufferedReader(new InputStreamReader(res.getInputStream()));
        sb = new StringBuilder();
        temp = null;
        while ((temp = bf.readLine())!= null) {
            sb.append(temp);
        }
        System.out.println(sb.toString());
    }
}

5. Подробное объяснение контейнера Spring Ioc

1. Бобовая фабрика

BeanFactory — это фабрика классов. В отличие от традиционных фабрик классов, традиционные фабрики классов отвечают только за создание экземпляров одного класса или нескольких классов, в то время как BeanFactory может создавать и управлять объектами различных классов. Spring называет их созданными и управляемыми объектами Java. .

BeanFactory — это интерфейс, Spring предоставляет множество реализаций для BeanFactory, наиболее часто используемой является XmlBeanFactory. Среди них основным методом интерфейса BeanFactory является getBean(String beanName), который возвращает бин с указанным именем из контейнера. Кроме того, функциональность интерфейса BeanFactory может быть расширена путем реализации его интерфейса (например, ApplicationContext). См. пример ниже:

//我们使用Spring配置文件为User类提供配置信息,然后通过BeanFactory装载配置文件,启动Spring IoC容器。 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="user" class="com.cad.domain.User"></bean>   
</beans>
// 我们通过XmlBeanFactory实现类启动Spring IoC容器 
public class Test {
    @org.junit.Test
    public void test(){ 
        //获取配置文件
        ResourcePatternResolver  resolver=new PathMatchingResourcePatternResolver(); 
        Resource rs=resolver.getResource("classpath:bean.xml");

        //加载配置文件并启动IoC容器
        BeanFactory bf=new XmlBeanFactory(rs);

        //从容器中获取Bean对象
        User user=(User) bf.getBean("user");

        user.speak();
    }
}

XmlBeanFactory загружает файл конфигурации Spring и запускает контейнер IoC.Когда контейнер IoC запускается через BeanFactory, bean-компоненты, определенные в файле конфигурации, не будут инициализированы, а начальное действие создания выполняется при первом вызове. При инициализации BeanFactory должна быть предоставлена ​​структура ведения журнала, и мы используем Log4J.

2. Контекст приложения

Унаследованный от ApplicationContext BeanFactory предоставляет больше возможностей для практического применения. В BeanFactory для достижения многих функций требуется программирование, в то время как ApplicationContext может быть достигнут путем настройки. Основной класс реализации — ApplicationContext.ClassPathXmlApplicationContextиFileSystemXmlApplicationContext, первый по умолчанию загружает файл конфигурации из пути к классам, а второй по умолчанию загружает файл конфигурации из файловой системы следующим образом:

// 和BeanFactory初始化相似,ApplicationContext初始化也很简单
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");

Существует большое различие между инициализацией ApplicationContext и инициализацией BeanFactory.BeanFactory初始化容器时并未初始化Bean,只有第一次访问Bean时才创建;而ApplicationContext则在初始化时就实例化所有的单实例的Bean. Поэтому время инициализации ApplicationContext будет несколько больше.

3. Контекст веб-приложения

WebApplicationContext специально подготовлен для веб-приложений, он позволяет загружать файлы конфигурации по пути относительно корневого веб-каталога для завершения работы по инициализации. Ссылку на ServletContext можно получить из WebApplicationContext, а весь объект WebApplicationContext помещается в ServletContext в качестве атрибута, так что контекст приложения Spring может быть доступен в среде веб-приложения.ConfigurableWebApplicationContextРасширяет webapplationcationContext, обеспечивает создание webapplationContext по конфигурации и определяет два важных метода.

  • setServletContext(ServletContext servletcontext): Установить ServletContext для Spring
  • setConfigLocation(String[] configLocations): Установите адрес файла конфигурации Spring.

WebApplicationContext初始化的时机和方式Да: используйте прослушиватель ContextLoaderListener, предоставленный Spring, для отслеживания создания объекта ServletContext.Когда объект ServletContext создан, создайте и инициализируйте объект WebApplicationContext. Поэтому нам нужно только настроить прослушиватель в web.xml.

<!-- 利用Spring提供的ContextLoaderListener监听器去监听ServletContext对象的创建,并初始化WebApplicationContext对象 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Context Configuration locations for Spring XML files(默认查找/WEB-INF/applicationContext.xml) -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

4. Связь и различие между BeanFactory, ApplicationContext и WebApplicationContext

Spring описывает зависимости между bean-компонентами через файл конфигурации и может создавать экземпляры bean-компонентов и устанавливать зависимости между bean-компонентами с помощью технологии отражения языка Java. Контейнер Spring IoC также предоставляет расширенные услуги, такие как кэширование экземпляров компонентов, управление жизненным циклом, публикация событий и загрузка ресурсов на основе выполнения этих базовых задач.

Beanfactory - это основной интерфейс пружины, который обеспечивает расширенный механизм конфигурации IOC. ApplicationContext построен на основе Finfacfortory, который представляет собой суб-интерфейс компонентов компонентов и обеспечивает более ориентированные на применение функций. Как правило, мы называем фанафство, какIoC容器, Контекст приложения应用上下文, также известен какSpring容器. WebApplicationContext предназначен дляWeb应用准备Да, он позволяет загружать файлы конфигурации по пути относительно корневого веб-каталога для завершения работы по инициализации и является подинтерфейсом интерфейса ApplicationContext.

BeanFactory является основой фреймворка Spring и ориентирован на сам Spring, ApplicationContext ориентирован на разработчиков, использующих фреймворк Spring. Мы используем ApplicationContext напрямую вместо базового BeanFactory почти для всех приложений, WebApplicationContext специально используется для веб-приложений.

5. Родительско-дочерний контейнер

Благодаря интерфейсу иерархично-активна, контейнер IOC Spring может создать систему родительской системы:子容器可以访问父容器的Bean,父容器不能访问子容器的Bean。

Контейнер Spring Sons, реализованные с использованием многих функций, таких как весенний контроллер MVC Controller, расположенный субконтенер, сервис и настойчивые слои, расположенные в родительском контейнере. Но даже так, контроллер также может означать настойчивость бобовых фасолей и бизнес-слой, а сервисный слой и настойчивый слой не увидят контроллер.


更多精彩文章,关注公众号【ToBeTopJavaer】,更有数万元精品vip资源免费等你来拿!!!