# MyFramework **Repository Path**: guo-dingyi/my-framework ## Basic Information - **Project Name**: MyFramework - **Description**: MyFramework是我用java语言写的一个Web后端框架, MyFramework利用java的反射技术实现了控制反转IOC,依赖注入DI,利用java的动态代理技术实现了面向切面编程AOP - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-03-11 - **Last Updated**: 2025-01-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java ## README # MyFramework #### 介绍 MyFramework是我用java语言写的一个Web后端框架, MyFramework利用java的反射技术实现了控制反转IOC,依赖注入DI,利用java的代理技术实现了面向切面编程AOP, MyFramework舍弃了xml文件方式,完全通过注解进行配置 MyFramework内嵌了tomcat,MyFramework会自动根据注解生成servlet并映射到tomcat中 #### 软件架构 软件架构说明 ![输入图片说明](projectDesign/img.png) #### 安装教程 1. 把项目 clone 到本地 2. maven install 到本地的maven仓库 3. 在另一个Maven项目中添加MyFramework依赖 ``` com.pan MyFramework 1.0-SNAPSHOT ``` #### 使用说明 可请参考项目中的demo 1. 启动类 添加@MyStart注解,调用MyFramework.run(启动类的Class),启动该项目 ``` @MyStart public class Application { public static void main(String[] args) { MyFramework.run(Application.class); } } ``` 2. 控制层 使用注解@MyController,@MyGetMapping,@MyPostMapping 每个方法可以有HttpServletResponse和HttpServletRequest参数,也可以只有一个,或者没有也行 ``` @MyController(name = "demoController",path = "/demo") public class DemoController { @MyInject(name = "simpleJson") private SimpleJson simpleJson; @MyInject(name = "demoService") private DemoService service; @MyGetMapping(path = "/queryAnimal") public String queryAnimal(HttpServletResponse response) throws IOException { response.setContentType("text/json"); response.setCharacterEncoding("utf-8"); List animals = service.queryAnimal(); String json = simpleJson.mapperList(animals); return json; } @MyGetMapping(path = "/queryOne") public String queryOne() throws Exception { Animal animal = service.queryOneAnimal(); String json = simpleJson.mapper(animal); return json; } @MyGetMapping(path="/test") public String test(){ return "{\"message\": \"success\"}"; } } ``` 3. 服务层 使用注解@MyService ``` public interface DemoService { public List queryAnimal(); public Animal queryOneAnimal(); } @MyService(name = "demoService") public class DemoServiceImpl implements DemoService{ @MyInject(name = "demoDao") private DemoDao demoDao; @Override public List queryAnimal(){ return demoDao.query(); } @Override public Animal queryOneAnimal(){ Animal animal = demoDao.query().get(0); return animal; } } ``` 4. 持久层 使用注解@MyDao ``` public interface DemoDao { public List query(); } @MyDao(name = "demoDao") public class DemoDaoImpl implements DemoDao{ @MyInject(name = "dataTool") private DemoDataTool dataTool; public List query(){ try { return dataTool.newMockData(Animal.class,10); } catch (Exception e) { throw new RuntimeException(e); } } } ``` 5. 切面 请使用注解@MyAspect、@MyBefore、@MyAfter,同时由于本项目使用jdk进行代理,所有被代理对象必须要有接口,否则无法代理 代理对象通过@MyBefore、@MyAfter的execution进行设置,格式为 ex:
@MyAfter(execution= "MyFrameworkBeanName@methodName(ParamClassName,ParamClassName,...);"+
"MyFrameworkBeanName@methodName(ParamClassName,ParamClassName,...);"
...)
切面与被代理对象传递参数通过 MyCutArgs 对象进行,切面方法可以设置该参数,或者不写也行 ``` @MyAspect(name="demoAspect") public class DemoAspect { @MyAfter(execution = "demoService@queryOneAnimal();") public void cutResetAnimal(MyCutArgs myCutArgs){ System.out.println("这这是我的后置切面"); MyCutParam param = myCutArgs.getParamByOrder(0); param.setArg(new Animal("野兽",24)); } @MyBefore(execution = "demoService@queryOneAnimal();") public void methodBefore(){ System.out.println("这这是我的前置切面"); } } ``` 6. 其他类 要交给容器管理的类,请使用注解@MyConfig、@MyBean ``` @MyConfig public class DemoConfigure { @MyBean(name = "dataTool") public DemoDataTool setDataBean(){ return new DemoDataTool(); } @MyBean(name = "simpleJson") public SimpleJson setSimpleJson(){ return new SimpleJson(); } } ``` #### 参与贡献 #### 特技