Что такое mynetty
1. mynetty — это легковесная архитектура сервиса, которая включает в себя встроенный сервер Netty, JDBC (похожий на MyBatis), MySpring, MyMVC, MyAOP, Redis, планировщик задач Cron, модуль безопасности и права доступа;
2. Также есть несколько пакетов с инструментами: генератор кода (использует шаблоны Beetl, шаблоны можно адаптировать самостоятельно), инструменты работы с Excel;
3. Кроме того, некоторые модули, такие как JDBC и модули MySpring, содержат часто используемые методы, которые могут использоваться как инструментальные классы, например SqlHelper, MySqlSession, DefaultApplication и другие классы позволяют выполнять операции с базой данных и IoC.
4. Модуль безопасности mySafe, простой планировщик задач, инструменты работы с Redis, файловый сервер
public static void main(String[] args) throws InterruptedException {
new HttpServer(8897);
}
@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);
}
```}
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 и создания прокси.
Лифт-цикл класса 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");
}
}
Принцип работы генератора кода:
```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 )