- 博客(21)
- 收藏
- 关注
原创 实现自定义conditional注解
在上述实现中,MyCondition1,MyCondition2实现了Condition接口的matches方法,并作为参数传递给@Conditional注解,当系统中引入了"com.alibaba.druid.pool.DruidDataSource"类后,MyCondition1的判断为true,AutoConfiguration1被加载,bean1被创建。存在这样一个需求,引入了xx类后,就创建A类型bean对象,否则创建B类型bean对象。针对这两个问题,我们做下改造。我们先来做一个简单的实现。
2024-09-01 17:46:16
247
原创 springFactories原理
本文以spring的配置读取类为例,说明spring boot如何通过spring.factories创建Bean对象。
2024-08-18 20:31:25
642
原创 springBoot启动模拟实现
当前应用中包含spring-boot-starter-web依赖,该依赖存在DispatcherHandler和Servlet,最终被SpringBoot推断为web应用。给SpringApplication添加初始化器,初始化器添加Bean对象到容器中。
2024-06-30 10:51:35
203
原创 java泛型
上述的arrayList是使用泛型的过程中非常常见的例子,arrayList指定了接收的元素类型为String,如果往arrayList添加其他类型元素,则会报编译异常。那么ArrayList则默认接收Object类型元素,这也是jdk1.5之前,java还没有泛型机制时,集合元素的存储类型。T可以写为任意标识,常用T、E、K、V等型式的参数来标识泛型。如果在new ArrayList的时候,没有指定元素类型。泛型定义格式:修饰符 class 类名{}
2024-06-23 13:49:51
212
原创 spring参数解析器
(3)@ModelAttribute 通过key=value的方式将请求参数值赋值给方法,并且可以使用1或多个key=value映射 来构造 对象。(2)@RequestParam 通过key=value的方式将请求参数值赋值给方法。(1)@PathVariable 通过占位符获取特定位置的请求参数值并赋值给方法。本文介绍常见参数处理器的使用场景。
2024-06-23 10:43:27
247
原创 模拟实现AOP调用链
1. proceed() 方法调用链中下一个环绕通知。访问根节点 = 执行proced方法。访问右节点 = 执行 after方法。2. 每个环绕通知内部继续调用 proceed()先访问左节点 = 先执行Before方法。3. 调用到没有更多通知了, 就调用目标方法。
2024-06-21 00:21:14
212
原创 Aop代理创建时机
在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a6d89eb39f114128b5647ff561d52b9a.png。在Bean实例创建后,依赖注入前,创建代理。也可以说是在init方法前创建代理。2. 实例创建后, 依赖注入前 (有循环依赖时), 并暂存于二级缓存。b. 依赖注入与初始化不应该被增强, 仍应被施加于原始对象。Bean1的init方法执行后,代理对象被创建。Bean2使用的是代理后的Bean1。Bean1和Bean2存在循环依赖。
2024-06-20 08:04:27
330
原创 jdk代理模拟
方法2可以对foo方法做各种类型的增强,但是当Foo类不止一个方法需要增强,并且动态的选择调用哪一个方法时,方法2就无法解决了。当做参数传到InvocationHandler的invoke方法内,也就是被增强方法被当做参数传到了增强方法内。本文模拟实现了jdk代理,从固定逻辑到策略模式,从代理单个方法到代理多个方法,循序渐进。实现不同的InvocationHandler接口即可调用不同的方法。调用proxy.foo方法时,将Foo接口的foo方法。将被增强的方法作为参数从而实现代理不同的方法。
2024-06-16 15:44:18
463
原创 Spring Ajc增强
因为MyAspect并没有添加@Component注解,所以MyAspect并没有被Srpring管理。上述代码实际上是使用aspectJ来实现增强。发现foo内部加入了切面方法,实现了增强。
2024-06-15 08:33:38
335
原创 bean线程安全问题
在单例Bean中,如果在类中声明成员变量,并且有读写操作(有状态的),就会出现线程不安全问题。总结:有状态的单例bean线程不安全,无状态的单例Bean线程安全。把成员变量声明在方法中,那么单例Bean就是线程安全的了。由此可知,bean并不是线程安全的。bean线程安全嘛?
2024-06-13 08:28:29
167
原创 Autowired运行分析
(2)bean工厂对DependencyDescriptor进行解析即可以获取到属性,方法和方法参数的值。autowired在注入时会使用InjectedMetaData来获取属性和方法的值,并进行注入。(1)DependencyDescriptor记录了属性,方法,方法参数的描述信息。(1)和(2)都是metadata.inject()方法内部执行的步骤的简化。dd3描述了setHome方法的第一个参数,对dd3进行解析,获取该参数的值。
2024-06-05 08:31:09
172
原创 SpringBean生命周期
提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
2024-06-04 08:19:01
234
原创 Bean生命周期加载模板方法
在一个方法中有固定的流程,固定的部分方法,会变的部分方法。可以将会变的方法设计为抽象方法,在使用过程中,添加不同的实现类来即可实现不同的功能。
2024-04-21 20:09:29
113
1
原创 BeanFactory后处理器
Autowired无法确定inter使用的是哪一个实现类。将inter对象的名字改为bean3,就可以创建bean3对象了。因为当@Autowired发现注解的对象有多个实现类时,会寻找是否有类名和注解的对象名一样。使用@Resource注解按名字获取bean对象同时添加@Autowired和@Resources注解后,按照后处理器的添加顺序决定使用哪个注解的匹配规则来寻找Bean对象。由于Autowired处理器在前,所以先使用Autowired注解来获取bean对象。
2024-04-20 18:46:41
272
原创 BeanFactoty实现
beanFactory不会做的事情(1)不会主动调用BeanFactory后处理器(2)不会主动添加Bean后处理器(3)不会 主动初始化单例(4)不会解析BeanFactory,不会解析${}与#{}而ApplicationContext将以上4件事都做好了。
2024-04-20 16:05:13
416
原创 Application功能
MessageSource可以处理国际化资源,可以在Resources中配置编码对应的各国语言翻译来实现国际化功能。ResourcePatternResolver可以获取资源获取配置信息发布UserRegisterdEvent事件监听事件ApplicationContext和BeanFactory之间并不仅仅是继承的关系,而且ApplicationContext拥有BeanFactory对象。
2024-04-20 14:24:43
352
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人