spring
jacobbbbbbbb
一个java学习者的学习笔记
展开
-
Spring事务源码解析(2)
处理已经存在的事务private TransactionStatus handleExistingTransaction( TransactionDefinition definition, Object transaction, boolean debugEnabled) throws TransactionException {//如果是never模式就抛出错误 if (definition.getPropagationBehavior() == TransactionDefinit原创 2020-07-07 21:00:58 · 140 阅读 · 0 评论 -
Spring事务源码解析(1)
本文主要从注解式配置入手,例如@Transactional(propagation=Propagation.REQUIRED),而分析的逻辑开始部分是在<tx:annotation-driver transaction-manager="transactionManager"/>这是自定义标签实现在TxNamespaceHandler: public void init() { this.registerBeanDefinitionParser("advice",原创 2020-07-07 16:08:17 · 116 阅读 · 1 评论 -
SpringAOP源码阅读笔记
是否支持aop都是由一个配置文件控制的,也就是aop:aspectj-autoproxy。而这配置方式是自定义配置,因此spring需要注册对应的handler和解析器,通过寻找handler发现,在AopNamespaceHandler中有: @Override public void init() { // In 2.0 XSD as well as in 2.1 XSD. registerBeanDefinitionParser("config", new ConfigBeanDefini原创 2020-06-09 15:04:11 · 88 阅读 · 0 评论 -
SpringIOC源码阅读笔记(11)
5.注册BeanPostProcessor,注意是注册,调用在getbean方法中。 protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); }public static void registerBeanPostP原创 2020-06-05 13:45:57 · 67 阅读 · 0 评论 -
SpringIOC源码阅读笔记(10)
分析完BeanFactory容器的加载,接下来看一下更复杂的容器ApplicationContext的加载,这个容器也是我们目前使用比较多的容器。跟BeanFactory比起来,ApplicationContext有如下区别:1.继承 MessageSource,提供国际化的标准访问策略。2.继承 ApplicationEventPublisher ,提供强大的事件机制。3.扩展 ResourceLoader,可以用来加载多个 Resource,可以灵活访问不同的资源。4.对 Web 应用的支持。原创 2020-06-05 12:44:08 · 148 阅读 · 0 评论 -
SpringIOC源码阅读笔记(9)
bean的创建的最后一步是初始化bean:protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) { if (System.getSecurityManager() != null) { AccessController.doPrivileged((PrivilegedAction<Object>) () -> {原创 2020-06-03 13:43:46 · 76 阅读 · 0 评论 -
SpringIOC源码阅读笔记(8)
上文讲到了创建bean总共有4种方法,已经分析了2种,分别是supplier获取以及工厂方法获取,接下来讲第三种:protected BeanWrapper autowireConstructor( String beanName, RootBeanDefinition mbd, @Nullable Constructor<?>[] ctors, @Nullable Object[] explicitArgs) { return new ConstructorResolver(th原创 2020-06-02 22:48:41 · 120 阅读 · 0 评论 -
SpringIOC源码阅读笔记(7)
创建bean的实现在AbstractAutowireCapableBeanFactory,入口是:@Override protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { if (logger.isDebugEnabled()) { logger.debug("Creating instanc原创 2020-06-02 15:36:54 · 152 阅读 · 0 评论 -
SpringIOC源码阅读笔记(6)
从本文开始进行bean的加载过程的解析。同样的我们可以从一行代码开始:MyTestBean bean = (MyTestBean)bf.getBean(“myTestBean”);首先进入AbstractBeanFactory:@Override public Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false); }代码很长,可以了解获得Bean的主要流程原创 2020-06-02 10:59:41 · 96 阅读 · 0 评论 -
SpringIOC源码阅读笔记(5)
分析完默认标签的解析,接下来分析自定义标签的解析:方法的入口是在DefaultBeanDefinitionDocumentReader的parseBeanDefinitions方法中,转到parseCustomElement,@Nullable public BeanDefinition parseCustomElement(Element ele) { return parseCustomElement(ele, null); }@Nullable public BeanDefiniti原创 2020-05-30 12:12:38 · 90 阅读 · 0 评论 -
SpringIOC源码阅读笔记(4)
上文讲到parsePropertySubElement,分析完这个方法,接着在parseBeanDefinitionElement向下分析:public void parsePropertyElements(Element beanEle, BeanDefinition bd) { NodeList nl = beanEle.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i原创 2020-05-29 23:00:20 · 139 阅读 · 0 评论 -
SpringIOC源码阅读笔记(3)
上篇笔记写到解析element分为解析默认标签以及自定义标签,本文就先从默认标签开始。public static final String IMPORT_ELEMENT = "import";public static final String ALIAS_ATTRIBUTE = "alias";//beanpublic static final String BEAN_ELEMENT = BeanDefinitionParserDelegate.BEAN_ELEMENT;public stati原创 2020-05-29 17:08:13 · 144 阅读 · 0 评论 -
SpringIOC源码阅读笔记(2)
整个ioc的过程可以分为3个步骤:1.资源定位,根据location找到对应的资源。2.装载,将资源解析到对应的beanDefinition。3.注册,将beanDefinition中的对象注册进容器。给一个简单的例子,后面的分析也将从这个例子中展开BeanFactory bf= new XmlBeanFactory(new ClassPathResource(“beanFactory.xml”))classpathresource的定位就不细说了,//XmlBeanFactory的主要实现都原创 2020-05-28 22:51:07 · 128 阅读 · 0 评论 -
SpringIOC源码阅读笔记(1)
刚看完springMVC的源码,感觉spring的容器源码还是掌握不到位,所以打算写一点笔记再理一遍思路。一.Resourcespring给资源提供了封装,根据不同的资源类型有不同的实现类,首先先看下UML图:1.org.springframework.core.io.InputStreamSource顶层接口,其中就定义了一个方法获取输入流:InputStream getInputStream() throws IOException2.org.springframework.core.io原创 2020-05-28 14:02:56 · 202 阅读 · 0 评论