四、spring
文章平均质量分 59
包含spring源码和spring教程
lovesman
这个作者很懒,什么都没留下…
展开
-
Spring中单例bean注入多例bean的解决方法
1、问题描述在项目代码的使用过程,单例对象A中需要注入对象B。B对象要求是多例的。我们在对象B上添加注解“@Scope(“prototype”)”,代码运行过程中,发现A中注入的B对象始终是同一个,并没有实现多例的效果。下面展示一些 内联代码片。@Componmentpublic class A {@Autowiredprivate B b}下面展示一些 内联代码片。@Componment@Scope("prototype")public class B { ....}2、原创 2021-08-24 21:23:33 · 2448 阅读 · 2 评论 -
Spring配置问题导入bean被初始化两次
关键的配置如上图1、问题就出在ContextLoaderListener和DispatcherServlet,他们都可以引入spring,而且每个引入都会实例化一次bean。如果把两个引入方式配置到同一个文件,那么就会导致一个bean被实例化两次。但是,当我们使用Spring Bean的时候,只会用到DispatcherServlet下的Bean,而不会用到ContextLoaderListener下的Bean,这就会导致ContextLoaderListener的bean不会被用到。使用Cont...原创 2021-03-10 21:49:07 · 1559 阅读 · 0 评论 -
spring源码环境搭建——环境搭建问题解决
一、找不到符号:AnnotationTransactionAspect解决方法:1、首先下载aspect的jar包并解压;https://www.eclipse.org/aspectj/downloads.php2、将Idea的编译器设置为Ajc:打开:IDEA–Preferences–Build,Execution,Deployment–Compiler–JavaCompiler,...原创 2020-04-01 23:56:31 · 988 阅读 · 0 评论 -
spring源码环境搭建——macOS环境下搭建spring5源码环境
macbook 2019jdk 1.8spring51、下载spring源码网址:https://github.com/spring-projects/spring-framework2、下载安装Gradlehttps://gradle.org/gradle -version出现下图,表示安装成功。Gradle安装详细的教程可以看这里:https://www.jianshu...原创 2020-04-01 23:25:34 · 1739 阅读 · 1 评论 -
Spring技术内幕笔记(1)——IOC容器初始化过程
org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactoryprotected final void refreshBeanFactory() throws BeansException { //在这里进行判断,如果已经有了beanFactory,则销毁并关闭 if (this.hasBeanFactory()) { this.destro原创 2020-05-16 09:18:55 · 287 阅读 · 0 评论 -
springmvc源码01——servlet请求过程
servlet的请求过程符合MVC架构,其中:jsp表示View;设置数据表示model;servlet表示contrillor;springmvc其实是基于servlet架构的!原创 2020-06-27 16:26:32 · 224 阅读 · 0 评论 -
Spring使用——AOP功能测试
基本使用步骤配置类package com.ysy.config;import com.ysy.aop.LogAspect;import com.ysy.aop.MathCalculator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annota原创 2020-06-11 23:42:33 · 440 阅读 · 0 评论 -
Spring使用——读取properties配置文件
配置类package com.ysy.config;import com.ysy.Person;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;/**@author shanyangyang@dat原创 2020-06-11 22:44:14 · 446 阅读 · 0 评论 -
Spring使用——@Profile使用
配置类package com.ysy.config;import com.ysy.bean.DataSource;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Profile;/** * @author shanyangyan原创 2020-06-11 22:39:56 · 363 阅读 · 0 评论 -
Spring使用——自动注入
配置类package com.ysy.config;import com.ysy.Dao.BookDao;import com.ysy.bean.Car;import com.ysy.bean.Color;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context原创 2020-06-11 22:37:04 · 269 阅读 · 0 评论 -
Spring使用——bean生命周期
配置类package com.ysy.config;import com.ysy.bean.Car;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;/** * @author shanyangyang原创 2020-06-11 22:33:22 · 271 阅读 · 0 评论 -
Spring使用——给容器注册组件
配置类/**给容器注册组件:1)包扫描+组件标注注解(@Controller,@Service,@Component,@Repository)[局限:自己写的]2)@Bean [导入的第三方包里面的组件]3)@Import[快速的给容器中导入组件]1)@Import(要导入到容器中的组件),容器中就会自动注册这个组件,id默认是全类名2)@ImportSelecor:返回需要导入的组件的全类名的数组3)ImportBeanDefinitionRegistrar:手动注册bean到容器中4原创 2020-06-11 22:25:29 · 265 阅读 · 0 评论 -
Spring使用——通过配置类注入Bean
配置类@Configuration //告诉spring这是一个配置类@ComponentScanvalue指定要扫描的包Filter[] excludeFilters() default {}; 扫描的时候按照规则排除哪些@ComponentScan(value = "com.ysy",excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class,Service原创 2020-06-10 22:57:38 · 1623 阅读 · 0 评论 -
Spring源码系列01——spring总体介绍
问题:1.描述下BeanFactory。2.BeanFactory和ApplicationContext的区别?3.简述SpringIoC的加载过程。4.简述Bean的生命周期。5.Spring中有哪些扩展接口及调用时机。SpringIOC的大致加载过程看图答题。1.描述下BeanFactory。beafactory是spring框架的顶层接口设计,具有创建bean实例的能力;并且提供了getBean()方法,可以获取bean;2.BeanFactory和ApplicationCont原创 2020-09-15 23:06:05 · 322 阅读 · 0 评论 -
Spring源码系列02——IOC容器加载过程
打印内存区域的工具jol-corespring:@value注解;和赋值语句优先级注册为definition:内置的后置处理器org.springframework.context.annotation.internalConfigurationAnnotationProcessor:解析配置类 ConfigurationClassPostProcessororg.springframework.context.annotation.internalAutowiredAnnotationProce原创 2020-09-19 10:13:56 · 328 阅读 · 0 评论 -
Spring源码系列04——Spring循环依赖的解决方法
Spring循环依赖的解决方法:1、三级缓存一级缓存:private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);二级缓存:private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);三级缓存:private final Map<String, Obje原创 2020-09-22 23:42:31 · 249 阅读 · 0 评论 -
Spring源码系列03——内置后置postprocess处理器深度解析
@ConfigurationbeanFactoryPostprocess对配置类进行cglib动态代理,原因:car.setTank(tank());这个动态代理的目的就是:car.setTank(tank()),会去IOC容器中getBean;而不是直接new一个对象出来。配置类@Configuration注解加与不加的区别?不加@Configuration注解,配置类中@Bean之间的注解就是普通的方法调用,不会添加CGLIB代理重复BeanName的覆盖原则通过scanner扫描到的两个原创 2020-09-24 14:43:28 · 252 阅读 · 0 评论 -
Spring源码系列05——Spring事件监听机制
创建监听器的两个步骤1、事件类继承ApplicationContextEventpackage com.ysy.listener;import org.springframework.context.ApplicationContext;import org.springframework.context.event.ApplicationContextEvent;import org.springframework.stereotype.Component;/** * @author s原创 2020-09-24 23:02:20 · 311 阅读 · 0 评论 -
Spring源码系列06——SpringAOP源码介绍
SpringAOP源码介绍(1)在第一次的beanpostprocess中解析获取到所有的advisor(2)放到advisors集合中创建动态代理的时机:普通bean:初始化之后的后置处理器;(1)循环所有的bean,匹配切点和bean;(2)拿到之前所有的advisor;根据切点表达式,调用aspectJ的api获取到匹配成功的advisor;(3)对匹配上的advisor进行排序;after throwing,after return;after,before;(4)创建代理:如果有接原创 2020-09-28 18:37:58 · 224 阅读 · 0 评论 -
Spring源码系列07——Spring事务管理源码介绍
Spring源码系列07——Spring事务管理源码介绍原创 2020-10-13 08:35:42 · 272 阅读 · 0 评论 -
JDK动态代理与cglib动态代理
(1)创建代理jdk根据接口生成一个proxy.class,调用具体的方法,采用的是反射;cglib采用ASM框架创建字节码文件,会创建多个字节码文件;创建效率:jdk高于cglib(2)调用代理cglib直接调用代理实现类jdk通过反射调用调用效率:cglib高于jdkJDK和CGLIB动态代理区别...原创 2020-10-13 19:51:08 · 314 阅读 · 0 评论 -
Spring源码系列08——Spring事务管理源码介绍
一、SpringMVC调用流程图二、源码分析1、请求到DispatcherServletspringmvc结构在servlet框架的基础上发展而来,请求会交由servlet来进行处理,而我们的DispatcherServlet实现了servlet接口。在springmvc容器初始化的时候会调用initStrategies方法;初始化initHandlerMappings和initHandlerAdapters;protected void initStrategies(ApplicationC原创 2020-10-19 23:11:11 · 316 阅读 · 0 评论 -
Spring源码系列09——Mybatis源码解析
Mybatis对比JDBC的优势:(1)使用连接池管理数据库连接数据库连接,避免了JDBC频繁的连接和断开数据库资源;(2)使用mapper.xml配置文件的形式,将sql语句与java代码分离;(3)mybatis通过parameterType向sql中传递参数,更加灵活;(4)mybatis可以将查询结果自动映射为java对象,避免了jdbc手工写代码的繁琐过程。Mybatis源码解析过程——解析mybtatis-config.xml全局配置文件解析mybatis-config.xml配置文原创 2020-10-25 15:19:33 · 307 阅读 · 0 评论 -
Spring源码系列10——Mybatis执行sql流程分析
一、获取sqlsessionSqlsession中包含了Configuration对象,可以拿到全局配置信息。org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSession()public SqlSession openSession() { return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(),原创 2020-10-26 17:31:12 · 354 阅读 · 0 评论 -
spring源码10——AbstractAutoProxyCreator.postProcessAfterInitialization
根据配置的拦截器创建一个代理/** * Create a proxy with the configured interceptors if the bean is * identified as one to proxy by the subclass. * @see #getAdvicesAndAdvisorsForBean */@Overridepublic Object postProcessAfterInitialization(@Nullable Object bean, Stri原创 2020-06-24 18:50:54 · 396 阅读 · 0 评论 -
spring源码09——AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization
applyBeanPostProcessorsAfterInitialization就是在bean初始化之后,执行的方法。public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException { Object result = existingBean; //获取所有的BeanPostProcessors进行遍历原创 2020-06-24 09:24:08 · 345 阅读 · 0 评论 -
spring源码08——finishBeanFactoryInitialization(beanFactory)
调用链:finishBeanFactoryInitialization(beanFactory)---->DefaultListableBeanFactory.preInstantiateSingletons();类名:DefaultListableBeanFactory对符合条件的bean进行初始化,条件就是:非抽象的,单实例的,非懒加载的public void preInstantiateSingletons() throws BeansException { if (原创 2020-06-24 08:38:23 · 252 阅读 · 0 评论 -
spring源码07——AbstractAutowireCapableBeanFactory.initializeBean
类名:AbstractAutowireCapableBeanFactory#initializeBean protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) { if (System.getSecurityManager() != null) { AccessController.doPrivileged(new Privi原创 2020-06-16 20:09:43 · 579 阅读 · 0 评论 -
spring源码06——AbstractAutowireCapableBeanFactory.doCreateBean
类名:AbstractAutowireCapableBeanFactory protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, Object[] args) { BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { instanceWrapper = (BeanWrapp原创 2020-06-16 20:02:23 · 368 阅读 · 0 评论 -
spring源码05——AbstractBeanFactory.doGetBean
类名:AbstractBeanFactoryprotected <T> T doGetBean(String name, Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { //格式化名称 final String beanName = this.transformedBeanName(name); //尝试从缓存中获取Bean,原创 2020-06-16 19:51:08 · 643 阅读 · 0 评论 -
spring源码04——AbstractApplicationContext.registerBeanPostProcessors
类名:AbstractApplicationContextprotected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { //先获取容器所有的BeanPostProcessor String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false)原创 2020-06-16 19:06:04 · 284 阅读 · 0 评论 -
spring源码03——AbstractApplicationContext.refresh()
类名:AbstractApplicationContextpublic void refresh() throws BeansException, IllegalStateException { synchronized(this.startupShutdownMonitor) { this.prepareRefresh(); ConfigurableListableBeanFactory beanFactory = this.obtainF原创 2020-06-16 17:58:22 · 361 阅读 · 0 评论 -
spring源码01——AnnotationConfigApplicationContext
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Test.class)类名:AnnotationConfigApplicationContext public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { this(); this.registe原创 2020-06-16 13:59:39 · 257 阅读 · 0 评论 -
spring源码02——registerBean源码解析
类名:AnnotatedBeanDefinitionReaderregisterBean(java.lang.Class<?>, java.lang.String, java.lang.Class<? extends java.lang.annotation.Annotation>…)public void registerBean(Class<?> annotatedClass, String name, Class<? extends Annotation&原创 2020-06-16 12:05:13 · 959 阅读 · 0 评论 -
创建AnnotationAwareAspectJAutoProxyCreator
原创 2020-06-16 00:00:17 · 262 阅读 · 0 评论 -
Spring技术内幕笔记(6)——目标对象方法的调用
org.springframework.aop.support.AopUtils#invokeJoinpointUsingReflection public static Object invokeJoinpointUsingReflection(Object target, Method method, Object[] args) throws Throwable { try { //通过反射调用方法 ReflectionUtils.makeAccessi原创 2020-05-20 22:23:55 · 278 阅读 · 0 评论 -
Spring技术内幕笔记(5)——建立AopProxy代理对象
org.springframework.aop.framework.ProxyFactoryBean#getObject public Object getObject() throws BeansException { //初始化通知器链,通知器链封装了一些列拦截器,这些拦截器从配置文件中获取 this.initializeAdvisorChain(); if (this.isSingleton()) { return this.getSing原创 2020-05-19 19:00:45 · 258 阅读 · 0 评论 -
Spring技术内幕笔记(4)——IOC容器的依赖注入
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean//这里是实际获取bean的地方,也是触发依赖注入的地方protected <T> T doGetBean(String name, Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { final Str原创 2020-05-16 16:43:41 · 237 阅读 · 0 评论 -
Spring技术内幕笔记(3)——BeanDefinition在IOC容器中注册
org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException { Assert.hasText(beanName, "Bean nam原创 2020-05-16 10:27:06 · 312 阅读 · 0 评论 -
Spring技术内幕笔记(2)
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate#parsePropertyElements//这里对指定Bean元素的property子元素集合进行解析public void parsePropertyElements(Element beanEle, BeanDefinition bd) { NodeList nl = beanEle.getChildNodes();//遍历所有Bean元素下定义的prop原创 2020-05-16 10:15:26 · 241 阅读 · 0 评论