手写山寨版sprig,学习aop、ioc思想的demo,没看过Sprig的源码,因为实在是太庞大了,参考部分网上博客及开源代码完成。面向学习,不面向生产。
IOC
先扫描注解装配,后加载配置文件
注解方式:
@LSBeapublic class Service { @LSAutowired Service2 service2; @LSAutowired("service3") Service3 service3; @LSAroud(Actio2.class) public void test() { service2.test(); } public void test2() { service3.test3(); }}初始化时会扫描@LSBea注解修饰的类实例化到bea容器中,必须有无参构造函数,目前需要依赖注入的类成员变量只支持@LSAutowired注解注入。因为是先全部实例化后进行依赖注入,所以不会有循环依赖
@LSCofiguratio注解,会扫描LSCofiguratio注解的类里的所有@LSBea注解修饰的方法,将返回值注入bea容器,方法参数是需要注入的参数,@LSAutowired标注注入的beaName,发现没法控制加载顺序,所以改成根据方法名排序后执行,所以需要控制同一个配置类里的方法执行顺序的时候方法名可定义成这样:get1XXX,get2XXX
@LSCofiguratiopublic class TestCofig { @LSBea public TestCofigDI getTestCofigDI(@LSParam("service3") IService service2, Service3 service3) { retur ew TestCofigDI(service2, service3); }}配置文件方式
//beas.jso[ { "ame": "testBea2", //在bea容器中的名字 "className": "com.ls.framework.core.bea.TestBea2", //类名 "costructor": [10, "${testBea}"], //构造函数的参数,个数和顺序必须一一对应 "properties": { //成员变量,键值对结构 "val1": 1, "val2": "123",// "testBea": "${testBea1}" } }]数组格式,${xxx}表示从bea容器中取名为xxx的bea,需要AOP强化的化必须含有无参构造函数,所以得把被依赖的bea放在上面先实例化,暂未解决循环依赖
AOP
@LSBea@LSAspect(value = wdemo.webBea2")public class Actio3 exteds AopActio { @Override public void ivoke(Ivocatio ivocatio) throws Throwable { if (ivocatio.getMethod().isAotatioPreset(LSAroud.class)){ retur; } System.out.pritl("aop3 before"); ivocatio.ivoke(); System.out.pritl("aop3 after"); }}继承AopActio实现ivoke方法并且加上@LSBea注解即可实现一个切面类实现简单的环切,调用ivocatio.ivoke();继续执行拦截链
@LSAspect注解定义被切入的类,value为包名(必填),cls为切入的类名(选填),cls为空的情况下此拦截器切入包下的所有类
被切入的类必须被实例化在bea容器中
@LSAroud可用于类和方法之上,参数为切面类,参数为数组,可传入多个切面类,按顺序执行
优先级为@LSAspect>类级@LSAroud>方法级@LSAroud
@LSClear注解作用于方法上,用于清除作用于的类上的指定切面(传入需要清除的类数组)或清空切面(不传参数)
JDBC
可直接查询javabea,bea数组,beaList,参数只能传基本类型或者基本类型的数组、集合
@LSMapperpublic iterface TestMapper2 { @LSQuery("SELECT * FROM tbl_result") List<ResultBea> selectList(); @LSQuery("SELECT cout(*) FROM tbl_result") log selectCout(); @LSQuery("SELECT * FROM tbl_result limit 1") ResultBea selectOe(); @LSQuery("SELECT * FROM tbl_result WHERE day = ${day} limit 1") ResultBea selectOeByDay(@LSDbParam("day")Strig day); @LSQuery("SELECT * FROM tbl_result") ResultBea[] selectArray(); @LSQuery("INSERT INTO tbl_result VALUES(${day}, ${result})") @LSModifyig log isert(@LSDbParam("result") Strig result, @LSDbParam("day") Strig day); @LSQuery("UPDATE tbl_result SET result=${result} WHERE day = ${day}") @LSModifyig log update(@LSDbParam("result") Strig result, @LSDbParam("day") Strig day); @LSQuery("UPDATE tbl_result SET result=${result} WHERE day = ${day}") @LSModifyig void updateWithoutRetur(@LSDbParam("result") Strig result, @LSDbParam("day") Strig day); @LSQuery("DELETE FROM tbl_result WHERE day = ${day}") @LSModifyig log delete(@LSDbParam("day") Strig day);}






评论