Отделка рессорного каркаса

задняя часть Spring

Весенняя серия статей

Spring Framework-1 (базовый)
Spring Framework-2 (на IOC)
Spring Framework-3 (под IOC)
Spring Framework-4 (АОП)
Spring Framework-5 (шаблон JDBC и управление транзакциями Spring)
Spring Framework-6 (SpringMvc)
Spring framework-7 (сборка SSM)
Spring Framework-8 (SpringMVC2)

вводить

Spring — это многоуровневый (универсальный) облегченный фреймворк с открытым исходным кодом. Ядром Spring является Inversion of Control (IoC) и Aspect Oriented (AOP).

Почему вы говорите, что многослойный универсальный?

JavaEE разработан на трех уровнях: веб-уровень, бизнес-уровень и уровень сохраняемости. В структуре интеграции ssh s == Struts2, s == spring, h == Hibernate универсальное развитие Spring заключается в том, что struts2 и hibernate не нужны, SpringMvc может заменить Struts2, а SpringJDBC может заменить Hibernate . Это эквивалент фреймворка Spring, с помощью которого можно быстро разрабатывать приложения JavaEE. О легкости сказать особо нечего, а весь фреймворк Spring упакован с объемом памяти более 1M. Расход пружины ходовой не большой. Это должен быть легкий фреймворк.

Весенние модули

Каждый модуль (или компонент), из которого состоит Spring Framework, может существовать отдельно или быть реализован в сочетании с одним или несколькими другими модулями. Функции каждого модуля следующие:


image
image
  1. Основной контейнер. Основной контейнер обеспечивает базовые функции Spring Framework. Основным компонентом основного контейнера является BeanFactory, представляющий собой реализацию фабричного шаблона. BeanFactory использует шаблон Inversion of Control (IOC), чтобы отделить конфигурацию приложения и спецификацию зависимостей от фактического кода приложения.
  2. Контекст Spring: Контекст Spring — это файл конфигурации, который предоставляет контекстную информацию для Spring Framework. Контекст Spring включает корпоративные службы, такие как JNDI, EJB, электронная почта, функции интернационализации, проверки и планирования.
  3. Spring AOP: модуль Spring AOP интегрирует возможности аспектно-ориентированного программирования непосредственно в среду Spring с помощью функций управления конфигурацией. Таким образом, любой объект, управляемый Spring Framework, можно легко сделать АОП-совместимым. Модуль Spring AOP предоставляет службы управления транзакциями для объектов в приложениях на основе Spring. Используя Spring AOP, декларативное управление транзакциями можно интегрировать в приложения, не полагаясь на компоненты EJB.
  4. Spring DAO: уровень абстракции JDBC DAO обеспечивает значимую иерархию исключений, которую можно использовать для управления обработкой исключений и сообщениями об ошибках, создаваемыми различными поставщиками баз данных. Иерархия исключений упрощает обработку ошибок и значительно сокращает объем кода исключений, который необходимо написать (например, открытие и закрытие соединений). Исключения Spring DAO, ориентированные на JDBC, следуют общей иерархии исключений DAO.
  5. Spring ORM: платформа Spring подключается к нескольким платформам ORM, предоставляя объектно-реляционные инструменты ORM, включая JDO, Hibernate и iBatis SQL Map. Все это соответствует общей иерархии транзакций и исключений DAO Spring.
  6. Веб-модуль Spring: модуль веб-контекста основан на модуле контекста приложения и предоставляет контекст для веб-приложений. Итак, среда Spring поддерживает интеграцию с Jakarta Struts. Веб-модули также упрощают обработку составных запросов и привязку параметров запроса к объектам домена.
  7. Spring MVC-фреймворк: Фреймворк MVC — это полнофункциональная реализация MVC для создания веб-приложений. Благодаря интерфейсу стратегии структура MVC становится гибко настраиваемой, а MVC поддерживает ряд технологий просмотра, включая JSP, Velocity, Tiles, iText и POI.

Какова функция МОК?

концепция

IoC -- Inverse of Control, инверсия управления, инвертирует создание объектов в Spring! ! Проблема высокой связанности программ, которую можно решить с помощью IOC! !

Инверсия контроля

Предположим, мне нужно сделать функцию, в которой мне нужно вызвать сервисный уровень, а затем вызвать уровень dao для получения данных. В традиционной разработке javaEE я перехожу непосредственно к новой службе, а затем к новому дао. Но в фреймворке spring давайте передадим права нового сервиса и нового дао в фреймворк spring.Если мне понадобится его использовать, я пойду прямо в фреймворк spring, чтобы найти его. Это равносильно тому, что право создавать мои ресурсы передается фреймворку Spring, что называется инверсией управления.

разъединение

Только что мы сказали, что создание ресурсов передано в Spring, и мы можем найти Spring для всего, что нам нужно. Этот процесс подобен фабричному шаблону. Но в Spring Framework, какие объекты необходимо создать, ему нужен файл конфигурации. Этот файл конфигурации сообщает Spring, какие ресурсы необходимо создать.

Например: предположим, мне нужно перейти в базу данных, чтобы запросить страницу отображения данных.

Когда программа запускается, среда Spring находит файл конфигурации для создания ресурсов, помещает ресурсы в другой контейнер, начинает работать, запрашивает данные из внешнего интерфейса, находит уровень контроллера в Spring, затем находит уровень службы, затем находит dao слой для данных, и, наконец, данные таким же образом Вернитесь к контроллеру и отобразите его на странице. Служба вводится на уровень контроллера с помощью spring, а уровень dao вводится на уровень службы с помощью spring. В этом процессе существует четкое разделение труда. У каждого слоя своя роль. В традиционной разработке непосредственно новый сервлет, а затем проверка данных, а затем данные возвращаются в интерфейс. В случае работы более чем всех суждений и запросов к разным таблицам код этого сервлета сильно раздувается. Не говоря уже о том, что разработка идет медленно, также трудно читать код после того, как вы его разработали. Таким образом, инверсия управления может быть использована для разделения


Что такое аспектно-ориентированный (АОП)?

концепция

  • В индустрии программного обеспечения АОП является аббревиатурой Аспектно-ориентированное программирование, что означает: Аспектно-ориентированное программирование.
  • АОП — это парадигма программирования, относящаяся к категории программной инженерии и помогающая разработчикам организовывать структуры программ.
  • Впервые АОП был предложен организацией AOP Alliance, и был сформулирован набор спецификаций Spring ввел идею АОП в структуру и должен соответствовать спецификациям AOP Alliance
  • Технология для достижения унифицированного обслуживания программных функций с помощью динамических агентов предварительной компиляции и времени выполнения.
  • АОП является продолжением ООП, горячей точки в разработке программного обеспечения и важной частью среды Spring, производной парадигмы функционального программирования.
  • Использование АОП может изолировать каждую часть бизнес-логики, тем самым уменьшая связь между различными частями бизнес-логики, улучшая возможность повторного использования программы и повышая эффективность разработки.

На самом деле, АОП может улучшить программу без изменения исходного кода! !

Базовая реализация АОП фреймворка Spring

  1. Нижним уровнем технологии АОП среды Spring также является технология прокси.Метод прокси обеспечивает два
  1. Динамический прокси на основе JDK
 必须是面向接口的,只有实现了具体接口的类才能生成代理对象
  1. Динамический прокси на основе CGLIB
对于没有实现了接口的类,也可以产生代理,产生这个类的子类的方式
  1. В традиционном АОП Spring используются разные прокси-методы в зависимости от того, реализует ли класс интерфейс или нет.
  1. Если реализован интерфейс класса, используйте динамический прокси-сервер JDK для завершения AOP.
  2. Если интерфейс не реализован, используйте динамический прокси CGLIB для завершения AOP.

Динамический прокси для JDK

Примечание. Необходимо реализовать интерфейс класса.

Пример: Предположим, у меня есть две работы, работа 1, работа 2.

//写一个接口
public interface Working {
    void wokingOne();

    void WorkingTwo();
}
//接口实现类
public class WorkingImpl implements Working {
    @Override
    public void wokingOne() {
        System.out.println("做任务1");
    }

    @Override
    public void WorkingTwo() {
        System.out.println("做任务2");
    }
}

Хорошо, теперь я собираюсь сначала выполнить задание 1, а затем выполнить задание 2. Запишем это так:

public static void main(String[] args) {
        Working working = new WorkingImpl();
        working.wokingOne();//做任务1
        working.WorkingTwo();//做任务2
    }
 

Хорошо, вот и прекрасное место, мне нужно отдохнуть 10 минут, прежде чем выполнять задание 2, но я не могу изменить исходный код. Как это сделать? В настоящее время используется наш динамический прокси JDK. код показывает, как показано ниже:

Сначала напишите класс прокси-инструмента. Давайте сделаем 10-минутный перерыв перед выполнением задания 2.

public class MyProxyUtils {
    public static Working getProxy(final Working working) {
        // 使用Proxy类生成代理对象
        Working proxy = (Working) Proxy.newProxyInstance(working.getClass().getClassLoader(),
                working.getClass().getInterfaces(), new InvocationHandler() {

                    // 代理对象方法一直线,invoke方法就会执行一次
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //再做工作2之前我先休息10分钟
                        if ("WorkingTwo".equals(method.getName())) {
                            System.out.println("休息10分钟");
                        }
                        //工作继续进行下去
                        return method.invoke(working, args);
                    }
                });
        // 返回代理对象
        return proxy;
    }
}
 public static void main(String[] args) {
        Working working = new WorkingImpl();
        Working proxy = MyProxyUtils.getProxy(working);
        proxy.wokingOne();
        proxy.WorkingTwo();

    }

Результаты операции можно представить:

做任务1
休息10分钟
做任务2

Динамический прокси CGLIB

Примечание: интерфейс класса не реализован

CGLIB также является java-проектом, поэтому для его использования нам нужно представить пакет jar, разработанный CGLIB.Поскольку комплект разработки CGLIB был представлен в основном пакете среды Spring (ядро). Таким образом, вы можете напрямую представить основной пакет разработки Spring.

Что ж, давайте также воспользуемся приведенным выше примером, чтобы сделать это.

//工作类
public class Working {

    public void wokingOne() {
        System.out.println("做任务1");
    }

    public void WorkingTwo() {
        System.out.println("做任务2");
    }
}

О результате, полученном при вызове задачи 1 и задачи 2 с новым объектом, говорить не приходится. Давайте сосредоточимся на том, как использовать CGLIB, чтобы сделать десятиминутный перерыв перед выполнением задачи без изменения исходного кода.

public static Working getProxy(){
        // 创建CGLIB核心的类
        Enhancer enhancer = new Enhancer();
        // 设置父类
        enhancer.setSuperclass(Working.class);
        // 设置回调函数
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object obj, Method method, Object[] args,
                    MethodProxy methodProxy) throws Throwable {
                if("WorkingTwo".equals(method.getName())){
                    // 休息10分钟
                    System.out.println("休息10分钟...");
                }
                return methodProxy.invokeSuper(obj, args);
            }
        });
        // 生成代理对象
        Working proxy = (Working) enhancer.create();
        return proxy;
    }
 public static void main(String[] args) {
        Working working = new WorkingImpl();
        Working proxy = MyCglibUtils.getProxy(working);
        proxy.wokingOne();
        proxy.WorkingTwo();

    }

Окончательный результат запуска тот же:

做任务1
休息10分钟
做任务2

анализировать

Я кратко проанализировал два метода базовой реализации Spring AOP выше: динамический прокси JDK, CGLIB. В среде Spring он автоматически выбирает, какой метод использовать. Если есть класс реализации интерфейса, используйте динамический прокси jdk, а если интерфейса нет, используйте CGLIB. С помощью этой функции нам намного проще изменять вещи. Предположим, мне нужно записать журнал, прежде чем я снова выполню задачу. Я только что написал фасетный класс для прямой записи журналов. Нет необходимости изменять его исходный код.

конец

Автор только что выучил весну, записал некоторые очки знаний и разобрался со своим пониманием.Если есть какая-то ошибка, надеюсь, вы ее выдвинете.