Spring
文章平均质量分 83
Spring
morris131
这个作者很懒,什么都没留下…
展开
-
spring源码构建
spring源码构建spring源码地址:https://github.com/spring-projects/spring-framework.git。由于github下载速度较慢,可以先将spring的源码导入到gitee,然后再从gitee进行下载。gitee导入github仓库的地址:https://gitee.com/projects/import/url。gitee导入的方式如下:我这里导入后的下载地址为:git@gitee.com:morris131/spring-framewor原创 2020-12-15 20:46:17 · 5139 阅读 · 0 评论 -
spring简介
1. spring介绍简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。struts 是 web 框架(jsp/action/actionfrom)hibernate 是 orm框架,处于持久层.spring 是容器框架,用于配置bean,并维护bean之间关系的框架2. spring的好处Ø 低侵入式设计,代码污染极低Ø原创 2014-11-03 20:02:07 · 13601 阅读 · 7 评论 -
如何获得spring 最新源代码
1.1. 进入百度,输入搜索spring 1.2. 进入spring官网,点击右上角的projects链接 1.3. 点击spring framework 1.4. 点击spring 在github上的链接 1.5. 往下拉找到 downloading Spring artifacts 1.6. 往下拉 找到http://r原创 2015-03-25 21:10:38 · 7366 阅读 · 11 评论 -
Spring与Hibernate的整合
1. Spring与Hibernate的整合 1.1. 在Spring容器中创建SessionFactory 为了避免硬编码的资源查找与应用程序对象紧密耦合,Spring允许你在Spring容器中以bean的方式定义诸如JDBC DataSource或者Hibernate SessionFactory 的数据访问资源。任何需要进行资源访问的应用程序对象只需要持有这些事先定义好的实例的引用,下面原创 2014-11-07 17:06:44 · 163960 阅读 · 10 评论 -
spring AOP和通知
1. spring的通知1.1. AOP的概念切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于模式或者基于注解的方式来实现。连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring AOP中,一个连接点总原创 2014-11-05 21:25:52 · 39206 阅读 · 17 评论 -
【Spring】Lifecycle的使用与源码分析
LifeCycle接口定义了Spring容器的生命周期,任何被Spring管理的对象都可以实现该接口。当Spring容器本身启动和停止时,会回调LifeCycle接口中定义的方法。原创 2022-10-27 14:56:04 · 32871 阅读 · 0 评论 -
【spring】Spring事件监听器ApplicationListener的使用与源码分析
ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。事件发布者并不需要考虑谁去监听,监听具体的实现内容是什么,发布者的工作只是为了发布事件而已。Spring提供的内置事件:ContextRefreshedEvent:容器刷新事件ContextStartedEvent:容器启动事件ContextStoppedEvent:容器停止事件ContextClo原创 2022-05-01 18:28:52 · 25189 阅读 · 3 评论 -
【spring】spring异步执行的使用与源码分析
在实际的开发过程中,有些业务逻辑使用异步的方式处理更为合理。比如在某个业务逻辑中,需要把一些数据存入到redis缓存中,这个操作只是一个辅助的功能,成功或者失败对主业务并不会产生根本影响,这个过程可以通过异步的方法去进行。Spring中通过在方法上设置@Async注解,可使得方法被异步调用。也就是说该方法会在调用时立即返回,而这个方法的实际执行交给Spring的TaskExecutor去完成。异步执行的使用配置类使用@EnableAsync注解开启异步功能。package com.morris.s原创 2022-05-01 18:01:11 · 27346 阅读 · 3 评论 -
【redis】redis实现队列的阻塞、延时、发布和订阅
Redis不仅可作为缓存服务器,还可以用作消息队列。它的列表类型天生支持用作消息队列。如下图所示:由于Redis的列表是使用双向链表实现的,保存了头节点和尾节点,所以在列表的头部和尾部两边插入或获取元素都是非常快的,时间复杂度为O(1)。普通队列可以直接使用Redis的list数据类型实现消息队列,只需简单的两个指令lpush和rpop或者rpush和lpop。lpush+rpop:左进右出的队列rpush+lpop:左出右进的队列下面使用redis的命令来模拟普通队列。使用lpush命原创 2022-04-30 11:39:19 · 30688 阅读 · 3 评论 -
【spring】自定义缓存注解
为什么要自定义缓存注解?Spring Cache本身提供@Cacheable、@CacheEvict、@CachePut等缓存注解,为什么还要自定义缓存注解呢?@Cacheabe不能设置缓存时间,导致生成的缓存始终在redis中,当然这一点可以通过修改RedisCacheManager的配置来设置缓存时间:@Beanpublic RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {原创 2022-04-30 08:30:00 · 2257 阅读 · 0 评论 -
【spring】自定义二级Cache
Spring Cache是Spring-context包中提供的基于注解方式使用的缓存组件,定义了一些标准接口,通过实现这些接口,就可以通过在方法上增加注解来实现缓存。这样就能够避免缓存代码与业务处理耦合在一起的问题。Spring Cache核心的接口就两个:Cache和CacheManager。Cache接口:该接口定义提供缓存的具体操作,比如缓存的放入、读取、清理:CacheManager接口:主要提供Cache实现bean的创建,每个应用里可以通过cacheName来对Cache进行隔离,每个原创 2022-04-28 08:30:00 · 763 阅读 · 0 评论 -
【spring】缓存注解及原理
硬编码使用缓存为了提升商品信息的查询效率,我们对商品信息使用了缓存,示例代码如下:package com.morris.spring.demo.cache;import com.morris.spring.entity.Good;import com.morris.spring.service.GoodService;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stere原创 2022-04-26 19:00:00 · 1000 阅读 · 0 评论 -
【spring】编程式事务与源码剖析
声明式事务的一些缺点:作用于方法上,颗粒度较大,无法作用于代码块。无法实现较为复杂的事务逻辑控制。新开事务时会将原来的事务进行挂起,浪费连接资源,如果这个线程在执行耗时的IO操作,那么就会一直占用多个连接资源。所以Spring提供了模板类TransactionTemplate以手动编程的方式来管理事务。编程式事务的使用配置类需要注入TransactionTemplate,无需@EnableTransactionManagement。@Beanpublic TransactionTemp原创 2022-04-21 10:22:22 · 461 阅读 · 0 评论 -
【spring】事务传播属性REQUIRED_NESTED的原理
传统事务中回滚点的使用package com.morris.spring.demo.jdbc;import java.sql.*;/** * 传统JDBC中回滚点的使用 */public class TraditionSavePointDemo { public static void main(String[] args) throws SQLException { String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=t原创 2022-04-21 20:00:00 · 668 阅读 · 0 评论 -
【spring】事务传播属性REQUIRED的原理
先来看一个奇怪的问题:TransactionService.javapackage com.morris.spring.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import org.springframework.transaction.annotation.Propagation;import or原创 2022-04-19 20:00:00 · 670 阅读 · 0 评论 -
【spring】事务的传播机制
Spring中的事务Spring的事务其实就是数据库的事务操作,符合ACID标准,也具有标准的事务隔离级别。Spring中的事务只是对JDBC事务进行一些封装与扩展,其底层最终还是会使用到JDBC的这套API。但是Spring事务有自己的特点,也就是事务传播机制。所谓事务传播机制,也就是在事务在多个方法的调用中是如何传递的,是重新创建事务还是使用父方法的事务?父方法的回滚对子方法的事务是否有影响?这些都是可以通过事务传播机制来决定的。准备工作实体类Areapackage com.morris.原创 2022-04-16 12:00:00 · 276 阅读 · 0 评论 -
【spring】声明式事务的使用与其实现原理
传统JDBC事务的使用package com.morris.spring.demo.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;/** * 传统JDBC事务的使用 */public class TraditionTransactionDemo { public static void main(S原创 2022-04-15 12:00:00 · 444 阅读 · 0 评论 -
【spring】AOP原理及源码分析
@EnableAspectJAutoProxy@EnableAspectJAutoProxy注解用于开启AOP功能,那么这个注解底层到底做了什么呢?查看@EnableAspectJAutoProxy的源码,发现它使用@Import注解向Spring容器中注入了一个类型为AspectJAutoProxyRegistrar的Bean:class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar { @Overri原创 2022-04-14 20:00:00 · 341 阅读 · 0 评论 -
【spring】解决因@Async引起的循环依赖报错
最近在项目中使用@Async注解在方法上引起了循环依赖报错。代码类似如下:package com.morris.spring.entity.circular;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.annotation.Async;import org.springframework.scheduling.annotation.Enabl原创 2022-04-09 17:37:43 · 7315 阅读 · 0 评论 -
【spring】AOP引入的使用与源码分析
通知是对目标对象方法的增强,而引入可以动态为目标对象实现新的接口,实现对类的增强。引入的使用目标类public class DogService { public void hi() { System.out.println("wangwang"); }}增强接口public interface CatService { void eat();}增强接口实现类public class CatServiceImpl implements CatService { @Overr原创 2022-04-09 11:31:03 · 5588 阅读 · 0 评论 -
【spring】自定义AOP切面
在Spring中,实现AOP增强不仅可以使用@Aspect注解来实现,还可以通过自定义切面来实现。下面来看看怎么自定义切面。切面切面需要实现PointcutAdvisor接口,一个切面必须包含切点和通知。package com.morris.spring.advisor;import org.aopalliance.aop.Advice;import org.springframework.aop.Pointcut;import org.springframework.aop.support原创 2022-04-06 16:00:00 · 10463 阅读 · 0 评论 -
【spring】AOP通知的使用
AOP(Aspect Oriented Programming),即面向切面编程。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关原创 2022-03-31 09:00:00 · 11622 阅读 · 0 评论 -
【spring】Cglib动态代理的使用
cglib代理使用ASM对字节码进行操作生成新的类,从而实现对对象方法的增强。我们都知道Java中自带了一个动态代理,那我们为什么不直接使用Java动态代理,而要使用cglib呢?因为cglib相比于JDK动态代理更加强大,JDK动态代理虽然简单易用,但是其有一个致命缺陷是,只能对接口进行代理。如果要代理的类为一个普通类、没有实现接口,那么Java动态代理就没法使用了。cglib的使用CallbackFilterCglibCallbackFilter用来判断方法走那个Callback。package原创 2022-03-30 08:30:00 · 3597 阅读 · 0 评论 -
【spring】手写JDK动态代理
下面模仿JDK动态代理写一个自己的动态代理。思路分析先根据目标类所实现的接口生成java文件内容。将java文件内容生成到.java文件。编译.java文件为.class文件。加载.class文件。根据Class对象new一个对象。具体实现增强的接口类似于JDK动态代理中的InvocationHandler。package com.morris.spring.demo.proxy.myjdk;import java.lang.reflect.Method;public int原创 2022-03-29 14:00:00 · 1334 阅读 · 0 评论 -
【spring】JDK动态代理的使用与源码分析
JDK动态代理的实现是在运行时,根据一组接口定义,使用Proxy、InvocationHandler等工具类去生成一个代理类和代理类实例。JDK动态代理的使用编写一个类实现InvocationHandler接口,主要负责需要增强的方法的增强逻辑。package com.morris.spring.demo.proxy.jdk;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public cl原创 2022-03-27 09:00:00 · 11688 阅读 · 2 评论 -
【spring】@Conditional的使用与扩展
@Conditional的使用@Conditional可以根据条件来判断是否注入某些Bean。package com.morris.spring.config;import com.morris.spring.condition.LinuxCondition;import com.morris.spring.condition.WindowsCondition;import com.morris.spring.entity.User;import org.springframework.con原创 2022-03-25 10:30:48 · 765 阅读 · 0 评论 -
【spring】DeferredImportSelector的使用与源码分析
DeferredImportSelector是ImportSelector的一个子接口,既然是同类,那么功能都类似,都是向spring容器中注入bean,只不过注入bean的时机不同。DeferredImportSelector与ImportSelector的区别:ImportSelector:在解析配置类时就顺带处理了ImportSelector类。DeferredImportSelector:在解析配置类时只是将其加入到一个容器中,等到所有的配置类都解析完成后才会处理DeferredImport原创 2022-03-25 15:30:00 · 12100 阅读 · 0 评论 -
【spring】@Configuration的使用与原理
@Configuration的使用@Configuration是一个被@Component注解修饰的注解,先来看一个现象:package com.morris.spring.config;import com.morris.spring.entity.Message;import com.morris.spring.entity.Order;import com.morris.spring.entity.User;import org.springframework.context.annot原创 2022-03-25 15:00:00 · 11154 阅读 · 0 评论 -
【Spring】@Import、ImportSelector、ImportBeanDefinitionRegistrar的使用与源码分析
@Import是一个注解,专门用来导入实现了ImportSelector和ImportBeanDefinitionRegistrar接口的类,当然也可以用来导入普通的Bean。@Import的使用@Import+普通Beanpackage com.morris.spring.demo.annotation;import com.morris.spring.entity.User;import org.junit.jupiter.api.Test;import org.springframewo原创 2022-03-20 18:15:38 · 1623 阅读 · 0 评论 -
【spring】ComponentScan的扫描过程
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" xmlns:context="http://www.springframework.org/schema/context" xsi:schema原创 2022-03-15 09:42:48 · 3015 阅读 · 1 评论 -
【spring】Bean的Scope与自定义Scope
Bean的作用域在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为Bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。而bean的定义以及bean相互间的依赖关系将通过配置元数据来描述。Bean的五种作用域在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为Bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象,除此之外,bean就与应原创 2022-03-14 16:35:13 · 3331 阅读 · 1 评论 -
【spring】spring中循环依赖的实现原理
循环依赖其实就是循环引用,很多地方都说需要两个或则两个以上的bean互相持有对方最终形成闭环才是循环依赖,比如A依赖于B,B依赖于C,C又依赖于A。其实一个bean持有自己类型的属性也会产生循环依赖。单例属性的循环依赖使用SingleFieldBeanA依赖SingleFieldBeanB,SingleFieldBeanB依赖SingleFieldBeanA。public class SingleFieldBeanA { @Autowired private SingleFieldBeanB s原创 2022-03-13 12:14:13 · 1830 阅读 · 0 评论 -
【spring】@PropertySource与@Value的实现原理
@PropertySource的使用package com.morris.spring.entity;import lombok.Data;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.PropertySource;import org.springframework.stereotype.Component;@Component原创 2022-03-13 11:39:42 · 1324 阅读 · 0 评论 -
【spring】XML中占位符Placeholder的使用
占位符Placeholder的使用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" xmlns:context="http://www.springframework.org/schema/contex原创 2022-03-12 11:13:11 · 1490 阅读 · 0 评论 -
【spring】Bean的初始化过程
AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors使用BeanPostProcessor收集带有注解的方法和属性,方便下面初始化时调用。org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessorsprotected void appl.原创 2022-03-10 10:18:44 · 3255 阅读 · 0 评论 -
【Spring】FactoryBean与BeanFactory的区别
FactoryBean的使用FactoryBeanFactoryBean是一个接口,接口声明如下:package org.springframework.beans.factory;import org.springframework.lang.Nullable;public interface FactoryBean<T> { String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType"; @Nullable原创 2022-03-02 08:30:00 · 374 阅读 · 0 评论 -
【Spring】Bean的实例化过程
创建Bean的入口:org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons。DefaultListableBeanFactory#doCreateBean遍历所有的BeanDefinition,开始实例化public void preInstantiateSingletons() throws BeansException { if (logger.isTraceEna原创 2022-03-01 08:30:00 · 754 阅读 · 0 评论 -
【Spring】BeanFactoryPostProcessor的使用与执行原理分析
BeanFactory的后置处理器就是BeanFactoryPostProcessor接口,该接口有一个方法postProcessBeanFactory,这个方法会在BeanFactory初始化之后调用,这时所有的bean定义(BeanDefinition)已经保存加载到beanFactory,但是bean的实例还未创建,可以通过BeanFactory对BeanDefinition的内容进行修改,也可以增加BeanDefinition。BeanFactoryPostProcessor先自定义一个Bean原创 2022-02-27 17:43:32 · 1628 阅读 · 0 评论 -
【Spring】XML的解析过程
XML注入Bean的使用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 h原创 2022-02-26 22:31:14 · 1088 阅读 · 0 评论 -
【Spring】DOM和SAX解析XML
DOM解析XML什么是DOMDOM:Document Object Model,文档对象模型,DOM解析形成了树结构,有助于更好的理解、且代码容易编写。解析过程中,树结构保存在内存中,方便修改。DOM解析XML的步骤创建一个DocumentBuilderFactory的对象创建一个DocumentBuilder对象通过DocumentBuilder的parse(…)方法得到Document对象通过getElementsByTagName(…)方法获取到节点的列表通过for循环遍历每一个节点原创 2022-02-26 22:10:53 · 607 阅读 · 0 评论