spring原理

Spring Boot自动配置原理

放肆的年华 提交于 2020-01-07 21:52:50
Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射。 /** * Load the fully qualified class names of factory implementations of the * given type from {@value #FACTORIES_RESOURCE_LOCATION}, using the given * class loader. * @param factoryClass the interface or abstract class representing the factory * @param classLoader the ClassLoader to use for loading resources; can be * {@code null} to use the default * @throws IllegalArgumentException if an error occurs while loading factory names * @see #loadFactories */ public static List<String> loadFactoryNames(Class<?>

spring-servlet.xml与applicationContext.xml

↘锁芯ラ 提交于 2020-01-07 12:30:04
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> (1)只在applicationContext.xml中配置如下 <context:component-scan base-package="com.login" />   启动正常,但是任何请求都不会被拦截,简而言之就是@Controller失效 (2)只在spring-servlet.xml中配置上述配置   启动正常,请求也正常,但是事务失效,也就是不能进行回滚 (3)在applicationContext.xml和spring-servlet.xml中都配置上述信息   启动正常,请求正常,也是事务失效,不能进行回滚 (4)在applicationContext.xml中配置如下 <context:component-scan base-package="com.login"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> 在spring-servlet.xml中配置如下 <context:component-scan base-package="com.login.web" />   此时启动正常

【死磕 Spring】—— IoC 之 PropertyPlaceholderConfigurer 的应用

吃可爱长大的小学妹 提交于 2020-01-06 14:53:35
本文主要基于 Spring 5.0.6.RELEASE 摘要: 原创出处 http://cmsblogs.com/?p=todo 「小明哥」,谢谢! 作为「小明哥」的忠实读者,「老艿艿」略作修改,记录在理解过程中,参考的资料。 在博客 《【死磕 Spring】—— IoC 之深入分析 PropertyPlaceholderConfigurer》 中了解了 PropertyPlaceholderConfigurer 内部实现原理,它 允许我们在 XML 配置文件中使用占位符并将这些占位符所代表的资源单独配置到简单的 properties 文件中来加载 。这个特性非常重要,因为它我们对 Bean 实例属性的配置变得非常容易控制了,主要使用场景有: 动态加载配置文件,多环境切换 属性加解密 下面我们就第一个应用场景来做说明。 1. 多环境切换 在我们项目开发过程中,都会存在多个环境,如 dev 、test 、prod 等等,各个环境的配置都会不一样,在传统的开发过程中我们都是在进行打包的时候进行人工干预,或者将配置文件放在系统外部,加载的时候指定加载目录,这种方式容易出错,那么有没有一种比较好的方式来解决这种情况呢?有, 利用 PropertyPlaceholderConfigurer 的特性来动态加载配置文件,实现多环境切换 。 首先我们定义四个 Properties 文件,如下:

Spring @CrossOrigin 注解原理(转)

别等时光非礼了梦想. 提交于 2020-01-03 22:37:42
现实开发中,我们难免遇到跨域问题,以前笔者只知道jsonp这种解决方式,后面听说spring只要加入@CrossOrigin即可解决跨域问题。本着好奇的心里,笔者看了下@CrossOrigin 作用原理,写下这篇博客。 先说原理:其实很简单,就是利用spring的拦截器实现往response里添加 Access-Control-Allow-Origin等响应头信息,我们可以看下spring是怎么做的 注:这里使用的spring版本为5.0.6 我们可以先往RequestMappingHandlerMapping 的initCorsConfiguration方法打一个断点,发现方法调用情况如下 如果controller在类上标了@CrossOrigin或在方法上标了@CrossOrigin注解,则spring 在记录mapper映射时会记录对应跨域请求映射,代码如下 RequestMappingHandlerMapping protected CorsConfiguration initCorsConfiguration(Object handler, Method method, RequestMappingInfo mappingInfo) { HandlerMethod handlerMethod = createHandlerMethod(handler, method);

Spring嵌套事务几种情形

北城以北 提交于 2020-01-03 15:46:20
为了方便,使用伪代码表示:) 1、同一个类,两个方法上都有事务 class A { @Transactional function T1() { curd 操作1 T2() } @Transactional function T2() { curd 操作2 抛异常 } } 结果:操作1和操作2都回滚 2、同一个类,被调用的方法上才有事务 class A { function T1() { curd 操作1 T2() } @Transactional function T2() { curd 操作2 抛异常 } } 结果:操作1和操作2 都不 回滚 3、同一个类,主方法上才有事务 class A { @Transactional function T1() { curd 操作1 T2() } function T2() { curd 操作2 抛异常 } } 结果:操作1和操作2都回滚 4、不同类,两个方法上都有事务 class A { @Transactional function T1() { curd 操作1 B.T2() } } class B { @Transactional function T2() { curd 操作2 抛异常 } } 结果:操作1和操作2都回滚 5、不同类,被调用的方法上才有事务 class A { function T1() { curd 操作1 B

Spring MVC

有些话、适合烂在心里 提交于 2020-01-03 00:32:43
SpringMVC框架图 SpringMVC接口解释 DispatcherServlet接口: spring 提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。 HandlerMapping接口: 能够完成客户请求到Controller映射。 Controller接口: 需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。 ViewResolver接口: Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象

nacos 使用记

家住魔仙堡 提交于 2020-01-01 14:29:14
本文记录SpringBoot和SpringCloud与Nacos作为配置中心的整合过程及问题 Nacos官方使用文档: https://nacos.io/zh-cn/docs/what-is-nacos.html 何为配置中心: https://www.cnblogs.com/yelao/p/10741156.html 本文仅记录整合过程中的细节问题 1. Nacos简介 参见官方文档; 2. Nacos安装 参见官方文档,推荐使用 下载编译后压缩包方式 安装 安装完成后,按照官方文档调试可能出现下图问题: startup.sh: [[: not found 问题原因:自行百度 bash与sh区别: 使用bash命令运行: bash startup.sh -m standalone 结果如图 3. nacos 之 spring boot 配置管理 参见官方文档 问题一: 配置文件为yaml格式(阶梯格式)时无法解析 ,如下 配置: 引用: @NacosValue(value="${log.time}",autoRefreshed=true) private String time; 出现异常:无法解析 Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'log.time' in

spring mvc -> springboot

落爺英雄遲暮 提交于 2020-01-01 12:33:29
spring mvc -> springboot 配置方式 1. 配置方式 mvc: spring容器配置:application.xml,对应web.xml的ContextLoaderListener, 扫描除了controller的其他bean servletContext配置:servlet.xml,对应web.xml的DispatcherServlet 加载spring容器: 相当于配置web.xml(servlet3.0), 继承AbstractAnnotationConfigDispatcherServletInitializer,因为spring只要实现了WebApplicationInitializer接口的,spring全部进行加载 实战Spring Boot 2.0系列(五) - Listener, Servlet, Filter和Interceptor - 掘金 Listener Servlet Filter Controller Interceptor 1. listener 配置一个 ServletContext 监听器,使用 @WebListener 标示即可。在 Servlet 容器 初始化 过程中,contextInitialized() 方法会被调用,在容器 销毁 时会调用 contextDestroyed()。 这里在容器初始化时,往

Spring @Async 注解

﹥>﹥吖頭↗ 提交于 2019-12-30 17:44:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1、 spring 在扫描bean的时候会扫描方法上是否包含@async的注解 如果包含的,spring会为这个bean动态的生成一个子类,我们称之为代理类(?),代理类是继承我们所写的bean的,然后把代理类注入进来,那此时,在执行此方法的时候,会到代理类中,代理类判断了此方法需要异步执行,就不会调用父类(我们原本写的bean)的对应方法。 spring自己维护了一个队列,他会把需要执行的方法,放入队列中,等待线程池去读取这个队列,完成方法的执行,从而完成了异步的功能。 我们可以关注到再配置task的时候,是有参数让我们配置线程池的数量的。 因为这种实现方法, 所以在同一个类中的方法调用,添加@Async注解是失效的 !原因是当你在同一个类中的时候,方法调用是在类体内执行的,spring无法截获这个方法调用 2、spring为我们提供了AOP,面向切面的功能(和smartFrame AOP实现原理差不多) 他的原理和异步注解的原理是类似的,spring在启动容器的时候,会扫描切面所定义的类。 在这些类被注入的时候,所注入的也是代理类,当你调用这些方法的时候,本质上是调用的代理类。 通过代理类再去执行父类相对应的方法,那spring只需要在调用之前和之后执行某段代码就完成了AOP的实现了 来源: oschina

spring之IOC DI 笔记详解

☆樱花仙子☆ 提交于 2019-12-29 02:12:41
首先,spring是一个开源框架,作用是降低程序的复杂性,可以整合各种流行框架。它主要的技术是IOC和AOP,这次主要记录IOC和DI的原理及使用 过程是先把jar包导入到工程中——编写配置文件——编写测试文件 1.使用FactoryBean来管理bean,采用了经典的工厂模式,通过从XML文件或属性文件中读取Javabean的定义。 2.BeanFactory实现了IOC控制,而ApplicationContext扩展了BeanFactory,在这个容器中提供了对其他框架的集成,任务调用等企业服务。 ——什么是控制反转和依赖控制? IOC(Inversion of Control):就是通过类来创建实例的工作交给了IOC容器,就是对象的创建是通过容器来实现的,开发代码时直接使用类的实例。 spring支持两种依赖注入(不支持接口注入): 1), setter注入,基于Javabean中的setter方法注入属性值。举例如下所示: 导入spring的jar包到Java project工程中,导入路径为: 第一步:点击项目右键——选择build path——Configure build Path——选择Libraries选项卡——点击Add External JARs...——然后把spring的jar包导入就OK了 第二步:写实体类和配置文件 实体类文件如下所示: package