1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/lawliujian-mynetty

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 12 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 15.03.2025 09:25 b2f52f4

Введение

Что такое mynetty

1. mynetty — это легковесная архитектура сервиса, которая включает в себя встроенный сервер Netty, JDBC (похожий на MyBatis), MySpring, MyMVC, MyAOP, Redis, планировщик задач Cron, модуль безопасности и права доступа;
2. Также есть несколько пакетов с инструментами: генератор кода (использует шаблоны Beetl, шаблоны можно адаптировать самостоятельно), инструменты работы с Excel;
3. Кроме того, некоторые модули, такие как JDBC и модули MySpring, содержат часто используемые методы, которые могут использоваться как инструментальные классы, например SqlHelper, MySqlSession, DefaultApplication и другие классы позволяют выполнять операции с базой данных и IoC.
4. Модуль безопасности mySafe, простой планировщик задач, инструменты работы с Redis, файловый сервер

Быстрый старт

  1. Запуск службы Запустите службу, привязав её к порту 8897 Код:
public static void main(String[] args) throws InterruptedException {
    new HttpServer(8897);
}
  1. Использование MyMvc, IoC и MySqlSession для создания простого запроса списка Код:
@MyController
@MyRequestMapping("/CustAction")
public class CustAction {

    @MyRequestMapping("/getCustList")
    public void getCustList(HttpMyRequest req, HttpMyResponse rep) {
        CustDao cd = MySqlSession.getMapper(CustDao.class);
        Map<String, Object> par = new HashMap<>();
        par.put("name", "%Ду%");
        Map<String, Object> result = new HashMap<>();
        result.put("data", cd.getCustList(par));
        rep.fullWrite(JSONObject.toJSONString(result));
    }
}

dao интерфейс Код:

public interface CustDao {
    
    @MySelect("select custid,nickname,telphone from cust where 1=1 and nickname like :name ")
    List<Map<String, Object>> getCustList(Map map);
}
```}
  1. Обращение к http://127.0.0.1:8897/CustAction/getCustList для тестирования интерфейса Ответ:
{
"data":[
{"telphone":"18636929805","custid":2,"nickname":"Ду бизнес"},
{"telphone":"18234164844","custid":24,"nickname":"Ду Фу"}
]}

(Этот интерфейс прошел тестирование нагрузкой JMeter на 10000 одновременных запросах)

Архитектура программного обеспечения

Простое описание принципа работы:

Обработка каждого запроса:
1. Используется Netty для упаковки каждого запроса в объекты `myrequest` и `myresponse`.
2. Создается модель сервлета, реализуется `myservlet`, жизненный цикл которого включает `init`(инициализация) -> `domain`(обработка) -> `destroy`(разрушение).
3. Упакованные объекты `myrequest` и `myresponse` передаются в экземпляр `myservlet` (одиночный режим) (при запуске службы все экземпляры `myservlet` инициализируются аннотациями).
4. 
```mymvc реализует `myservlet` (диспетчерский сервлет с URL `"/*"`) через класс `MyDispatcherServlet` для маршрутизации всех запросов.
5. При инициализации класса `MyDispatcherServlet` производится сканирование всех методов, аннотированных `myRequestMapping`, и хранение `url:method` в виде ключ:значение.
6. При получении запроса выполняется метод `domain` класса `MyDispatcherServlet`, который извлекает соответствующий метод и класс из карты `url:method` и использует рефлексию для его выполнения.
```Обработка сессий:
При каждом запросе проверяется наличие cookie в заголовках запроса и наличие параметра mysessionid внутри него. В случае отсутствия параметра mysessionid в ответе используется set-cookie для установки нового UUID как значения mysessionid.```java
public interface MyServlet {
    public void init();
    public void service(HttpMyRequest req, HttpMyResponse rep);
    public void destroy();
}

Mymvc диспетчерский сервлет:

@MyServletUrl("/*")
public class MyDispatcherServlet extends HttpMyServlet {

Описание функциональности

1. Простой HTTP сервер, переопределяющий объекты servlet, request, response и т.д., конфигурация которых осуществляется с помощью аннотаций.
2. Поддержка сессий, где идентификатор сессии имеет имя mysessionid.
3. Реализация легковесной IoC и MVC архитектур, а также простого AOP.
4. Реализация базовой функциональности mybatis.
5. Общие инструменты для генерации кода, работы с Excel и создания прокси.

Подробное описание функциональности

1. Spring IoC

Лифт-цикл класса DefaultMyApplication: Инициализация сканирования пакетов для поиска классов, аннотированных MyBean, и помещение их в контейнер -> при получении экземпляра из контейнера, если в классе есть поля, аннотированные MyAutowired, то происходит зависимое внедрение этих полей из контейнера.

Пример использования в пакете com.testMvc.testSpring:

public static void main(String[] args) throws Exception {
    // Инициализация контейнера
    DefaultMyApplication ap = new DefaultMyApplication();
    // Получение экземпляра по имени
    CustAction ca = (CustAction) ap.getBean("CustAction");
    ca.testSpring();
    // Получение экземпляра по интерфейсу
    CustService cs = ap.getBean(CustService.class);
    cs.speak();
}

Пример простой конфигурации:

<bean id="custAction" class="com.testMvc.testSpring.CustAction"/>
<bean id="custService" class="com.testMvc.testSpring.CustService"/>
``````java
@MyBean("CustAction")
public class CustAction {
    @MyAuto
    private CustService cs;

    public void testSpring() {
        List<Map<String, Object>> list = cs.getCusts();
        System.out.println("list:" + list);
    }
}

@MyBean
public class CustServiceImpl implements CustService {
    @Override
    public List<Map<String, Object>> getCusts() {
        CustDao cd = MySqlSession.getSqlSessionFactory().openSession().getMapper(CustDao.class);
        return cd.getCusts();
    }

    @Override
    public void speak() {
        System.out.println("I'am speak");
    }
}
## Аспекты

Принцип работы AOP:

1. Для вызова экземпляров классов с применением аспектов используется динамическое прокси-соединение. В приоритете JdkDynamicProxy; если нет интерфейсов, то используется CGLIB.
2. Определение того, что метод прокси связан с каким-либо конфигурируемым аспектом. Если да, то выбирается метод, который следует выполнить перед основной операцией (метод будет выполнен через рефлексию). Далее следует следующий шаг.
3. Четыре точки входа используются в режиме наблюдателя. Например, когда прокси-метод достигает точки до выполнения основного метода, сигнал "до" вместе со связанными аспектами передается всем подписчикам update, затем каждый подписчик выполняет свой метод update.
4. Метод update выполняет связанные аспекты (выполняются через рефлексию).

### Пример использования

Пример тестового случая `testAop2` находится в пакете `com.testMvc.testAop2`.
``````java
public static void main(String[] args) {
    test1();
}

public static void test1() {
    MyAopFactory.getInstance();
    Inter1 i = MyAopFactory.getSub(Inter1Impl.class);
    i.speak();
}

Результат выполнения:

哈哈哈在前面
speak
哈哈哈在后面

Конфигурация аспектов

Конфигурация точек входа (все методы, начинающиеся с spea, в пакете com.testMvc.testAop1):

@MyAspect("execution(* com.testMvc.testAop1.*.spea*(..))")
public class TestAspect {
    
    @MyBefore
    public void before() {
        System.out.println("哈哈哈在前面");
    }
    
    @MyAfter
    public void after() {
        System.out.println("哈哈哈在后面");
    }
}

Метод speak() в классе Inter1Impl соответствует точке входа @MyAspect("execution(* com.testMvc.testAop1.*.spea*(..))").

public class Inter1Impl implements Inter1 {

    @Override
    public void speak() {
        System.out.println("speak");
    }

}

Генератор кода

Принцип работы генератора кода:

  1. Используется движок шаблонов Beetle для конфигурирования шаблонов кода слоёв Action, Service и Bean.
  2. Получение информации о полях таблицы для генерации кода.
  3. Загрузка шаблонов кода с помощью ресурсного загрузчика Beetle, преобразование типов полей и первых букв в верхний регистр.
  4. Заполнение данных в шаблонах кода и генерация соответствующих файлов в целевой директории.

```markdown
Пакет `com.tool.createBean` содержит класс `CreateHelperNew`, в котором метод `main` генерирует код с использованием аннотаций, как показано ниже:
``````markdown
```java
public static void main(String[] args) {
    getTableInfo("cust,config", "пользователи, конфигурация", "E:/kkklll/");
}
/**
 * @param table имя таблицы
 * @param describe описание модуля таблицы
 * @param path путь для создания bean файла
 */
public static void getTableInfo(String table, String describe, String path) {
    try {

Шаблоны файлов находятся в пакете codeTemplate внутри директории resources. В этом пакете есть несколько шаблонов (action, bean, service), которые можно изменять или расширять.


Лю Jian

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/lawliujian-mynetty.git
git@api.gitlife.ru:oschina-mirror/lawliujian-mynetty.git
oschina-mirror
lawliujian-mynetty
lawliujian-mynetty
master