spring原理

java技术栈

99封情书 提交于 2020-02-12 04:22:24
1 java基础: 1 算法 1.1 排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序 1.2 二叉查找树、红黑树、B树、B+树 1.3 BitSet解决数据重复和是否存在等问题 2 基本 2.1 字符串常量池的迁移 jdk1.6,string in PermGen永久代,方法区,在运行时大小不可扩展, jdk1.7,string in heap,-XX:StringTableSize=1009(default),WeakHashMap<String, WeakReference<String>> jdk1.8,string in heap,default table size 25-50K 2.2 字符串KMP算法 2.3 equals和hashcode 2.4 泛型、异常、反射 2.5 string的hash算法 2.6 hash冲突的解决办法:开放定址法和拉链法 2.7 foreach循环的原理 2.8 static、final、transient等关键字的作用 2.9 volatile关键字的底层实现原理 2.10 Collections.sort方法使用的是哪种排序方法 2.11 Future接口,常见的线程池中的FutureTask实现等 2.12 string的intern方法的内部细节,jdk1.6和jdk1

08.Spring 应用之 Event

时光总嘲笑我的痴心妄想 提交于 2020-02-12 02:06:59
代码已经上传至 https://github.com/masteryourself/study-spring.git ,分支是 master ,工程是 study-spring-framework 1. Event 1.1 ApplicationListener 监听容器中发布的事件,事件驱动模型开发 监听 ApplicationEvent 及其子类的事件 1.2 @EventListener 可以使用注解简化开发,原理是通过 EventListenerMethodProcessor 处理器解析方法上的 @EventListener 注解 2. 代码 1. MyAnnotationListener @Component public class MyAnnotationListener { @EventListener ( classes = { ApplicationEvent . class } ) public void applicationEventListen ( ApplicationEvent event ) { System . out . println ( "MyAnnotationListener 接收到事件:" + event . getClass ( ) ) ; } } 2. MyApplicationListener @Component public

Spring实践第三天 (SpringDI:依赖注入)

梦想与她 提交于 2020-02-12 01:53:23
如下图,昨天已经进行过依赖注入, 今天的项目实践如果看不懂就请参考我昨天实践写的博文: Spring实践第三天 (SpringDI:依赖注入) 1.什么是自动装配? 自动装配即 无需配置类之间的依赖关系! 基于xml实现bean的自动装配,也就是红框里对依赖的手动配置都要删掉不要了。 2.怎样自动装配?(原理) 依赖注入方式:手动装配和自动装配 手动装配:一般通过配置xml文件来完成关系装配,比如构造方法,setter方法 自动装配: byType:按类型装配 byName:按名称装配,需要一个setter方法 <bean id="UserService" class="com.nenu.service.impl.UserServiceImpl" autowire="byName"> 首先要在applicationContext.xml配置文件中指明autowire的属性(即自动装配的方法) 其次在UserService接口的实现类UserServiceImpl中添加对应的setter或constructor! 看不懂没关系,下面我们开始举例进行自动装配! 一、xml实现bean自动装配的三种方式 1.constructor 首先applicationContext.xml改为: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns

Spring Boot中Jsp原理分析

左心房为你撑大大i 提交于 2020-02-11 16:11:33
jsp的本质 jsp的本质就是 servlet ,使用过tomcat部署过javaweb项目,都知道在work目录生成jsp页面对应的sevlet。 servlet的本质就是封装了socket jsp页面 < % -- Created by IntelliJ IDEA . User : wy Date : 2019 / 11 / 26 Time : 下午 11 : 21 To change this template use File | Settings | File Templates . -- % > < % @ page contentType = "text/html;charset=UTF-8" language = "java" % > < html > < head > < title > Title < / title > < / head > < body > < h2 > Hello < / h2 > < a href = "login" > 登录 < / a > < / body > < / html > 对应的Servlrt ublic final class index_jsp extends org . apache . jasper . runtime . HttpJspBase implements org . apache . jasper .

tars源码解析3-springboot启动

早过忘川 提交于 2020-02-09 20:14:57
从spring xml ,spring JavaConfig,spring boot ,spring cloud。原理从始到终都是没有任何变化的,只要我们掌握了最核心的只不过是表现方式不同了。所以有了 技术万变不离其中 tars一样的,如果玩转它。 从前面两篇,分析而言。要改成springboot的方式,无非就是使用它的方式改变了,核心是不会变的。 使用方式有哪几个变化呢? 启动方式,springboot starter方式,注解启动。 注解服务。 围绕这两个变化。 我们知道了tars服务启动需要启动哪些类,初始化哪些类,同理starter无非是jar包中配置了引入启动类,监听器org.springframework.context.ApplicationListener。然后注解@EnableTarsServer引入初始化某个类而已。 非常熟悉spring与springboot生命周期的,那更加清楚,不仅仅是这两种方式,还有很多种,可以使用。 服务解析方式发生改变,以前是读取xml,读取javaConfig文件,现在变成注解而已。跟我练习,如何使用注解呢? 定义注解 标记类 springboot生命周期中扫描这些类,判断有没有TarsServant注解标记了,有那么就取出,放入服务中即可。 客户端使用,TarsClient,无非就是一个生命周期中的类,来初始化扫描这些标记了的类

spring Security项目快速搭建

巧了我就是萌 提交于 2020-02-08 18:11:40
spring Security的底层原理就是拦截器链。在上一篇文章使用注解方式搭建spring项目中, 可以自定义一套拦截器,拦截实现spring提供的HandlerInterceptr接口,然后实现三个拦截器方法, 在prexxx方法中定义验证逻辑。拦截器定义好后在servletContext容器的配置类中注入进来再进行注册。就可以使用。 这是基于session进行认证授权的方式。 spring Security为我们提供了认证授权的框架。下面大概上说明一下怎么快速搭建一个spring Security项目。 1 创建maven工程 2 pom依赖,加上spring Security的相关依赖     <dependency>       <groupId>org.springframework.security</groupId>       <artifactId>spring-security-web</artifactId>       <version>5.1.5.RELEASE</version>     </dependency>     <dependency>       <groupId>org.springframework.security</groupId>       <artifactId>spring-security-config<

曹工说Spring Boot源码(14)-- AspectJ的Load-Time-Weaving的两种实现方式细细讲解,以及怎么和Spring Instrumentation集成

≡放荡痞女 提交于 2020-02-08 15:37:42
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean Definition到底是什么,咱们对着接口,逐个方法讲解 曹工说Spring Boot源码(3)-- 手动注册Bean Definition不比游戏好玩吗,我们来试一下 曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean definition的? 曹工说Spring Boot源码(5)-- 怎么从properties文件读取bean 曹工说Spring Boot源码(6)-- Spring怎么从xml文件里解析bean的 曹工说Spring Boot源码(7)-- Spring解析xml文件,到底从中得到了什么(上) 曹工说Spring Boot源码(8)-- Spring解析xml文件,到底从中得到了什么(util命名空间) 曹工说Spring Boot源码(9)-- Spring解析xml文件,到底从中得到了什么(context命名空间上) 曹工说Spring Boot源码(10)-- Spring解析xml文件,到底从中得到了什么(context:annotation-config 解析)

【Spring源码】 后置处理器BeanPostProcessor底层原理分析

一笑奈何 提交于 2020-02-08 09:34:25
【Spring源码】 BeanPostProcessor底层原理分析 1.Spring中bean的生命周期 2.Spring注解开发指定初始化和销毁的方式 3.BeanPostProcessor底层原理分析 4.Spring中BeanPostProcessor的应用 注:其他一些spring源码解读,如果有需要,可以参考: 【spring源码】spring容器IOC底层源码分析 【spring源码】AOP底层源码分析 【spring源码】spring声明式事务底层源码分析 【spring源码】ApplicationListener事件监听底层原理 1.Spring中bean的生命周期 今天不聊那么复杂,其实bean的生命周期就这四步:实例化、初始化、使用、销毁 2.Spring注解开发指定初始化和销毁的方式 大概以下四种方式: 2.1 @Bean指定init-method和destroy-method 举例Demo: bean实体类 /** * bean的生命周期 * * @author wangjie * @version V1.0 * @date 2020/1/6 */ public class Food { public Food(){ System.out.println("food constructor"); } public void init(){ System

【程序报错】Spring容器启动时报异常:Can not set field to com.sun.proxy.$Proxy

喜欢而已 提交于 2020-02-06 15:37:56
问题 1 异常信息 在Web项目中Spring容器启动的时候,报错信息为Can not set field… to com.sun.proxy.$Proxy。 2 本质 因为JDK实现动态代理业务的时候,只能针对接口进行代理。然而对于类需要进行代理,需要使用到CGLib。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。正是由于在代码中使用了类代理,但是配置不正确,所以报错。 3 相关代码 首先是定义了一个接口: public interface CpsAccountService { /* 具体业务逻辑省略 */ } 然后编写了接口的实现类: @Service public class CpsAccountServiceImpl implements CpsAccountService { /* 具体业务逻辑省略 */ } 最后是在控制器层注解装配: @Controller @Api ( value = "CPS外部合作商相关接口" ) @RequestMapping ( value = "api/cps/*" ) public class CpsController { @Autowired private

一文让你搞懂Spring的统一事务模型

拟墨画扇 提交于 2020-02-06 05:58:00
Spring事务的知识体系 进入主题之前,先来了解一下Spring事务,都有哪些内容: Spring事务包含对 分布式事务 和 单机事务 的支持,我们用的比较多的是单机事务,也就是只操作一个数据库的事务。 单机事务,按照用法分,又可以分为 编程式事务模型 (TransactionTemplate)和 声明式事务模型 (@Transactional注解),后者可以理解为 aop + 编程式事务模型。 编程式事务模型里面涉及到很多知识点,比如统一事务模型、事务传播级别、事务隔离级别等。 我们今天要讲的是其中一点, 统一事务模型 。 希望这次的分享能够让大家,对Spring事务有一个整体性的认识。 不仅仅是Template Spring的统一事务模型,解决的一个核心问题,就是不管你用的是什么数据访问方式,Hibernate、MyBatis抑或是JDBC, 你的Service层的代码都是一样的,不需要做任何变动。 使用@Transactional注解的,相信大家都用过,而且由于注解的实现比较隐晦,不利于我们理解原理,这里就不演示。 下面介绍编程式事务模型, TransactionTemplate : 不管后面你的Dao实现如何变化,上面这一段Service代码都无需修改,而且依旧可以保持事务的逻辑。 Spring是怎么做到的呢? 有人说,是 模板模式 。