spring原理

Spring容器的基本实现

扶醉桌前 提交于 2020-01-17 08:59:00
Spring容器的基本实现 Intellij IDEA ,Spring5.0.1 下面会以一个简单的案例来谈一谈Spring容器的基本实现。 一、搭建Spring的简单工程 搭建简单的Spring工程,目录结构如下:创建一个User对象,编写一个appliacationContext.xml;将User交个Spring去管理。然后从容器中获取该对象 接下来针对下面这段代码进行展开讲解: @Test public void testIOC ( ) throws Exception { // 创建对象 // User user = new User(); // 现在,把对象的创建交给spring的IOC容器 Resource resource = new ClassPathResource ( "applicationContext.xml" ) ; // 创建容器对象(Bean的工厂), IOC容器 = 工厂类 + applicationContext.xml BeanFactory factory = new XmlBeanFactory ( resource ) ; // 得到容器创建的对象 User user = ( User ) factory . getBean ( "user" ) ; } 二、认识一下核心类 2.1 DefaultListableBeanFactory

A component required a bean named xxx that could not be found

亡梦爱人 提交于 2020-01-16 10:59:51
复刻项目过程中,项目启动报错,出现了如图的这个问题 A component required a bean named xxx that could not be found. 这其实是一个很简单的问题,显而易见就是有Bean没有被到注入Spring容器嘛 因为之前写的项目大多都是单体应用,没接触过这种大型的分布式架构项目。这个未被注入的Bean就是API中的一部分,所以我们在写代码时候,虽然可以用引入依赖(在Pom加入jar)的方式,并像其他的bean一样使用@Resource把它当做bean使用。但是在启动类上一定要用@ComponentScan扫描这个包,这样它才会被Spring容器接管 还有一些其他的问题: pom文件中配置,一定要确保自己项目的application.yml是可用的,如图 env下两个目录,第一个是测试yml文件,第二个是本地yml文件 在pom文件中通过以下代码可达到启用任意yml配置文件的效果 <profiles> <profile> <id>dev</id> <properties> <profileActive>dev</profileActive> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile>

Spring事务组件 源码阅读(Spring声明式事务处理)

☆樱花仙子☆ 提交于 2020-01-16 00:41:21
1 设计原理与基本过程 在使用Spring声明式事务处理的时候,一种常用的方法是结合IoC容器和Spring已有的TransactionProxyFactoryBean对事务管理进行配置,比如,可以在这个TransactionProxyFactoryBean中为事务方法配置传播行为、并发事务隔离级别等事务处理属性,从而对声明式事务的处理提供指导。具体来说,在对声明式事务处理的原理分析中,声明式事务处理的实现大致可以分为以下几个部分: 读取和处理在IoC容器中配置的事务处理属性,并转化为Spring事务处理需要的内部数据结构,这里涉及的类是TransactionAttributeSourceAdvisor,从名字可以看出,它是一个AOP通知器,Spring使用这个通知器来完成对事务处理属性值的处理。处理的结果是,在IoC容器中配置的事务处理属性信息,会被读入并转化成TransactionAttribute表示的数据对象,这个数据对象是Spring对事物处理属性值的数据抽象,对这些属性的处理是和TransactionProxyFactoryBean拦截下来的事务方法的处理结合起来的。 Spring事务处理模块实现统一的事务处理过程。这个通用的事务处理过程包含处理事务配置属性,以及与线程绑定完成事务处理的过程

[Java复习] 面试突击 - Spring

微笑、不失礼 提交于 2020-01-15 12:06:25
说说你对Spring 的IoC 机制 的理解? 没有Spring之前: 写一套系统,web服务器,tomcat,一旦启动之后,他就可以监听一个端口号的http请求,然后可以把请求转交给你的servlet,jsp,配合起来使用的,servlet处理请求。 比如在我们的一个tomcat + servlet的这样的一个系统里,有几十个地方,都是直接用MyService myService = new MyServiceImpl(),直接创建、引用和依赖了一个MyServiceImpl这样的一个类的对象。 这个系统里,有几十个地方,都跟MyServiceImpl类直接耦合在一起了。 如果我现在不想要用MyServiceImpl了,我们希望用的是NewServiceManagerImpl,implements MyService这个接口的,所有的实现逻辑都不同了,此时我们很麻烦,我们需要在系统里,几十个地方,都去修改对应的MyServiceImpl这个类,切换为NewServiceManagerImpl这个类。 改动代码成本很大,改动完以后的测试的成本很大,改动的过程中可能很复杂,出现一些bug,此时就会很痛苦。 归根结底,代码里, 各种类之间完全耦合在一起,出现任何一丁点的变动,都需要改动大量的代码 ,重新测试,可能还会有bug。 有Spring之后: Spring IoC,

SSM源码分析之Spring07-手写SpringV1.0

我是研究僧i 提交于 2020-01-12 19:25:57
目录导航 前言 手写SpringV1.0 准备工作 DispatchServlet实现Bean的定位、加载、注册 自定义注解 测试 后记 前言 《SSM源码分析之Spring05-DI实现原理(基于Annotation 注入)》 《SSM源码分析之Spring06-IOC 容器中那些鲜为人知的事儿》 前面的章节我们主要看了一下在spring源码是如何设计管理bean的。这节我们用简单的几个类实现一个核心的IOC功能~ 手写SpringV1.0 准备工作 我们首先整理一下思路: 然后,创建一个maven项目,最后的项目结构如下: pom.xml引入servlet依赖: < properties > <!-- dependency versions --> < servlet.api.version > 2.4 </ servlet.api.version > </ properties > < dependencies > <!-- requied start --> < dependency > < groupId > javax.servlet </ groupId > < artifactId > servlet-api </ artifactId > < version > ${servlet.api.version} </ version > < scope >

Spring Processor 是什么?

蹲街弑〆低调 提交于 2020-01-12 13:55:21
本文内容如有错误、不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢。 文章目录 简述 自定义Processor类 原理 Spring 中的 Processor Spring 实现类 实现 BeanFactoryPostProcessor 实现 BeanPostProcessor Spring Boot 中的 Processor Spring Boot 实现类 实现 EnvironmentPostProcessor 例子 Spring 的例子 BeanFactoryPostProcessor BeanPostProcessor Spring Boot 的例子 EnvironmentPostProcessor 结论 参考资料 简述 Processor 中文翻译:处理器、加工机,这里 Processor 只是一种实现类描述其功能具有处理能力。 在 Spring 中,有两个核心 Processor 接口: BeanPostProcessor 和 BeanFactoryPostProcessor ; 在 Spring Boot 中, 有个核心 Processor 接口: EnvironmentPostProcessor ; 通过阅读 Spring 源码可以学习到许多设计和类命名上的知识,不但可以帮助学习 Spring 框架,而且也可以帮助学习优秀编码习惯。

Spring Boot自动配置原理分析

六月ゝ 毕业季﹏ 提交于 2020-01-12 08:50:46
1.@SpringBootConfiguration注解 @Configuratin注解是Spring框架提供的,表示当前类是一个配置类。 @SpringBootConfiguration注解和 @Configuratin注解都是标识一个可以被组件扫描器扫描的配置类, 只不过 @SpringBootConfiguration是被Spring Boot进行了重新的命名和封装。 2.@EnableAutoConfiguration注解 @EnableAutoConfiguration注解是一个组合注解,由 @AutoConfigurationPackage注解和 @Import({AutoConfigurationImportSelector.class})注解组成。 (1) @AutoConfigurationPackage注解 该注解的主要作用是获取项目主程序类的根目录,从而指定后续组件扫描器要扫描的包位置。 (2) @Import({AutoConfigurationImportSelector.class})注解 3.@ComponentScan注解 @ComponentScan注解是一个组件包扫描器,用于将指定包中的注解类自动装配到Spring的Bean容器中。 @ComponentScan注解具体扫描的包的根路径由Spring Boot项目主程序类所在包位置决定

spring boot原理分析(一):spring boot原理综述

陌路散爱 提交于 2020-01-11 09:41:18
spring boot支持三种Servlet容器+Servlet的模式,tomcat + spring mvc的模式只是其中的一种,另外两种分别是Undertow+Servlet和Jetty+Servlet。我主要在tomcat + spring mvc的架构下开发,因此关于spring boot的原理的探究也会限定在这个模式。 在我的“tomcat + spring mvc原理”的系列文章中,已经对这tomcat和spring mvc的基本原理实现做了介绍(旧坑快填完了,开个新坑O,o)。而spring boot内置了一个嵌入的tomcat包,项目可以直接生成jar包,执行时使用类似java xxxx.jar的命令就能启动。当然也可以设置打包成war包,部署在独立tomcat的服务目录下,这样内置的tomcat就不会被调用。 那么spring boot整合的版本相对于原版有什么优化呢?首先我们来体验一下自动生成的spring boot的应用,这样能够和独立部署的tomcat + spring mvc的模式进行比较。使用idea生成一个spring boot的demo非常简单。新建工程里选定Spring Initializer,Initializer service URL使用默认的https://start.spring.io/ ,项目的基本设置不用改

Spring DI容器的核心原理

五迷三道 提交于 2020-01-11 02:50:41
DI:依赖注入 一 依赖注入的时间: 当Spring IOC 容器完成了Bean 定义资源的定位、载入和解析注册以后,IOC 容器中已经管理类Bean 定义的相关数据,但是此时IOC 容器还没有对所管理的Bean 进行依赖注入,依赖注入在以下两种情况 发生: 1)、用户第一次调用getBean()方法时,IOC 容器触发依赖注入。 2)、当用户在配置文件中将元素配置了lazy-init=false 属性,即让容器在解析注册Bean 定义 时进行预实例化,触发依赖注入。 二 DI 以下可结合源码来看: 寻找入口: AbstractBeanFactory 的getBean() 开始实例化: AbstractAutowireCapableBeanFactory 类实现了ObjectFactory 接口,创建容器指定的Bean 实例对象,同时还对创建的Bean 实例对象进行初始化处理。createBean() 选择Bean 实例化策略:在createBeanInstance()方法中,根据指定的初始化策略,使用简单工厂、工厂方法或者容器的自动装配特性生成Java 实例对象。 执行Bean 实例化:在使用默认的无参构造方法创建Bean 的实例化对象时,方法getInstantiationStrategy().instantiate(

创建spring项目&demo

耗尽温柔 提交于 2020-01-10 02:29:40
  最早学习spring的时候,老是搞不清楚什么是spring什么是spring mvc。看好多人创建项目的教程也是不知道其中的原理,只是生搬硬套的照做,其实就是对spring体系不是太了解。上一节已经说了spring的核心是 核心容器 ,所以只要导入了 context 的包就算是一个spring项目了。当然还需要一个xml的文件控制对哪些对象进行实例化,配置和组装。   知道了创建spring项目的本质,spring项目就可以随意创建了,有以下几种方法   方法一:创建一个java项目,把所有需要的jar包找到然后导入,在手动创建一个xml文件(太麻烦不推荐)   方法二:创建一个maven项目,导入context的maven包,在手动创建一个xml文件。 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring