# knapsack **Repository Path**: mackyHuang/knapsack ## Basic Information - **Project Name**: knapsack - **Description**: 轻量级依赖注入框架, 已经实现IOC依赖注入功能和CGLIB、JDK实现的AOP功能,还可以通过配置properties文件配置需要的 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 64 - **Forks**: 12 - **Created**: 2019-04-20 - **Last Updated**: 2025-02-08 ## Categories & Tags **Categories**: ioc-framework **Tags**: None ## README # knapsack [![Maven Central](./maven_central.svg)](https://mvnrepository.com/artifact/vip.ifmm/knapsack) [![License](./license.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) -- 第一个版本已经发布 -- ### 介绍 **knapsack** **小背包**, 顾名思义,一个轻量级依赖注入框架, 已经实现IOC依赖注入功能和CGLIB、JDK实现的AOP功能,还可以通过配置properties文件配置需要的属性 - 依赖注入 - 实现JSR330 (Dependency Injection for Java)中的依赖注入规范 - 对于接口和实现类的管理,提供了`QualifierSack.bindQualifierClassToPool`方法 - aop - 实现CGLIB和JDK的双重动态代理,轻便的进行切面编程 - 提供 `preInvoke`、`postInvoke`、`postReturning`、`postThrowing` 四个方法丰富你的业务逻辑,并且`preInvoke`提供可控的中断接口,是否继续后续执行由你决定 - 基于配置文件的功能 - 接口和实现类的绑定可通过配置文件实现 ### 安装教程 maven项目的话直接在pom.xml中引入 ``` vip.ifmm knapsack 1.0.0 ``` 当然啦,gradle的话就是这样 ``` compile group: 'vip.ifmm', name: 'knapsack', version: '1.0.0' ``` ### 使用说明 - 引入Knapsack依赖后 - 首先声明容器, 如果依赖注入中需要使用到从实现类到接口的注入,类似于 ``` @Named("stu") @Inject public Person stu; ``` 这样的依赖注入(向Person注入实现类Stu),就需要实现告知容器对应关系,然后就可以使用 ``` public T takeOutInstance(Class clazz) ``` 获取容器管理的实例,参数为需要获得实例的类 先列出其他辅助类,帮助理解 ``` public abstract class Person —————— //声明单例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; @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` 接口的类(业务实现处) ③ 增强标志注解(类中被标记此注解的方法才会被增强) 这时就会返回一个已经被增强会的代理对象,直接使用即可 ```