- 博客(44)
- 收藏
- 关注
原创 手写SSM框架
这是项目的核心模块,在这个模块实现了一个简单的IOC容器。在这里我们没有实现过时的XML配置而仅通过注解配置来实现Bean的注册,除此之外IOC容器还支持Yaml和XML格式的配置信息读取、、BeanFactoryPostProcessor、Aware等扩展机制。过程文档实现ResourceResolver实现PropertyResolver创建BeanDefinition实例化Bean初始化Bean实现BeanPostProcessor。
2024-04-07 16:05:44 1557
原创 垃圾收集算法
哪些内存需要回收什么时候回收如何回收在之前我们了解的Java运行时内存的各个区域中,其中的程序计数器,虚拟机栈和本地方法栈都是线程私有的,它们随着线程生和灭。因此这些线程私有的区域一般是不需要考虑垃圾回收。而在Java堆和方法区这两个区域有显著的不确定性,只有处于运行期间,我们才能知道程序究竟会创建哪些对象,创建多少个对象,这部分内存的分配和回收是动态的。因此JVM的垃圾收集器主要都是针对堆和方法区的内存管理。
2024-04-10 19:12:47 302
原创 JVM类加载器
JVM设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动 作的代码被称为**“类加载器”**(
2024-04-10 19:12:04 270
原创 Java内存区域
对于C和C++程序员来说,在内存管理上,它们既能拥有每一个对象的所有权,又担负着每一个对象从开始到结束的维护责任。这虽然给了它们对内存操作更大的自由,但也带来了很多繁琐的工作。对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对 的delete/free代码,不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。
2024-04-10 19:11:33 313
原创 HotSpot虚拟机对象
如果Java堆中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称 为“假设Java堆中的内存是规则的,即使用过的内存放在一边,没有使用过的放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个。而在Java中访问对象是非常频繁的操作,因此在JVM中通过使用这种方式来进行对象的访问定位。
2024-04-09 21:44:19 798
原创 类加载的时机
我们使用Java语言编写的文件在编译后都会形成.class类文件,在Class文件中描述了类的各类信息。而这些信息都是需要加载到JVM虚拟机中才能够被运行和使用。因此我们需要了解JVM如何加载这些Class文件,加载Class文件后又会进行什么操作。这段代码不会触发父类的初始化,但会触发“[L 全类名”这个类的初始化,它由虚拟机自动生成,直接继承自 java.lang.Object,创建动作由字节码指令 newarray 触发。
2024-04-09 21:43:43 888
原创 12.SpringMVC与Spring是如何联系的
null) {} else {@Nullable@Nullable这个层次的职责是创建根IOC容器,也就是除Controller层的IOC容器。该类在onStartup调用了,并且又在其中调用了两个抽象方法createRootApplicationContext:创建根IOC容器。++var9) {//....省略这个层次的职责是创建,并且也需要一个IOC容器,这个容器是管理的容器。
2024-04-07 15:57:33 434
原创 11.Spring整合Mybatis的思路
SqlSessionFactoryBean拿到配置信息后构建SqlSession到IOC容器。ClassPathMapperScanner拿到扫描的配置信息后扫描Mapper接口,并将这个Mapper接口替换为MapperFactoryBean生成代理生成的Mapper。
2024-04-07 15:56:36 410
原创 10.搭建Sql执行器
logger.info(“测试结果:{},{},{}”, res, user1List,nums);在搭建了基础框架之后,我们就可以使用执行器Excutor根据XML的信息来执行Sql并拿到值了。我们还仿照了mybatis的日志输出了sql语句,参数和参数类型,以及返回的值。我们还仿照了mybatis的日志输出了sql语句,参数和参数类型,以及返回的值。我们通过传入DataSource必要的配置项来创建了一个德鲁伊的数据源,并通过。进行参数的注入而不是在sql中拼接参数,因此我们仅实现一个。
2024-04-07 15:56:02 633
原创 09.搭建基础框架
负责实现接口的invoke方法,最终所有的实际调用都会调用到这个方法包装的逻辑。是对的包装,对外提供实例化对象的操作。当我们后面开始给每个操作数据库的接口映射器注册代理的时候,就需要使用到这个工厂类了。= null?logger.debug(“解析后的拦截规则为:{}”, proxyRule);if(around!Class
2024-04-07 15:54:31 918
原创 07.实现ProxyFactory
这样,我们只需要一个Bean和一个InvocationHandler就可以创建这个Bean的一个代理对象,最后我们来了解一个这个InvocationHandler是什么。代理实例的调用处理程序实现的一个接口,每一个proxy代理实例都有一个关联的调用处理程序;每一个动态代理类的调用处理程序都必须实现InvocationHandler接口,并且每个代理类的实例都关联到了实现该接口的动态代理类调用处理程序中,将动态生成的代理类字节码文件进行加载生成一个Class对象在堆中,这样就可以拿到代理类对象了。
2024-04-07 15:52:01 236
原创 06.实现BeanPostProcessor
一个Bean如果被Proxy替换,则依赖它的Bean应注入Proxy。在实例化Bean阶段创建实例之前,我们先创建的实例,并在创建实例之后调用的方法替换实例后,替换之后依赖它的Bean注入的实例就是Proxy了。一个Bean如果被Proxy替换,如果要注入依赖,则应该注入到原始对象。在初始化Bean阶段进行注入之前,我们调用的方法处理实例,拿到Bean的原始对象再进行注入。
2024-04-07 15:51:20 293
原创 05.初始化Bean
在创建Bean实例的过程中,我们已经完成了强依赖的注入。中按照Service类型去注入,此时在容器中会存在两个匹配的Bean并且没有标识,因此现在启动容器应当会抛出错误。在该类中,我们顺便测试了@Value的注入,并定义了一个init方法。我们想要测试在这样的情况下,我们的容器是否能够正常注入。除此之外,我们还需要调用Bean的初始化init方法。,我们会抛出错误,因为我们无法判断需要注入哪个实现类。总之,我们需要让容器知道我们需要注入的是哪一个实现类。标注的init方法,就完成了所有Bean的初始化。
2024-04-07 15:50:49 245
原创 04.实例化Bean
读取信息后根据信息去创建Bean。在注册了所有的之后,我们就可以进行Bean的实例创建了。在学习Spring的过程中我们学习到,通常依赖注入的方式有三种:除了以上三种之外,我们还有一种方式:我们可以根据实例化Bean和注入Bean的时机来将这四种种注入分为两种这种方式我们通过调用方法来实例化Bean,在Bean被实例化时,同时也被初始化了。这种方式我们可以在Bean实例化后再通过反射调用方法或者字段来完成注入。然后我们可以分析循环依赖问题,循环依赖问题就是A、B互相依赖,或者A依赖B,B依赖C,C依赖A,
2024-04-07 15:50:11 311
原创 03.创建BeanDefinition
在完成之前两个步骤后,现在我们可以用扫描Class,用获取配置,下面,我们开始可以实现IoC容器。在Spring的IOC容器中每个Bean都有一个唯一标识的名字,Spring还允许为一个Bean定义多个别名,我们简化每个Bean都只有一个名字,我们可以使用一个这样做虽然也可以实现大致的效果,但丢失了大量的Bean定义的信息,不便于我们创建Bean以及解析依赖关系。因此我们应当定义保存从注解中获取到的信息,方便后续创建Bean、设置依赖、调用初始化方法等。
2024-04-07 15:47:57 359
原创 01.实现ResourceResolver
我们知道IOC容器最主要的内容是管理对象的创建和依赖关系的维护,因此我们在实现IOC容器之前我们需要知道哪些类的对象是需要IOC容器管理的。因此我们需要的就是去classpath中去扫描符合扫描包路径的class文件。目前注解开发是最常用的方式,因此我们选择注解来实现注册bean到容器,因此我们首先需要实现。从日志的最后一行来看,我们确实获取到了该包下的类的包路径。我们知道Class文件是Java源代码编译后的文件,经过。来获取该类的Class对象,就可以进行下面的操作了。来对传入的路径进行扫描。
2024-04-07 15:46:02 560
原创 Docker注册Nacos
之后我们可以访问地址:http://192.168.12.134:8848/nacos/(地址是虚拟机的ip地址)我们直接运行容器,docker会自动为我们拉取Nacus的镜像。介绍如何在Docker中部署一个Nacos注册中心。可以看到Nacus的管理界面,说明我们的部署成功了。可以看到Nacos容器和mysql容器都在运行。然后该文件使用Xftp传输到Linux中。我们首先需要一个安装了。
2024-04-06 11:44:04 204 1
原创 GateWay网关
自定义不是直接实现,而是实现。@Component@Override@Override// 获取请求// 编写过滤器逻辑System.out.println("过滤器执行了");// 放行注意:该类的名称一定要以为后缀!然后在yamlspring:cloud:gateway:- PrintAny # 此处直接以自定义的GatewayFilterFactory类名称前缀类声明过滤器还可以指定参数,比较复杂不做展示,我们重点来看,我们使用它来完成登录登录校验。@Component。
2024-04-06 11:43:19 938
原创 Nacos服务注册和服务发现
可以发现,这里Nacos的依赖于服务注册时一致,这个依赖中同时包含了服务注册和发现的功能。因为任何一个微服务都可以调用别人,也可以被别人调用,即可以是调用者,也可以是提供者。启动了一个Nacos注册中心之后,我们就可以将项目注册到注册中心,这样该服务的接口就给微服务的其它提供服务或者调用其它服务的接口。服务发现除了要引入nacos依赖以外,由于还需要负载均衡,因此要引入SpringCloud提供的LoadBalancer依赖。我们这里使用一个购物车和商品的服务来作为实例:购物车服务需要调用商品服务的接口。
2024-04-06 11:41:30 545
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人