Spring
文章平均质量分 88
详解Spring的使用及原理分析
Java识堂
这个作者很懒,什么都没留下…
展开
-
Spring IOC源码解析:Spring容器启动流程
基本概念Spring是一个IOC容器当我们不用Spring进行开发时,我们需要在代码中设置对象的依赖关系。当我们用了Spring之后,由Spring来管理这种依赖关系,当我们想使用对象时,直接从Spring容器中获取即可BeanDefinition在Spring中对象被叫做Bean,因为Spring Bean在Java类的基础上增加了很多概念,比如scope(作用域),isLazyInit(是否延迟初始化),isSingleton(是否单例),此时Java类不能完整的描述,所以需要新的定义描述类,.原创 2021-03-30 14:47:06 · 664 阅读 · 3 评论 -
Spring IOC源码解析:Spring Bean生命周期详解(一)
介绍参考博客[1]原创 2022-01-13 17:37:50 · 644 阅读 · 0 评论 -
Spring IOC源码解析:Spring Bean生命周期详解(二)
BeanFactoryPostProcessor和BeanPostProcessor书接上文,如果我们要对Spring进行扩展,一般有如下方法实现BeanFactoryPostProcessor接口实现BeanPostProcessor接口BeanPostProcessor接口的使用我会在文章最后写一个Demo,先演示一下BeanFactoryPostProcessor接口的作用,对BeanFactory进行扩展public class MyBeanFactoryPostProcessor .原创 2022-01-02 10:13:10 · 463 阅读 · 1 评论 -
Spring IOC源码解析:@Resource和@Autowired有啥区别?
自动绑定(Autowiring)模式模式说明no默认值,未激活 Autowiring,需要手动执行依赖注入对象byName根据被注入属性的名称作为Bean名称进行依赖查找,并将对象设置到该属性byType根据被注入属性的类型作为依赖类型进行查找,并将对象设置到该属性constructor特殊的byType类型,用户构造器参数@Autowired是Spring中的注解,@Resource是JSR-250中提供的注解,即Java提供的注解,从包名就可以看出.原创 2022-01-18 17:02:30 · 181 阅读 · 0 评论 -
Spring AOP源码解析:详解Spring AOP的前世今生
Spring AOP概述本节我们先对Spring AOP有一个整体的认识,后面我会用3节对一些细节性的内容进行介绍AOP这种设计理念常见的概念如下AOP的主要应用场景如下Spring AOP的实现主要经历了2代第一代:spring1.x版本,自己实现了AOP的功能第二代:spring2.x版本,Spring集成了AspectJ的实现Spring AOP一代当我们要基于现成的实现增加横切逻辑时,首先需要找到哪些地方增强,我们就用Pointcut来进行筛选吧先写一个Service方便后面.原创 2022-01-01 18:48:36 · 489 阅读 · 0 评论 -
Spring AOP源码解析:解析切面
介绍AbstractAdvisorAutoProxyCreator#getAdvicesAndAdvisorsForBeanAbstractAdvisorAutoProxyCreator#findEligibleAdvisors获取所有的Advisor,进行筛选AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisorsAnnotationAwareAspectJAutoProxyCreator重写了findCandidateAd.原创 2021-12-30 20:00:59 · 917 阅读 · 0 评论 -
Spring AOP源码解析:生成代理对象
介绍参考博客原创 2021-12-30 19:27:02 · 1157 阅读 · 0 评论 -
Spring AOP源码解析:执行切面
介绍通过递归的方式执行拦截器链参考博客[1]https://www.tianxiaobo.com/2018/06/22/Spring-AOP-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-%E6%8B%A6%E6%88%AA%E5%99%A8%E9%93%BE%E7%9A%84%E6%89%A7%E8%A1%8C%E8%BF%87%E7%A8%8B/原创 2021-12-30 20:08:09 · 920 阅读 · 0 评论 -
Spring AOP源码解析:Spring处理循环依赖只使用二级缓存可以吗?
什么是循环依赖?先说一下什么是循环依赖,Spring在初始化A的时候需要注入B,而初始化B的时候需要注入A,在Spring启动后这2个Bean都要被初始化完成Spring的循环依赖有4种场景构造器的循环依赖(singleton,prototype)属性的循环依赖(singleton,prototype)spring目前只支持singleton类型的属性循环依赖构造器的循环依赖@Componentpublic class ConstructorA { private Construc.原创 2022-01-07 23:00:25 · 1456 阅读 · 3 评论 -
Spring AOP源码解析:Spring事务实现原理
不用Spring管理事务?让我们先来看一下不用spring管理事务时,各种框架是如何管理事务的使用JDBC来管理事务使用Hibernate来管理事务业务逻辑和事务代码是耦合到一块的,并且和框架的具体api绑定了。当我们换一种框架来实现时,里面对事务控制的代码就要推倒重写,并不一定能保证替换后的api和之前的api有相同的行为。基于这些问题,Spring抽象了一些事务相关的顶层接口,我们面向接口编程,换框架时只要换具体的实现即可。有点像JDBC API的味道了数据访问技术Plat.原创 2022-01-02 16:01:12 · 2352 阅读 · 7 评论 -
Spring源码解析:事件实现及注意事项
参考博客[1]https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop-ataspectj-advice-ordering[2]https://www.cnblogs.com/csyh/articles/13246574.html原创 2022-01-06 20:09:02 · 778 阅读 · 2 评论 -
Spring源码解析:Enable**注解是如何实现的?
介绍在使用Spring的时候,我们只需要一个Enable注解就能实现开启一个模块的功能,非常的方便,那么这个功能是如何实现的?我们常用的Enable注解如下所示注解作用@EnableAspectJAutoProxy开启AspectJ自动代理@EnableAsync开启异步方法支持@EnableScheduling开启定时任务支持@EnableWebMVC开启web mvc支持@EnableTransactionManagement开启注解式事务支.原创 2021-03-17 22:44:43 · 636 阅读 · 0 评论 -
Spring MVC源码解析:你需要了解的Servlet
Servlet的那些特性因为Spring MVC是基于Servlet进行扩展的,为了更好的理解源码,我们需要对Servlet有一些了解,我们先来用Servlet开发一个Web应用。@WebServlet(urlPatterns="/index", initParams = { @WebInitParam(name = "library.name", value = "javashitang")})public class IndexServlet extends HttpServl.原创 2017-07-12 17:34:16 · 2902 阅读 · 0 评论 -
Spring MVC源码解析:基于Servlet手写一个Spirng MVC
Spring MVC执行流程Spirng MVC的执行流程是一个非常重要的知识点,它可以让我们很清楚的了解Spring MVC是如何工作的,后面我们会通过源码的方式整个流程以及涉及到的组件。再开始分析之前,我打算基于Servlet手写一个Spirng MVC,这样你就能明白大概的执行流程,不至于在看源码的时候太晕。定义注解@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Controlle.原创 2020-03-21 23:58:40 · 1213 阅读 · 2 评论 -
Spring MVC源码解析:Spring MVC启动流程
基于XML配置的容器启动过程我们常用的Spring MVC是基于Servlet规范实现的,所以我们先来回顾一下Servlet相关的内容。如果我们直接用Servlet来开发web应用,只需要继承HttpServlet,实现service方法即可,HttpServlet继承自Servlet,Servlet中常用的方法如下public interface Servlet { // 初始化,只会被调用一次,在service方法调用之前完成 void init(ServletConfig con.原创 2022-01-01 17:34:34 · 539 阅读 · 0 评论 -
Spring MVC源码解析:各种类型Handler的注册和查找
为什么要有HandlerMapping和HandlerAdapter这2个组件?在学习Spring MVC的时候,我们会经常看到如下的流程图。其中有2个非常重要的组件,HandlerMapping和HandlerAdapterHandlerMapping是根据请求的url找到对应的handlerHandlerAdapter则是根据找到的handler执行对应的方法,然后返回ModelAndView我当时看到这2个类的时候就觉得这2个类是不是叫ControllerMapping和Controll.原创 2020-05-17 20:09:31 · 1263 阅读 · 0 评论 -
Spring MVC源码解析:各种类型Handler的执行
RequestMappingHandlerAdapter初始化在之前的文章我们分析了handler的实现方式有三种实现Controller接口实现HttpRequestHandler接口使用@RequestMapping注解这三种handler的实现方式对应的adapter为方式对应的adapter实现Controller接口SimpleControllerHandlerAdapter实现HttpRequestHandler接口HttpRequestHandl.原创 2021-04-04 14:10:12 · 800 阅读 · 0 评论 -
Spring MVC源码解析:参数解析器,简化参数取值过程
介绍参数解析器有什么作用呢?就是将你通过http提交的参数,转化成controller方法的参数。这样你就能很方便的从请求中拿到所需的参数,举几个常用注解的用法Spring MVC参数解析器的用法将需要的参数写出来,spring mvc自动帮你注入,如java.servlet.ServletRequestjava.servlet.ServletResponsejavax.servlet.http.HttpSession@PathVariable@RequestParam@RequestH.原创 2021-04-03 12:15:25 · 972 阅读 · 0 评论 -
Spring MVC源码解析:返回值处理器,处理多种返回值类型
介绍HandlerMethodReturnValueHandler// 是否支持该返回类型boolean supportsReturnType(MethodParameter returnType);// 处理返回值逻辑void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType, ...原创 2021-04-03 16:40:51 · 817 阅读 · 0 评论 -
Spring MVC源码解析:异常解析器,统一处理处理请求中发生的异常
介绍@NullableModelAndView resolveException( HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex);HandlerExceptionResolverComposite组合了3个异常解析器ExceptionH...原创 2020-06-14 15:39:23 · 1470 阅读 · 0 评论 -
Spring MVC源码解析:自定义组件的注入方式有多少种?
介绍当我们开发Web项目时,当想增加自定义配置的时候,可以通过如下几种方式来实现实现WebMvcConfigurer接口继承WebMvcConfigurerAdapter继承WebMvcConfigurationSupport继承WebMvcConfigurerAdapter的方式已经被废弃了,为什么被废弃呢?我们在开发的过程中提供一个接口时,一般会同时提供一个Adapter类,Adapter类实现这个接口。我们就可以继承这个Adapter类,按照需求覆盖相应的方式,而不用实现接口,然后一.原创 2021-04-02 19:03:07 · 318 阅读 · 0 评论 -
Spring Boot源码解析:Spring 和 Spring Boot 有哪些区别?
手写一个Spring Boot当别人问你Spring和Spring Boot的区别时,你可能会随口而出应用可以直接运行,而不用打成jar包再放到tomcat中运行当使用某些功能时,引入相应的starter即可,不用再配置各种Bean了其实我觉得自动装配才是Spring Boot最大的创新。应用直接运行我们用嵌入式tomcat就可以办到。我们把之前的spring mvc项目改为直接运行依赖如下<dependency> <groupId>org.springfram.原创 2022-01-01 19:30:56 · 988 阅读 · 0 评论 -
Spring Boot源码解析:详解Spring Boot启动流程
介绍Spring Boot相对于Spring在启动流程上来说并没有太大的区别,只是借助于SpringApplication将启动过程模版化了,并在其中增加了批量注册,自动装配的功能,并开放了一系列的扩展点对了还有一个重要的区别,原来基于servlet的web应用,是由servlet容器如tomcat来启动spring容器,现在是spring容器来启动servlet容器常见的扩展点有如下几种SpringApplicationRunListenerSpringApplicationRunListen.原创 2022-01-01 19:35:01 · 658 阅读 · 0 评论 -
Spring Boot源码解析:Spring Boot 自动装配是如何实现的?
Enable注解是如何实现的?当我们使用Spring Boot的时候,只需要在启动类上加@SpringBootApplication注解即可,非常方便。@SpringBootApplication是一个复合注解@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan其中自动装配的功能就是由@EnableAutoConfiguration注解实现的,那么@EnableAutoConfiguration是如何实现这个神奇的功能的?.原创 2022-01-01 17:43:03 · 437 阅读 · 0 评论 -
Spring Boot源码解析:Condition注解
介绍public class OnLinuxCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Environment environment = context.getEnvironment(); String osName = environment.getProperty("os.nam.原创 2021-12-30 19:19:02 · 563 阅读 · 0 评论 -
Spring源码解析:@Autowired,@Value需要的值是如何被注入的?(AutowiredAnnotationBeanPostProcessor)
介绍AutowiredAnnotationBeanPostProcessor是在容器启动时就会被注入到容器中的BeanPostProcessor,用来支持@Autowired,@Value,@Inject注解AutowiredAnnotationBeanPostProcessor的继承关系如图所示根据Bean的生命周期可以得出在Bean创建的过程中会依次调用如下方法SmartInstantiationAwareBeanPostProcessor#determineCandidateConstru.原创 2021-03-31 11:21:33 · 716 阅读 · 0 评论 -
搞定Spring:ImportAware接口有啥作用?(ImportAwareBeanPostProcessor)
介绍在《搞定Spring:Enable**注解是如何实现的?》介绍了一下@Import注解的使用,和@Import相关的还有一个ImportAware接口@Import注解注入Bean的方式有如下三种基于Configuration Class基于ImportSelector接口基于ImportBeanDefinitionRegistrar接口基于ImportSelector接口和ImportBeanDefinitionRegistrar接口的方式都可以从方法上获取AnnotationMet.原创 2021-03-30 23:11:00 · 1796 阅读 · 2 评论 -
@RequestMapping的注册及查找过程
介绍一个@RequestMapping请求的流程如下通过RequestMappingHandlerMapping返回HandlerMethod这种类型的handler找到能处理HandlerMethod的RequestMappingHandlerAdapterRequestMappingHandlerAdapter执行业务逻辑返回ModelAndView参考博客...原创 2020-05-03 14:39:03 · 1572 阅读 · 0 评论 -
2w字搞懂Spring Bean的一生
基本概念Spring是一个IOC容器当我们不用Spring进行开发时,我们需要在代码中设置对象的依赖关系。当我们用了Spring之后,由Spring来管理这种依赖关系,当我们想使用对象时,直接从Spring容器中获取即可BeanDefinition在Spring中对象被叫做Bean,因为Spring Bean在Java类的基础上增加了很多概念,比如scope(作用域),isLazyInit(是否延迟初始化),isSingleton(是否单例),此时Java类不能完整的描述,所以需要新的定义描述类,.原创 2021-05-27 01:14:30 · 594 阅读 · 2 评论 -
Spring Boot源码编译
2.x下载代码,执行如下命令即可mvn clean install -DskipTests -Pfast如果下面的执行,会自己给你下载一个maven,然后用下载的maven(一般不用这种方式,比较慢)./mvnw clean install -DskipTests -Pfast我编译过程中出现了一个如下错误([ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.6.0:exec (gradle) on pro原创 2021-03-27 13:33:17 · 829 阅读 · 0 评论 -
面试官:Spring AOP是怎么实现的?
介绍Spring AOP的实现和IOC的实现比起来还是比较简单的。在正式介绍流程之前,先介绍一个接口public interface BeanPostProcessor { // 在bean初始化之前执行 @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } // 在Bean初始化之后执行原创 2020-06-27 14:23:11 · 8716 阅读 · 2 评论 -
面试官:Spring如何解决循环依赖?
介绍先说一下什么是循环依赖,Spring在初始化A的时候需要注入B,而初始化B的时候需要注入A,在Spring启动后这2个Bean都要被初始化完成Spring的循环依赖有两种场景构造器的循环依赖属性的循环依赖构造器的循环依赖,可以在构造函数中使用@Lazy注解延迟加载。在注入依赖时,先注入代理对象,当首次使用时再创建对象完成注入属性的循环依赖主要是通过3个map来解决的构造器的循环依赖@Componentpublic class ConstructorA { private Co.原创 2020-06-21 19:32:25 · 1461 阅读 · 0 评论 -
Spring源码编译,导入IDEA,调试源码
安装Gradle因为Spring项目是用Gradle管理的,所以得先安装Gradle,本文编译的源码版本为5.2.2.RELEASE最好用和源码一个版本的gradle,不然会有各种问题,直接访问源码中带的链接即可新建环境变量export GRADLE_HOME=/Users/peng/software/gradle-5.6.4export PATH=$PATH:$GRADLE_HOME/bin命令行输入gradle -v输出版本则表示安装正确spring项目github地址:htt原创 2020-03-02 21:39:32 · 2950 阅读 · 0 评论