Spring | Приложения для прослушивания событий и лучшие практики
Spring | Приложения для прослушивания событий и лучшие практики

введение

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

1.1 Введение в прослушиватели событий Spring

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

1.2 Цель статьи

Целью этой статьи является глубокое изучение основных принципов прослушивателей событий Spring, руководство читателями по использованию прослушивателей в реальной разработке и демонстрация сценариев использования и методов реализации прослушивателей на некоторых конкретных примерах. Мы также подробно проанализируем исходный код прослушивателя Spring, надеясь, что читатели смогут глубже понять принцип его работы. Я надеюсь, что благодаря этой статье читатели смогут более опытно использовать прослушиватели событий Spring для создания гибких и удобных в обслуживании приложений.

Все следующие примеры загружены на Github. Вы можете загрузить проект локально и запустить его.

Пример Github (если вы еще не знакомы с Gradle),Рекомендуется прочитать мои предыдущие статьи.):gradle-spring-boot-demo


Принцип прослушивания событий Spring

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

2.1 Знакомство с компонентами

В модели прослушивателя событий Spring в основном используются три основных компонента: событие (Event), прослушиватель (Listener) и издатель событий (Event Publisher).

2.1.1 Событие

События обычно инициируются определенным действием или изменением состояния. Весной, с момента Определить событие Обычно требуется наследованиеApplicationEventдобрый。событиедобрый包含了событиеиз基本информация,Например источник события, время их возникновения и т. д.

Язык кода:java
копировать
import org.springframework.context.ApplicationEvent;

public class CustomEvent extends ApplicationEvent {
    public CustomEvent(Object source) {
        super(source);
    }
}

2.1.2 Слушатель

Слушатель несет ответственность за получение иобрабатывать события。Весной,Слушатели обычно реализуютсяApplicationListenerинтерфейсиздобрый,Необходимо определитьonApplicationEventметод, чтобы быть конкретнымобрабатывать события。

Язык кода:java
копировать
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {
    @Override
    public void onApplicationEvent(CustomEvent event) {
        // обрабатывать события
        System.out.println("Received custom event - " + event);
    }
}

2.1.3 Публикатор событий

Роль издателя событий — уведомлять всех зарегистрированных слушателей о событиях. Весеннее приложение,ApplicationEventPublisherИнтерфейс отвечает за Публикация событий。

Язык кода:java
копировать
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;

@Component
public class CustomEventPublisher {
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void doSomethingAndPublishAnEvent(final String message) {
        System.out.println("Publishing custom event.");
        CustomEvent customEvent = new CustomEvent(message);
        applicationEventPublisher.publishEvent(customEvent);
    }
}

2.2 Рабочий процесс

Основной рабочий процесс модели прослушивателя событий выглядит следующим образом:

  1. источник событийгенерировать событие。
  2. издатель событийопубликовать событие。
  3. Зарегистрированный прослушиватель обрабатывает событие после его получения. Эта модель поддерживает взаимодействие между компонентами с низкой степенью связи, что позволяет разработчикам разрабатывать более гибко и удобно.

Как использовать прослушиватели Spring

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

3.1 Определение событий

Весной,Мы можем наследоватьApplicationEventдобрый Приходить定义自己изсобытие。这个добрый需要包含所有与событие相关изинформация。

Язык кода:java
копировать
public class TestEvent extends ApplicationEvent {
    private String message;

    public TestEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

В этом примере,Мы создали файл под названиемTestEventизсобытиедобрый,该добрый中含有一个字符串добрый型изmessageПоле,Используется для передачи информации, связанной с событием.

3.2 Создание прослушивателя

После того, как событие определено, нам нужно Создать прослушивательобработать это событие。Слушатель реализованApplicationListenerинтерфейсиздобрый,Нужно перезаписатьonApplicationEventметод Определить Логика обработки события.

Язык кода:java
копировать
@Component
public class TestEventListener implements ApplicationListener<TestEvent> {
    @Override
    public void onApplicationEvent(TestEvent testEvent) {
        // [3] Здесь вы можете выполнить логику после прослушивания события, Слушайте источник события, запускайте действие!
        System.out.println("Прослушивал TestEvent:" + testEvent.getMessage());
    }
}

В этом примере,Мы определяем слушателяTestEventListener,Этот слушатель распечатает полученноеTestEventв случаеmessageинформация。

3.3 Публикация событий

Наконец, нам нужно опубликовать событие。Публикация событийобычно состоит изиздатель событийApplicationEventPublisherзавершить。

Язык кода:java
копировать
@Component
public class TestEventPublisher {
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void publish(String message) {
        // [2]использоватьpublishEventметодопубликовать событие,источник событийдляTestEvent        applicationEventPublisher.publishEvent(new TestEvent(this, message));
    }
}

В этом примере,TestEventPublisherдобрый中изpublishEventметод会创建并发布一个新изTestEventсобытие。

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

3.4 Тестирование кода

Язык кода:java
копировать
@SpringBootTest
class GradleSpringBootDemoApplicationTests {


	@Autowired
	private TestEventPublisher testEventPublisher;

	@Test
	void contextLoads() {
		// [1] опубликовать событие
		testEventPublisher.publish("Hello, Spring!");
	}
}

Выполнение завершено, и результаты следующие:


Рукописный случай на основе шаблона проектирования слушателя

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

4.1 Цели проектирования

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

4.2 Этапы реализации

4.2.1 Определение событий

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

Язык кода:java
копировать
public class UserRegisterEvent {
    private final String username;
    private final String email;

    public UserRegisterEvent(String username, String email) {
        this.username = username;
        this.email = email;
    }

    // Getters
}

4.2.2 Создание прослушивателя

Далее мы создаем два слушателя: один отвечает за отправку приветственного письма, а другой — за запись журнала регистрации пользователей.

Язык кода:java
копировать
public class WelcomeEmailListener {
    public void sendWelcomeEmail(UserRegisterEvent event) {
        System.out.println("Sending welcome email to " + event.getEmail());
    }
}

public class UserRegisterLogListener {
    public void logUserRegister(UserRegisterEvent event) {
        System.out.println("Logging user register: " + event.getUsername());
    }
}

4.2.3 Публикация событий

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

Язык кода:java
копировать
import java.util.ArrayList;
import java.util.List;

public class UserRegisterService {
    private final List<Object> listeners = new ArrayList<>();

    public void registerUser(String username, String email) {
        // Логика регистрации пользователя (опущена)
        System.out.println("User registered: " + username);
        
        // опубликовать событие
        UserRegisterEvent event = new UserRegisterEvent(username, email);
        for (Object listener : listeners) {
            if (listener instanceof WelcomeEmailListener) {
                ((WelcomeEmailListener) listener).sendWelcomeEmail(event);
            } else if (listener instanceof UserRegisterLogListener) {
                ((UserRegisterLogListener) listener).logUserRegister(event);
            }
        }
    }

    public void addListener(Object listener) {
        listeners.add(listener);
    }
}

мы можем добавитьmainметод模拟用户из注册过程并触发Публикация событийи контролировать。

Язык кода:java
копировать
public class Runner {
    public static void main(String[] args) {
        // Создать экземпляр UserRegisterService.
        UserRegisterService userRegisterService = new UserRegisterService();

        // Добавьте прослушиватель в UserRegisterService.
        userRegisterService.addListener(new WelcomeEmailListener());
        userRegisterService.addListener(new UserRegisterLogListener());

        // Имитация регистрации пользователя
        userRegisterService.registerUser("JohnDoe", "john.doe@example.com");
    }
}

Когда вы запустите этоmainметод时,UserRegisterServiceЛогика регистрации будет выполнена,Опубликовано позжеUserRegisterEventсобытие,иWelcomeEmailListenerиUserRegisterLogListener监听器将会捕获到这个событие并执行相应из操作。

Результаты бега следующие:

Язык кода:java
копировать
User registered: kfaino
Sending welcome email to kfaino@example.com
Logging user register: kfaino

Интерпретация исходного кода прослушивателя Spring

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

5.1 ApplicationEvent и ApplicationListener

ApplicationEventиApplicationListenerдаSpringМеханизм прослушивания событийкраеугольный камень。

5.1.1 ApplicationEvent

ApplicationEventда所有Springсобытиеиз基добрый,он наследует отjava.util.EventObject。он содержитисточник события и временную метку события.

Язык кода:java
копировать
public abstract class ApplicationEvent extends EventObject {
    private static final long serialVersionUID = 7099057708183571937L;
    private final long timestamp;

    public ApplicationEvent(Object source) {
        super(source);
        this.timestamp = System.currentTimeMillis();
    }

    public final long getTimestamp() {
        return this.timestamp;
    }
}

5.1.2 ApplicationListener

ApplicationListenerда一个泛型интерфейс,используется для处理特定добрый型изсобытие。它包含一个методonApplicationEvent,用户需要实现该метод Определить логика обработки событий.

Язык кода:java
копировать
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
    void onApplicationEvent(E event);
}

5.2 Публикация событий

ApplicationEventPublisherдасобытие发布из核心интерфейс。он определяетpublishEventметод,используется дляопубликовать событие для всех подходящих слушателей.

Язык кода:java
копировать
public interface ApplicationEventPublisher {
    void publishEvent(ApplicationEvent event);
    void publishEvent(Object event);
}

ApplicationContextунаследованныйApplicationEventPublisherинтерфейс,Итак, в контейнере Spring,可以直接использоватьApplicationContextПриходитьопубликовать событие。

5.3 Распространение событий

Весной,распространение событийда通过SimpleApplicationEventMulticasterдобрый Приходить实现из。这个добрый有一个multicastEventметод,Он доставит событие всем соответствующим прослушивателям.

Язык кода:java
копировать
public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {

    @Override
    public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
        for (final ApplicationListener<?> listener : getApplicationListeners(event, eventType)) {
            Executor executor = getTaskExecutor();
            if (executor != null) {
                executor.execute(() -> invokeListener(listener, event));
            } else {
                invokeListener(listener, event);
            }
        }
    }
}

В этом методе,getApplicationListenersиспользуется для获取所有匹配из监听器,ЗатемinvokeListenerметод被用Приходить触发这些监听器。

5.4 Подвести итог

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


Встроенные события Spring

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

6.1 ContextRefreshedEvent

ContextRefreshedEventсобытие在SpringЗапускается, когда контейнер инициализируется или обновляется,То есть, когда все bean-компоненты были успешно загружены и был вызван постпроцессор.,и после того, как все одноэлементные bean-компоненты были предварительно созданы.

Язык кода:java
копировать
@EventListener
public void handleContextRefresh(ContextRefreshedEvent event) {
    System.out.println("Context Refreshed: " + event.getTimestamp());
}

В SpringBoot мы можем написать следующий код:

Язык кода:java
копировать
@Component
public class MyServletContextListener implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        // TODO Здесь вы можете выполнить некоторые операции инициализации, такие как запрос к базе данных, кэширование данных, загрузка конфигурации и т. д.
        System.out.println("Триггер завершения загрузки контейнера Spring");
    }
}

Обратный вызов после того, как Spring завершит инициализацию:

6.2 ContextClosedEvent

Когда контейнер Spring закрыт,ContextClosedEventсобытие会被触发。на этом этапе,Все одноэлементные компоненты были уничтожены.

Язык кода:java
копировать
@EventListener
public void handleContextClose(ContextClosedEvent event) {
    System.out.println("Context Closed: " + event.getTimestamp());
}

6.3 ContextStartedEvent

当использоватьConfigurableApplicationContextизstart()метод启动Springконтекст,вызоветContextStartedEventсобытие。

Язык кода:java
копировать
@EventListener
public void handleContextStart(ContextStartedEvent event) {
    System.out.println("Context Started: " + event.getTimestamp());
}

6.4 ContextStoppedEvent

Соответственно,当использоватьConfigurableApplicationContextизstop()метод停止Springконтекст,вызоветContextStoppedEventсобытие。

Язык кода:java
копировать
@EventListener
public void handleContextStop(ContextStoppedEvent event) {
    System.out.println("Context Stopped: " + event.getTimestamp());
}

6.5 ApplicationReadyEvent

ApplicationReadyEventсобытие在SpringЗапускается, когда приложение завершило работу и готово принимать запросы.。

Язык кода:java
копировать
@EventListener
public void handleApplicationReady(ApplicationReadyEvent event) {
    System.out.println("Application Ready: " + event.getTimestamp());
}

6.6 Другие события

Помимо вышеперечисленных событий,Spring также предоставляет ряд других встроенных событий.,нравитьсяRequestHandledEventServletRequestHandledEventждать,Это может помочь нам более полно понимать и управлять рабочим статусом приложения.

6.7 Подвести итог

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


Анализ преимуществ и недостатков

В этой главе мы подробно рассмотрим прослушиватели Spring. Узнайте об этих преимуществах и Недостатки помогут нам принимать более разумные решения о том, когда и что. использовать прослушиватели Spring。

7.1 Преимущества

  • Низкая связанность: прослушиватели Spring позволяют различным компонентам взаимодействовать, не требуя от них прямой ссылки друг на друга, что помогает достичь низкой связанности и высокой связности кода.
  • Легко расширить: с помощью прослушивателей систему можно легко расширить, добавив в систему новые функции или варианты поведения без изменения существующего кода.
  • Мощные возможности обработки событий. Механизм обработки событий, предоставляемый Spring, является мощным и гибким и может обрабатывать различные сложные бизнес-сценарии и удовлетворять разнообразные бизнес-потребности.
  • Улучшение модульности: Слушатели могут четко разделить фокусы наточка,Помогает организовать код для разных функций в разных модулях.,Улучшена сопровождаемость и читаемость кода.

7.2 Недостатки

  • Накладные расходы на производительность. Использование прослушивателей приведет к определенным накладным расходам на производительность, особенно при запуске и обработке большого количества событий, что может стать узким местом в производительности системы.
  • Сложность: когда в системе имеется большое количество прослушивателей и событий, сложность управления и обслуживания этих прослушивателей и событий возрастает, что может привести к ошибкам и проблемам, которые трудно отладить.
  • Подходит не для всех сценариев: Слушатели подходят не для каждого сценария. В некоторых простых ситуациях, когда требуется быстрое реагирование, введение слушателя может показаться слишком тяжелым и обременительным. 7.3 权衡与建议在考虑использоватьSpringслушатель,Удобство, которое оно приносит, следует сопоставлять с возможным недостатком. В сложных бизнес-сценариях, где действительно необходимо использовать события для разделения модулей.,Spring Listener — очень подходящий выбор. но,В простых сценариях, не требующих развязки,Следует рассмотреть вопрос о том, чтобы избежать использования прослушивателей.,чтобы уменьшить ненужную сложность и накладные расходы на производительность.

🌟 предположение: 在考虑использоватьSpringслушатель,Удобство, которое оно приносит, следует сопоставлять с возможным недостатком. В сложных бизнес-сценариях, где действительно необходимо использовать события для разделения модулей.,Spring Listener — очень подходящий выбор. но,В простых сценариях, не требующих развязки,Следует рассмотреть вопрос о том, чтобы избежать использования прослушивателей.,чтобы уменьшить ненужную сложность и накладные расходы на производительность.


лучшие практики

В реальном развитии,Крайне важно, как использовать прослушиватели Spring более разумно и эффективно. Вот несколько советов по использованию слушателей Spring.,Это может помочь вам более разумно и гибко применять прослушиватели Spring.

  • Уточните тип события: при определении события четко и ясно укажите тип события и информацию, которую оно несет, чтобы событие могло точно отражать изменения состояния системы. Это также помогает улучшить читаемость и удобство обслуживания кода.
  • Правильно разделите обязанности слушателей: каждый слушатель должен иметь четкую и единую ответственность. Избегайте обработки слишком большого количества ненужной логики в прослушивателе, что сделает его сложным и трудным в обслуживании.
  • Оптимизируйте публикацию событий. Избегайте чрезмерной публикации событий. Например, циклическая публикация событий или публикация событий, содержащих много ненужной информации, может вызвать проблемы с производительностью. При публикации событий необходимо точно контролировать объем и содержание событий, чтобы избежать ненужных затрат на производительность.
  • Используйте асинхронные прослушиватели. В соответствующих ситуациях использование асинхронных прослушивателей может улучшить скорость реагирования и пропускную способность системы. Асинхронные прослушиватели могут обрабатывать события в отдельном потоке, чтобы предотвратить блокировку основного потока и повысить доступность системы.
Язык кода:java
копировать
@Async
@EventListener
public void handleAsyncEvent(MyEvent event) {
    // обрабатывать события
}
  • Разработайте механизм распространения событий. Разумно спроектируйте механизм распространения событий на основе потребностей бизнеса. Иногда события необходимо распространять в определенном порядке или прекращать распространение после обработки определенным прослушивателем. В этом случае требуется тщательно разработанная стратегия распространения событий.
  • Эффективное управление прослушивателями: Требуется эффективное управление и обслуживание всех прослушивателей в системе. Регулярно проверяйте код прослушивателя, чтобы убедиться в его соответствии принципам проектирования. В то же время прослушиватель должен своевременно обновляться и оптимизироваться для поддержания его эффективной работы.
  • Обратите внимание на тестирование слушателей: бизнес-логику слушателей также необходимо полностью протестировать. Напишите модульные тесты и интеграционные тесты для различной логики прослушивателя, чтобы гарантировать, что прослушиватель может работать правильно при различных обстоятельствах.
  • Документация и комментарии. Предоставляйте четкую и полную документацию и комментарии для слушателей и событий, что помогает членам команды понять функции и использование кода, а также повышает эффективность разработки команды.

Подвести итог

В этой статье мы углубимся в принципы работы слушателей Spring. Фильм, на основе аудиошаблона Фильм. Реальные кейсы проектирования, Встроенные события Spring, Анализ исходного кода、Преимущества и недостаткиа такжелучшие практика. Ниже мы проведем краткий обзор и Подвести итог。

9.1 Обзор

В ходе обучения мы узнали:

  • Принцип Spring Listener:Spring监听器да基于观察者шаблон проектирования实现из,Позволяет нам сделать это без изменения существующего кода.,Добавляйте ответы на конкретные события.
  • Как использовать:我们学习了нравиться何定义、Зарегистрируйтесь и используйте слушателей и как опубликовать событие.
  • Рукописный случай:我们通过一个实际案例理解了нравиться何基于监听器шаблон Планируем реализовать мониторинг и обработку событий.
  • Встроенные события Spring:Spring提供了一系列内置событие,Помогите нам лучше управлять и отслеживать жизненный цикл и рабочее состояние приложений.
  • Анализ исходного кода:Давайте углубимся в исходный код,Изучил механизм работы и детали реализации прослушивателей Spring.
  • Преимущества и недостатки:мы проанализировалиSpring监听器из Преимущества и недостатки,Понять, в каких сценариях уместно использовать прослушиватели,и вопросы, требующие внимания.
  • лучшие практики:Мы изучили сериюлучшие практика, чтобы показать, как более разумно и эффективно использовать прослушиватели Spring. 9.2 Заключение Я надеюсь, что эта статья поможет вам глубже понять прослушиватель Spring и освоить его. использоватьилучшие практики, чтобы более эффективно разрабатывать высококачественные программные продукты. В то же время мы также надеемся, что вы сможете продолжать учиться, практиковаться и исследовать, а также открывать для себя больше возможностей и инновационных способов использования прослушивателей Spring. Если у вас есть какие-либо предложения или вопросы по поводу этой статьи, пожалуйста, спрашивайте. Спасибо за чтение!

Ссылки

  1. На этот раз я наконец-то ясно объяснил слушателю Spring. - Чжиху
  2. Подробное объяснение механизма прослушивания событий Spring/SpringBoot. - Чжиху
  3. Spring Принцип прослушивателя - пружинный прослушиватель Анализ исходного кода(три) - CSDN
  4. анализ принципа Spring--listener (слушатель) - CSDN
  5. Прослушиватель событий Spring, принцип @EventListener - CSDN
  6. 4.1 Исходный код Spring --- Принцип прослушивателя (1) - наггетсы
  7. Инсайдер технологии Spring Boot: проектирование архитектуры и принципы реализации
  8. Весна на практике (5-е издание) - Дубан
  9. Углубленный анализ исходного кода Spring (2-е издание) - Дубан
  10. Интерпретация исходного кода Spring Boot и анализ принципов - Дубан
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose