Spring框架
文章平均质量分 60
深入理解Spring框架以及源码
煎丶包
这个作者很懒,什么都没留下…
展开
-
【源码】看一看Spring如何使用三级缓存解决循环依赖问题
【源码】看一看Spring如何使用三级缓存解决循环依赖问题我们之前文章讲Bean的创建过程中,提到了如果当前bean依赖的其它bean,就会调用getBean()方法把依赖的bean先创建出来可是你有没有想过,如果当前Bean依赖于另一个Bean,而另一个Bean又就形成了依赖于当前Bean,或者当前Bean依赖于自己,这样依赖关系形成了一个闭环。这就是我们这篇文章将要说的Bean的循环依赖问题!首先我们要明确Spring不是能够解决所有情况下的循环依赖问题的,只能解决:出现循环依赖的Bean原创 2021-09-28 22:18:19 · 618 阅读 · 0 评论 -
从Spring容器刷新过程中的创建Bean阶段来说说Bean的生命周期
从Spring容器刷新过程中的创建Bean阶段来说说Bean的生命周期我们所说的Bean的生命周期指的是从Bean的创建、初始化、使用Bean、销毁的整个过程。而IOC容器就是负责管理Bean的整个生命周期。实际上Bean的生命周期在容器启动的时候就已经开始了,严格来说,你可以认为容器启动时,从注解配置读取器读取标有注解的类,转换为BeanDefinition对象时,Bean的生命周期就已经开始了。打个比方,小宝宝的生命的起点,并不是说从出生落地开始算的,而是从妈妈肚子里面,基本上可以算是生命已经开始了。原创 2021-09-28 02:56:04 · 466 阅读 · 0 评论 -
【源码】走一遍refresh()方法的源码就能弄懂Spring容器的创建过程
【源码】走一遍refresh()方法的源码就能弄懂Spring容器的创建过程Spring框架的两大核心思想,一个是IOC控制反转,另一个就是AOP面向切面编程。而IOC控制反转指的是将创建对象的操作交给Spring容器来解决,容器同一对所有的对象进行管理,我们无需关心创建对象时,对象之间的依赖关系,只需要在使用对象时从容器中获取即可。要想从容器中获取对象来使用,那就必须首先创建出这个Spring容器,这篇文章就来从源码角度出发,来看看Spring容器的创建过程。创建Bean可以使用XML配置文件,也可以原创 2021-09-27 13:17:43 · 314 阅读 · 0 评论 -
注解方式的异步请求
一、Servlet3.0异步请求@WebServlet(value = "/async", asyncSupported = true)public class HelloAsyncServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {原创 2021-06-03 12:08:50 · 167 阅读 · 1 评论 -
注解方式整合SpringMVC
一、整合SpringMVC分析web容器在启动的时候,会扫描每个jar包下的META-INF/services/javax.servlet.ServletContainerInitializer文件,加载这个文件里面指定的类SpringServletContainerInitializerspring的应用一启动就会加载WebApplicationInitializer接口下的所有组件并创建对象WebApplicationInitializer接口下有三个抽象类AbstractContextL原创 2021-06-03 10:12:13 · 284 阅读 · 1 评论 -
注解方式ServletContext注册Web三大组件
注解方式ServletContext注册Web三大组件Servlet组件public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("userServlet原创 2021-06-03 09:28:07 · 178 阅读 · 0 评论 -
Spring容器创建过程——源码总结
Spring容器创建过程源码总结一、Spring容器在启动的时候,会先保存所有注册进来的Bean的定义信息(1)XML注册的bean(2)注解注册的bean二、Spring容器会在合适的时机创建这些Bean(1)用到这个Bean的时候,利用getBean()方法创建bean,创建好以后保存在容器中(2)统一创建剩下的所有Bean的时候,调用finishBeanFactoryInitialization()来创建剩下的单实例Bean三、后置处理器BeanPostProcessor(1)有各种类原创 2021-06-02 13:38:03 · 165 阅读 · 0 评论 -
Spring容器创建过程——容器创建完成
容器创建完成12、refresh()方法调用finishRefresh()方法完成BeanFactory的初始化创建工作,IOC容器就创建完成finishRefresh()方法首先调用initLifecycleProcessor()来初始化和生命周期有关的后置处理器initLifecycleProcessor()方法默认从容器中找是否有id为lifecycleProcessor且类型为LifecycleProcessor的组件,如果没有找到就会创建DefaultLifecycleProcessor原创 2021-06-02 13:26:03 · 156 阅读 · 0 评论 -
Spring容器创建过程——创建Bean
11、refresh()方法调用finishBeanFactoryInitialization()方法,初始化剩下的所有单实例beanfinishBeanFactoryInitialization()方法调用preInstantiateSingletons()方法实例化剩下的所有单实例bean首先获取到所有定义的bean,然后依次进行创建和初始化对象然后遍历所有的bean,获取bean的定义信息接着会判断当前bean是否不是抽象的,且是否是单实例,而且是否是懒加载的如果是,则进一步判断当原创 2021-06-02 09:48:21 · 242 阅读 · 1 评论 -
Spring容器创建过程——初始化事件派发器和监听器
一、初始化事件派发器8、refresh()方法调用initApplicationEventMulticaster()方法初始化事件派发器首先获取BeanFactory然后从BeanFactory中获取id为applicationEventMulticaster且类型是ApplicationEventMulticaster的事件派发器如果上一步容器中没有配置事件派发器,就会创建一个SimpleApplicationEventMulticaster类型的事件派发器,并将这个事件派发器添加到Bean原创 2021-06-01 22:45:45 · 235 阅读 · 1 评论 -
Spring容器创建过程——初始化MessageSource
初始化MessageSource7、refresh()调用initMessageSource()初始化MessageSource组件,这个组件用来处理国际化,以及消息绑定和消息解析首先获取BeanFactory看容器中是否有id为messageSource,且类型为MessageSource的组件。如果有则赋值给messageSource,如果没有就会创建一个DelegatingMessageSource。一般MessageSource用来取出国际化配置文件中某个key的值,还可以按照区域获取信息。原创 2021-06-01 22:01:29 · 403 阅读 · 0 评论 -
Spring容器创建过程——注册BeanPostProcessor
注册BeanPostProcessor6、refresh()调用registerBeanPostProcessors(beanFactory)方法,注册Bean的后置处理器,后置处理器是用来拦截bean创建过程的。不同接口类型的BeanPostProcessor,即继承了BeanPostProcessor接口的子接口,在Bean创建前后的执行时机是不一样的BeanPostProcessorDestructionAwareBeanPostProcessorInstantiationAwareBe原创 2021-05-31 09:40:34 · 349 阅读 · 0 评论 -
Spring容器创建过程——执行BeanFactoryPostProcessor
执行BeanFactoryPostProcessor5、refresh()调用invokeBeanFactoryPostProcessors(beanFactory)执行BeanFactoryPostProcessor的方法。BeanFactoryPostProcessor是BeanFactory的后置处理器,它会在BeanFactory标准初始化之后执行,标准初始化指的就是上篇文章中的前4步。invokeBeanFactoryPostProcessors(beanFactory)方法会先调用get原创 2021-05-30 21:33:31 · 189 阅读 · 2 评论 -
Spring容器创建过程——BeanFactory的创建及预准备
一、BeanFactory预准备1、创建Spring容器对象2、调用refresh()方法刷新容器refresh()方法会在刷新前,调用prepareRefresh()方法进行刷新前的预处理工作prepareRefresh()方法会调用initPropertySources()方法初始化一些属性设置执行完initPropertySources()方法初始化属性之后,还可以调用validateRequiredProperties()方法进行属性的合法校验最后prepareRefresh(原创 2021-05-30 16:45:52 · 593 阅读 · 1 评论 -
扩展原理——@EventListener与SmartInitializingSingleton
一、@EventListener注解使用@EventListener注解可以使得任何方法实现监听@Servicepublic class UserService { @EventListener(classes = {ApplicationEvent.class}) public void listen(ApplicationEvent event){ System.out.println("UserService监听事件:" + event); }}原创 2021-05-29 20:34:29 · 141 阅读 · 0 评论 -
扩展原理——ApplicationListener
一、ApplicationListener应用监听器通过监听容器中发布的事件,事件驱动模型开发。监听ApplicationEvent及其下面的子事件当容器中发布此事件之后,onApplicationEvent()方法会被触发二、基于事件开发的步骤写一个监听器实现ApplicationListener接口来监听某个事件,并把监听器加入到容器中,只要容器中有相关事件的发布,就可以监听到这个事件调用publishEvent()方法发布事件测试三、监听器原理ContextRefreshedE原创 2021-05-29 18:06:30 · 161 阅读 · 0 评论 -
扩展原理——BeanDefinitionRegistryPostProcessor
一、BeanDefinitionRegistryPostProcessor后置处理器BeanDefinitionRegistryPostProcessor接口继承BeanFactoryPostProcessor接口,在所有bean定义信息将要被加载,bean实例还没有创建的时候执行。BeanDefinitionRegistry是bean定义信息的保存中心,以后BeanFactory就是按照BeanDefinitionRegistry里面保存的每一个bean定义信息创建bean实例BeanDefinit原创 2021-05-28 23:01:41 · 1333 阅读 · 0 评论 -
扩展原理——BeanFactoryPostProcessor
一、BeanFactoryPostProcessor后置处理器BeanFactoryPostProcessor是BeanFactory的后置处理器,在BeanFactory标准初始化之后调用,即所有的bean定义已经保存加载到BeanFactory,但是bean的实例还没创建。它可以来定制和修改BeanFactory的内容创建一个自定义的BeanFactory后置处理器MyBeanFactoryPostProcessor,并实现BeanFactoryPostProcessor接口postProce原创 2021-05-28 21:03:40 · 320 阅读 · 0 评论 -
声明式事务源码分析
声明式事务工作原理@EnableTransactionManagement注解会给容器中导入TransactionManagementConfigurationSelector组件@EnableTransactionManagement注解的AdviceMode默认值为ProxyTransactionManagementConfigurationSelector组件会调用selectImports()方法带导入AutoProxyRegistrar和ProxyTransactionManagement原创 2021-05-28 16:30:01 · 77 阅读 · 0 评论 -
AOP原理——总结
AOP原理总结一、 @EnableAspectJAutoProxy注解开启AOP功能二、@EnableAspectJAutoProxy注解会给容器中注册一个AnnotationAwareAspectJAutoProxyCreator组件三、AnnotationAwareAspectJAutoProxyCreator组件是一个后置处理器四、容器的创建流程创建容器对象的时候,会调用refresh()方法刷新容器刷新容器时会调用registerBeanPostProcessors()注册后置处理器,原创 2021-05-28 11:06:53 · 122 阅读 · 0 评论 -
AOP原理——链式调用通知方法
链式调用通知方法在目标方法执行之前,会把所有的增强器转为MethodInterceptor类型的拦截器,变成一个拦截器链,根据这个拦截器链会创建出CglibMethodInvocation对象,进而调用这个对象的proceed()方法来触发拦截器链。返回InterceptorList拦截器链并缓存起来代理对象获取到拦截器链接着会创建CglibMethodInvocation对象,把拦截器链、目标方法、目标对象等相关信息传入,调用proceed()方法触发拦截器链的执行proceed()方法原创 2021-05-28 10:43:54 · 257 阅读 · 0 评论 -
AOP原理——获取拦截器链MethodInterceptor
获取拦截器链MethodInterceptor容器中保存了组件的代理对象,即CGLIB增强后的对象,这个对象里面保存了增强后的详细信息,包括增强器、目标对象等等在执行目标方法div()之前,会先去执行代理对象的拦截方法,即执行CglibAopProxy的intercept()方法advised.getInterceptorsAndDynamicInterceptionAdvice()方法会进一步调用advisorChainFactory.getInterceptorsAndDynamicInter原创 2021-05-27 22:38:37 · 814 阅读 · 0 评论 -
AOP原理——创建AOP代理
一、创建AOP代理AnnotationAwareAspectJAutoProxyCreator是InstantiationAwareBeanPostProcessor类型的后置处理器,它会在每一个bean创建之前,调用postProcessBeforeInstantiation()方法尝试返回一个代理对象。以自定义的MathCalculator和LogAspects这两个Bean为例轮到mathCalculator这个bean执行postProcessBeforeInstantiation()方法原创 2021-05-27 20:30:58 · 243 阅读 · 0 评论 -
AOP原理——AnnotationAwareAspectJAutoProxyCreator分析
一、AnnotationAwareAspectJAutoProxyCreator分析@EnableAspectJAutoProxy注解会通过@Import注解快速导入AspectJAutoProxyRegistrar组件,这个组件会给容器中注册一个名为internalAutoProxyCreator的组件,internalAutoProxyCreator的组件的类型是AnnotationAwareAspectJAutoProxyCreator。通过AnnotationAwareAspectJAutoPr原创 2021-05-27 12:53:36 · 2839 阅读 · 5 评论 -
AOP原理——@EnableAspectJAutoProxy
@EnableAspectJAutoProxy注解源码解析在使用@EnableAspectJAutoProxy注解时,同时也使用@Import注解给容器中导入了AspectJAutoProxyRegistrar组件@Import(AspectJAutoProxyRegistrar.class)public @interface EnableAspectJAutoProxy {}AspectJAutoProxyRegistrar组件实现了ImportBeanDefinitionRegistrar接口原创 2021-05-25 05:37:20 · 500 阅读 · 0 评论 -
Spring注解驱动开发——自动装配
一、@Autowired注解BookService类使用@Autowired注解自动装配BookDao属性@Servicepublic class BookService { @Autowired private BookDao bookDao; public void print(){ System.out.println(bookDao); }}配置类/** * 自定装配 * * spring利用依赖注入(DI),完成对IOC容器原创 2021-05-24 20:32:28 · 195 阅读 · 1 评论 -
Spring注解驱动开发——属性赋值
一、@Value注解在Person的属性上使用@Value注解指定注入值public class Person { @Value("#{20-2}") //SpEL表达式 #{} private Integer id; @Value("张三") //基本数据类型 private String name;}配置类@Configurationpublic class MainConfigOfPropertyValues {原创 2021-05-24 15:07:52 · 104 阅读 · 1 评论 -
Spring注解驱动开发——生命周期
一、@Bean指定初始化和销毁方法Bean的生命周期指的是创建、初始化、销毁的过程。容器管理bean的生命周期,我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法。创建Boy类,自定义初始化和销毁方法public class Boy extends Man { public Boy(){ System.out.println("执行Boy构造方法......"); } public void init()原创 2021-05-24 11:22:17 · 89 阅读 · 0 评论 -
Spring注解驱动开发——组件注册
一、使用@Configuration和@Bean给容器中注册组件/** * 配置类,使用@Configuration注解标识这是一个配置类 */@Configurationpublic class MainConfig { /*@Bean注解:给容器中注册一个bean * class类型为返回值的类型 * id默认是方法名 * */ @Bean(value = "person") public Person person(){ re原创 2021-05-23 18:17:58 · 132 阅读 · 3 评论 -
整合SSM框架
一、Web.xml配置<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.原创 2021-05-11 14:48:00 · 81 阅读 · 0 评论 -
SpringMVC与Spring整合
一、框架整合把SpringMVC和Spring框架整合的目的就是为了使得框架分工明确。SpringMVC的配置文件用来配置和网站转发逻辑以及网站功能(视图解析器、文件上传解析器、支持Ajax等等)。Spring配置文件用来配置与业务有关的功能(事务控制,数据源,等等)。二、SpringMVC和Spring分容器在springMVC.xml文件中可以引入另一个配置文件,但是这样服务器一启动,只有一个IOC容器,即合并以后的大IOC容器。<import resource="spring.原创 2021-05-06 16:48:07 · 289 阅读 · 0 评论 -
Nullable注解和函数式注册对象
一、@Nullable注解@Nullable 注解表示可以为空可以使用在方法上面,表示方法返回可以为空可以使用在属性上面,表示属性值可以为空可以使用在参数上面,表示参数值可以为空二、函数式注册对象 //函数式风格,创建对象,交给Spring进行管理 @Test public void testGenericApplicationContext(){ //1 创建 GenericApplicationContext 对象原创 2021-04-29 00:12:39 · 2526 阅读 · 0 评论 -
Spring5整合日志框架
Spring5框架自带了通用的日志封装,已经移除 Log4jConfigListener,官方建议使用 Log4j2。整合Log4j2日志框架首先引入jar包创建log4j2.xml配置文件<?xml version="1.0" encoding="UTF-8"?><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--原创 2021-04-28 22:14:11 · 296 阅读 · 0 评论 -
Spring中的事务
一、什么是事务事务是数据库操作最基本单元,逻辑上是一组操作,可能一个操作包括多条SQL语句,要么所有SQL语句都执行成功,如果有一个失败,所有的操作都要失败。二、事务四个特性(ACID)原子性一致性隔离性持久性三、Spring的事务管理事务的管理操作一般都是添加在Service层(业务逻辑层)在Spring进行事务管理操作有两种方式:编程式事务管理声明式事务管理声明式事务管理基于注解方式基于XML配置文件方式Spring进行声明式事务管理,底层...原创 2021-04-28 20:34:15 · 181 阅读 · 0 评论 -
JDBCTemplate的使用
一、什么是JDBCTemplateSpring 框架对JDBC进行了封装使用 JdbcTemplate 方便实现对数据库操作二、JDBCTemplate操作数据库——添加功能对应数据库创建实体类public class User { private String userId; private String userName; private String uStatus; public User() { } public User(Str原创 2021-04-27 02:06:37 · 439 阅读 · 0 评论 -
AOP面向切面编程
一、什么是AOP面向切面编程,是利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。可以不通过修改源代码方式,在主干功能里面添加新功能。二、AOP底层实现原理AOP底层使用动态代理第一种:有接口的情况,使用 JDK 动态代理。创建接口实现类代理对象,增强类的方法。//创建接口,定义方法public interface UserDao { public int add(int a, int b);原创 2021-04-26 21:36:47 · 413 阅读 · 0 评论 -
基于注解方式实现Bean的管理
一、什么是注解注解是代码特殊标记,格式为@注解名称(属性名称=属性值, 属性名称=属性值..)。使用注解目的是为了简化 xml 配置。注解可以作用在类、方法、属性。二、创建对象的注解@Component@Service@Controller@Repository四个注解功能都是一样的,都是用来创建bean实例对象,但是@Controller一般用在Web层,@Service一般用在Service层,@Repository一般用在Dao层。三、基于注解方式实现对象创建引入依赖并开原创 2021-04-25 22:31:29 · 108 阅读 · 0 评论 -
基于XML配置文件方式实现Bean的管理
Bean的管理 = 创建对象(XML、注解) + 注入属性(构造器、set方法)一、基于XML方式创建对象 <!--配置User对象创建--> <bean id="User" class="spring5.User"></bean>使用bean标签可以实现对象的创建,其中id属性是唯一标识,class属性是类全路径。创建对象的时候,默认执行五参数构造方法。二、基于XML方式注入属性依赖注入(DI)通过DI来实现注入属性,需要在创建对象的基础.原创 2021-04-23 22:47:51 · 227 阅读 · 0 评论 -
Bean的作用域以及生命周期
一、Bean的作用域Spring默认情况下,创建的Bean都是单实例对象 @Test public void test1(){ //1.加载Spring配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("userBean.xml"); //2.获取配置创建的对象 User user1 = context.getBean("User",原创 2021-04-23 21:27:20 · 320 阅读 · 0 评论 -
使用FactoryBean实现Bean的管理
Spring 有两种类型 bean,一种是我们自己定义的普通 bean,另外一种工厂 bean。普通的bean在配置文件中定义 bean 类型就是返回类型。FactoryBean在配置文件定义 bean 类型可以和返回类型不一样。第一步:创建类,让这个类作为工厂bean,实现接口FactoryBean第二步:实现接口里面的方法,在实现的方法中定义返回的 bean 类型public class MyFactoryBean implements FactoryBean<User>{原创 2021-04-23 20:23:43 · 107 阅读 · 0 评论