![](https://img-blog.csdnimg.cn/20190927151132530.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
手写SSM
文章平均质量分 93
通过手写SSM框架,加深对框架的理解以及Java基础和设计模式的使用。
白日905
这个作者很懒,什么都没留下…
展开
-
手写SSM框架
这是项目的核心模块,在这个模块实现了一个简单的IOC容器。在这里我们没有实现过时的XML配置而仅通过注解配置来实现Bean的注册,除此之外IOC容器还支持Yaml和XML格式的配置信息读取、、BeanFactoryPostProcessor、Aware等扩展机制。过程文档实现ResourceResolver实现PropertyResolver创建BeanDefinition实例化Bean初始化Bean实现BeanPostProcessor。原创 2024-04-07 16:05:44 · 1527 阅读 · 0 评论 -
12.SpringMVC与Spring是如何联系的
null) {} else {@Nullable@Nullable这个层次的职责是创建根IOC容器,也就是除Controller层的IOC容器。该类在onStartup调用了,并且又在其中调用了两个抽象方法createRootApplicationContext:创建根IOC容器。++var9) {//....省略这个层次的职责是创建,并且也需要一个IOC容器,这个容器是管理的容器。原创 2024-04-07 15:57:33 · 403 阅读 · 0 评论 -
11.Spring整合Mybatis的思路
SqlSessionFactoryBean拿到配置信息后构建SqlSession到IOC容器。ClassPathMapperScanner拿到扫描的配置信息后扫描Mapper接口,并将这个Mapper接口替换为MapperFactoryBean生成代理生成的Mapper。原创 2024-04-07 15:56:36 · 399 阅读 · 0 评论 -
10.搭建Sql执行器
logger.info(“测试结果:{},{},{}”, res, user1List,nums);在搭建了基础框架之后,我们就可以使用执行器Excutor根据XML的信息来执行Sql并拿到值了。我们还仿照了mybatis的日志输出了sql语句,参数和参数类型,以及返回的值。我们还仿照了mybatis的日志输出了sql语句,参数和参数类型,以及返回的值。我们通过传入DataSource必要的配置项来创建了一个德鲁伊的数据源,并通过。进行参数的注入而不是在sql中拼接参数,因此我们仅实现一个。原创 2024-04-07 15:56:02 · 602 阅读 · 0 评论 -
09.搭建基础框架
负责实现接口的invoke方法,最终所有的实际调用都会调用到这个方法包装的逻辑。是对的包装,对外提供实例化对象的操作。当我们后面开始给每个操作数据库的接口映射器注册代理的时候,就需要使用到这个工厂类了。= null?logger.debug(“解析后的拦截规则为:{}”, proxyRule);if(around!Class原创 2024-04-07 15:54:31 · 898 阅读 · 0 评论 -
08.解析切面类并实现代理类逻辑
AOP通能够生成代理对象后,我们就需要实现代理对象的调用逻辑了原创 2024-04-07 15:53:48 · 612 阅读 · 0 评论 -
07.实现ProxyFactory
这样,我们只需要一个Bean和一个InvocationHandler就可以创建这个Bean的一个代理对象,最后我们来了解一个这个InvocationHandler是什么。代理实例的调用处理程序实现的一个接口,每一个proxy代理实例都有一个关联的调用处理程序;每一个动态代理类的调用处理程序都必须实现InvocationHandler接口,并且每个代理类的实例都关联到了实现该接口的动态代理类调用处理程序中,将动态生成的代理类字节码文件进行加载生成一个Class对象在堆中,这样就可以拿到代理类对象了。原创 2024-04-07 15:52:01 · 217 阅读 · 0 评论 -
06.实现BeanPostProcessor
一个Bean如果被Proxy替换,则依赖它的Bean应注入Proxy。在实例化Bean阶段创建实例之前,我们先创建的实例,并在创建实例之后调用的方法替换实例后,替换之后依赖它的Bean注入的实例就是Proxy了。一个Bean如果被Proxy替换,如果要注入依赖,则应该注入到原始对象。在初始化Bean阶段进行注入之前,我们调用的方法处理实例,拿到Bean的原始对象再进行注入。原创 2024-04-07 15:51:20 · 265 阅读 · 0 评论 -
05.初始化Bean
在创建Bean实例的过程中,我们已经完成了强依赖的注入。中按照Service类型去注入,此时在容器中会存在两个匹配的Bean并且没有标识,因此现在启动容器应当会抛出错误。在该类中,我们顺便测试了@Value的注入,并定义了一个init方法。我们想要测试在这样的情况下,我们的容器是否能够正常注入。除此之外,我们还需要调用Bean的初始化init方法。,我们会抛出错误,因为我们无法判断需要注入哪个实现类。总之,我们需要让容器知道我们需要注入的是哪一个实现类。标注的init方法,就完成了所有Bean的初始化。原创 2024-04-07 15:50:49 · 224 阅读 · 0 评论 -
04.实例化Bean
读取信息后根据信息去创建Bean。在注册了所有的之后,我们就可以进行Bean的实例创建了。在学习Spring的过程中我们学习到,通常依赖注入的方式有三种:除了以上三种之外,我们还有一种方式:我们可以根据实例化Bean和注入Bean的时机来将这四种种注入分为两种这种方式我们通过调用方法来实例化Bean,在Bean被实例化时,同时也被初始化了。这种方式我们可以在Bean实例化后再通过反射调用方法或者字段来完成注入。然后我们可以分析循环依赖问题,循环依赖问题就是A、B互相依赖,或者A依赖B,B依赖C,C依赖A,原创 2024-04-07 15:50:11 · 293 阅读 · 0 评论 -
03.创建BeanDefinition
在完成之前两个步骤后,现在我们可以用扫描Class,用获取配置,下面,我们开始可以实现IoC容器。在Spring的IOC容器中每个Bean都有一个唯一标识的名字,Spring还允许为一个Bean定义多个别名,我们简化每个Bean都只有一个名字,我们可以使用一个这样做虽然也可以实现大致的效果,但丢失了大量的Bean定义的信息,不便于我们创建Bean以及解析依赖关系。因此我们应当定义保存从注解中获取到的信息,方便后续创建Bean、设置依赖、调用初始化方法等。原创 2024-04-07 15:47:57 · 336 阅读 · 0 评论 -
02.实现PropertyResolver
手写SSM IOC读取配置文件的配置信息并支持使用${}格式读取原创 2024-04-07 15:47:20 · 376 阅读 · 0 评论 -
01.实现ResourceResolver
我们知道IOC容器最主要的内容是管理对象的创建和依赖关系的维护,因此我们在实现IOC容器之前我们需要知道哪些类的对象是需要IOC容器管理的。因此我们需要的就是去classpath中去扫描符合扫描包路径的class文件。目前注解开发是最常用的方式,因此我们选择注解来实现注册bean到容器,因此我们首先需要实现。从日志的最后一行来看,我们确实获取到了该包下的类的包路径。我们知道Class文件是Java源代码编译后的文件,经过。来获取该类的Class对象,就可以进行下面的操作了。来对传入的路径进行扫描。原创 2024-04-07 15:46:02 · 516 阅读 · 0 评论