-- Первый выпуск уже доступен --
knapsack ("маленький рюкзак"), как следует из названия, это легковесный фреймворк для внедрения зависимостей, который реализует функционал IOC для внедрения зависимостей и AOP с использованием CGLIB и JDK. Конфигурация необходимых свойств может быть выполнена через конфигурационный файл properties.
QualifierSack.bindQualifierClassToPool
preInvoke
, postInvoke
, postReturning
, postThrowing
, чтобы расширить бизнес-логику, а также метод preInvoke
для контролируемого прерывания, позволяющий решать вопрос продолжения выполнения самостоятельноДля Maven проекта достаточно добавить зависимости в pom.xml:
<dependency>
<groupId>vip.ifmm</groupId>
<artifactId>knapsack</artifactId>
<version>1.0.0</version>
</dependency>
Конечно, для Gradle это будет выглядеть следующим образом:```groovy implementation group: 'vip.ifmm', name: 'knapsack', version: '1.0.0'
### Инструкция по использованию
После того как была добавлена зависимость Knapsack,
необходимо объявить контейнер. Если требуется внедрение зависимостей от реализационного класса до интерфейса, например,
```java
@Named("stu")
@Inject
public Person stu;
такое внедрение зависимостей (внедрение реализационного класса Stu
в интерфейс Person
) требует указания соответствия контейнеру, после чего можно использовать следующий метод для получения управляемого экземпляра:
public <T> T takeOutInstance(Class<T> clazz);
где параметром является класс, экземпляр которого требуется получить.
Пример использования других вспомогательных классов:
// Объявление единичного экземпляра Stu
@Singleton
@Named()
public class Stu extends Person {}
// Объявление единичного экземпляра Teacher
@Singleton
@Named()
public class Teacher extends Person {}
public class ClassRoom {
@Named("stu")
@Inject
public Person stu;
}
``````java
@Named("teacher")
@Inject
public Person teacher;
}
@Singleton указывает, что экземпляр в контейнере является синглтоном.
@Named("id") указывает на id при сборке или внедрении. При сборке, если id пустое, используется имя класса в нижнем регистре по умолчанию.
Внедрение требует наличия как @Named, так и @Inject, а также обязательства заполнения id.
- Здесь представлено 2 способа:
- Кодовый способ:
Knapsack knapsack = new Knapsack();
// связывание интерфейса и реализации
knapsack.link(Person.class).with(Stu.class);
knapsack.link(Person.class).with(Teacher.class);
ClassRoom classRoom = knapsack.sew().takeOutInstance(ClassRoom.class);
- Конфигурационный файл:
Более компактный код, параметр метода sew — это расположение конфигурационного файла.
Knapsack knapsack = new Knapsack();
ClassRoom classRoom = knapsack.sew("test.properties").takeOutInstance(ClassRoom.class);
Содержимое конфигурационного файла:
scanPackage=vip.ifmm.knapsack
qualifier.Person=Stu$Teacher
- В приведённых примерах, место использования `takeOutInstance` — это место получения экземпляра,
тогда, если вы замените его на
ClassRoom classRoom = (ClassRoom) knapsack.enhanceInstance(ClassRoom.class, SimpleAdapter.class, Recordlog.class);
Параметры:
① Класс, который требуется улучшить
``` ② Реализация интерфейса EnhancementAdapter (место бизнес-логики)
③ Аннотация метки улучшения (методы в классе, помеченные этой аннотацией, будут улучшены)
Это вернёт уже улучшенный прокси-объект, который можно использовать непосредственно
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )