# 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中
#### 软件架构
软件架构说明

#### 安装教程
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();
}
}
```
#### 参与贡献
#### 特技