带你手撸Spring AOP/DI/IOC/MVC

一、手撸ioc、di步骤:

1、解析application.yml文件获取需要扫描的包路径

2、创建@Component、@Repository、@Service等注解

3、获取项目编译的根路径,根据获取的扫描包路径,获取所有类的全限定类名,放在list集合

4、根据全限定类名利用反射的isAnnotationPresent判断是否被@Component注解作用,作用的话就将注解中的值作为key,对应的实体对象作为value存入map,从而实现项目启动将对应的类注入容器

5、遍历存储好的map集合,获取每个实体对象的成员属性

6、根据成员属性的class对象,同样使用isAnnotationPresent判断是否被@Resource注解作用,作用的话根据注解里面的值从map里获取对象,然后对成员变量进行赋值

二、手撸aop步骤:

1、解析自动代理配置:<aop:aspectj-autoproxy>,确定是否进行AOP切入

2、创建@Aspect,@Before,@Around等注解

3、遍历存储好的map集合(存入对应注解的值和对应的实体对象),判断实体对象是否被@Aspect注解

4、如果第三步满足,那么拿到实体对象的所有方法进行循环,判断是否被@Before,获取@Before中的目标对象名称和目标方法名称

5、调用JDK/CGLIB动态代理得到目标对象的代理对象,

6、自定义ProxyFactory的newProxyInstance方法(参数传入目标类对象,增强类型,目标方法的值,切面类对象、切面方法对象),使用java的Proxy.newProxyInstance生成代理对象

7、在ProxyFactory的newProxyInstance方法中有了切面对象、切面方法对象,可以利用invoke方法在适当的位置执行,有了目标类对象,方法对象、参数的话在真正调用的时候已通过重写的invoke方法传了进来。此时生成的代理对象就是真正经过增强的代理对象

示例如下:

8、替换掉原来map中对用的实体对象,换成代理对象

三、手撸mvc步骤:

1、创建三个注解:@RestController @RequestMapping @RequestParam

2、将项目改成web:

    pom文件:打包方式改为war,引入servlet相关包

    webapp目录:web.xml

3、配置web.xml文件,设置我们自己创建的DispatchServlet

4、编写DispatchServlet,实现HttpServlet

    通过init方法得到配置文件名---》spring-mvc.xml

    解析xml配置文件得到controller的扫描路径---[cn.hc.contorller.OrderController]

    遍历上一步得到的类路径集合,实例化---》key :bean

5、创建处理器映射器,得到访问路径与方法,访问路径与目标对象的映射

6、创建处理器适配器,得到适配的方法对象和controller目标对象

7、反射调用上一步得到的方法对象和controller目标对象,并且解析@RequestParam,继续适配请求路径中的参数

源码地址:https://gitee.com/fengli3/spring_simulation.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容