Score
0
Watch 8 Star 43 Fork 7

MackyHuang / knapsackJavaApache-2.0

Join us
Explore and code with more than 2 million developers,Free private repositories !:)
Sign up
轻量级依赖注入框架, 已经实现IOC依赖注入功能和CGLIB、JDK实现的AOP功能,还可以通过配置properties文件配置需要的 spread retract

Clone or download
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
README.md

knapsack Maven Central License

-- 第一个版本已经发布 --

介绍

knapsack 小背包

顾名思义,一个轻量级依赖注入框架, 已经实现IOC依赖注入功能和CGLIB、JDK实现的AOP功能,还可以通过配置properties文件配置需要的属性

  • 依赖注入
    • 实现JSR330 (Dependency Injection for Java)中的依赖注入规范
    • 对于接口和实现类的管理,提供了QualifierSack.bindQualifierClassToPool方法
  • aop
    • 实现CGLIB和JDK的双重动态代理,轻便的进行切面编程
    • 提供 preInvokepostInvokepostReturningpostThrowing 四个方法丰富你的业务逻辑,并且preInvoke提供可控的中断接口,是否继续后续执行由你决定
  • 基于配置文件的功能
    • 接口和实现类的绑定可通过配置文件实现

安装教程

maven项目的话直接在pom.xml中引入

<dependency>
    <groupId>vip.ifmm</groupId>
    <artifactId>knapsack</artifactId>
    <version>1.0.0</version>
</dependency>

当然啦,gradle的话就是这样

compile group: 'vip.ifmm', name: 'knapsack', version: '1.0.0'

使用说明

  • 引入Knapsack依赖后
  • 首先声明容器, 如果依赖注入中需要使用到从实现类到接口的注入,类似于
    @Named("stu")
    @Inject
    public Person stu;

这样的依赖注入(向Person注入实现类Stu),就需要实现告知容器对应关系,然后就可以使用

public <T> T takeOutInstance(Class<T> 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` 接口的类(业务实现处)
    
    ③ 增强标志注解(类中被标记此注解的方法才会被增强)
    
    这时就会返回一个已经被增强会的代理对象,直接使用即可

Comments ( 6 )

Sign in for post a comment

Java
1
https://gitee.com/Mackyhuang/knapsack.git
git@gitee.com:Mackyhuang/knapsack.git
Mackyhuang
knapsack
knapsack
master

Help Search