当前位置: 首页 > 软件库 > Web应用开发 > Web框架 >

LSFramework

手写山寨版 Spring
授权协议 MIT
开发语言 Java
所属分类 Web应用开发、 Web框架
软件类型 开源软件
地区 国产
投 递 者 索曾琪
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

手写山寨版 spring,学习aop、ioc思想的demo,没看过Spring的源码,因为实在是太庞大了,参考部分网上博客及开源代码完成。面向学习,不面向生产。

IOC

先扫描注解装配,后加载配置文件

注解方式:

@LSBean
public class Service {

    @LSAutowired
    Service2 service2;
    @LSAutowired("service3")
    Service3 service3;

    @LSAround(Action2.class)
    public void test() {
        service2.test();
    }

    public void test2() {
        service3.test3();
    }
}

初始化时会扫描@LSBean注解修饰的类实例化到bean容器中,必须有无参构造函数,目前需要依赖注入的类成员变量只支持@LSAutowired注解注入。 因为是先全部实例化后进行依赖注入,所以不会有循环依赖

@LSConfiguration注解,会扫描LSConfiguration注解的类里的所有@LSBean注解修饰的方法,将返回值注入bean容器,方法参数是需要注入的参数, @LSAutowired标注注入的beanName,发现没法控制加载顺序,所以改成根据方法名排序后执行,所以需要控制同一个配置类里的方法执行顺序的时候方法名可定义成这样:get1XXX,get2XXX

@LSConfiguration
public class TestConfig {

    @LSBean
    public TestConfigDI getTestConfigDI(@LSParam("service3") IService service2, Service3 service3) {
        return new TestConfigDI(service2, service3); 
    }
}

配置文件方式

//beans.json
[
  {
    "name": "testBean2", //在bean容器中的名字
    "className": "com.ls.framework.core.bean.TestBean2", //类名
    "constructor": [10, "${testBean}"], //构造函数的参数,个数和顺序必须一一对应
    "properties": { //成员变量,键值对结构
      "val1": 1,
      "val2": "123",
//      "testBean": "${testBean1}"
    }
  }
]

数组格式,${xxx}表示从bean容器中取名为xxx的bean,需要AOP强化的化必须含有无参构造函数,所以得把被依赖的bean放在上面先实例化,暂未解决循环依赖

AOP

@LSBean
@LSAspect(value = wdemo.webBean2")
public class Action3 extends AopAction {
    @Override
    public void invoke(Invocation invocation) throws Throwable {
        if (invocation.getMethod().isAnnotationPresent(LSAround.class)){
            return;
        }
        System.out.println("aop3 before");
        invocation.invoke();
        System.out.println("aop3 after");
    }

}

继承AopAction实现invoke方法并且加上@LSBean注解即可实现一个切面类实现简单的环切,调用invocation.invoke();继续执行拦截链

@LSAspect注解定义被切入的类,value为包名(必填),cls为切入的类名(选填),cls为空的情况下此拦截器切入包下的所有类

被切入的类必须被实例化在bean容器中

@LSAround可用于类和方法之上,参数为切面类,参数为数组,可传入多个切面类,按顺序执行

优先级为@LSAspect > 类级@LSAround > 方法级@LSAround

@LSClear注解作用于方法上,用于清除作用于的类上的指定切面(传入需要清除的类数组)或清空切面(不传参数)

JDBC

可直接查询javabean, bean数组, beanList,参数只能传基本类型或者基本类型的数组、集合

@LSMapper
public interface TestMapper2 {

    @LSQuery("SELECT * FROM  tbl_result")
    List<ResultBean> selectList();

    @LSQuery("SELECT count(*) FROM  tbl_result")
    long selectCount();


    @LSQuery("SELECT * FROM  tbl_result limit 1")
    ResultBean selectOne();

    @LSQuery("SELECT * FROM  tbl_result WHERE day = ${day} limit 1")
    ResultBean selectOneByDay(@LSDbParam("day")String day);

    @LSQuery("SELECT * FROM  tbl_result")
    ResultBean[] selectArray();

    @LSQuery("INSERT INTO tbl_result VALUES(${day}, ${result})")
    @LSModifying
    long insert(@LSDbParam("result") String result, @LSDbParam("day") String day);

    @LSQuery("UPDATE tbl_result SET result=${result} WHERE day = ${day}")
    @LSModifying
    long update(@LSDbParam("result") String result, @LSDbParam("day") String day);

    @LSQuery("UPDATE tbl_result SET result=${result} WHERE day = ${day}")
    @LSModifying
    void updateWithoutReturn(@LSDbParam("result") String result, @LSDbParam("day") String day);

    @LSQuery("DELETE FROM tbl_result WHERE day = ${day}")
    @LSModifying
    long delete(@LSDbParam("day") String day);

}
 相关资料
  • 本文向大家介绍PHP实现C#山寨ArrayList的方法,包括了PHP实现C#山寨ArrayList的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现C#山寨ArrayList的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的php程序设计有所帮助。

  • ChatGPT的爆火让所有人都始料未及。已跟进的国内互联网大厂中,不乏百度、阿里、京东等传统互联网大厂,商汤科技、科大讯飞等知名AI科技公司也参与其中;不仅如此,退居幕后多年的互联网风云人物李开复、王惠文、王小川等人也争相成立新公司。

  • 队列的典型应用之一是模拟需要以 FIFO 方式管理数据的真实场景。首先,让我们看看孩子们的游戏烫手山芋,在这个游戏中(见 Figure 2),孩子们围成一个圈,并尽可能快的将一个山芋递给旁边的孩子。在某一个时间,动作结束,有山芋的孩子从圈中移除。游戏继续开始直到剩下最后一个孩子。 Figure 2 这个游戏相当于著名的约瑟夫问题,一个一世纪著名历史学家弗拉维奥·约瑟夫斯的传奇故事。故事讲的是,他和

  • 本文向大家介绍手写代码:反转链表 (Java 版)相关面试题,主要包含被问及手写代码:反转链表 (Java 版)时的应答技巧和注意事项,需要的朋友参考一下 参考回答:  

  • 幕布手机版可从官网和 App Store 等各大应用商店下载安装。 你可以直接在 App Store 、腾讯应用宝、小米应用商店等搜索「幕布」。 也可以在手机上点击这个链接,或者扫一扫下面的二维码,可跳转到相应页面进行下载安装。

  • 本文向大家介绍算法题, 手写二分查找(python 版本)相关面试题,主要包含被问及算法题, 手写二分查找(python 版本)时的应答技巧和注意事项,需要的朋友参考一下 参考回答: