Spring核心知识点详解
2025-01-15 17:19:34   21  举报             
     
         
 AI智能生成
  Spring框架是Java企业版(Java EE)的轻量级替代品,它简化了企业级应用开发。核心知识点包括依赖注入(DI)和控制反转(IoC)机制,这是Spring容器的核心功能,允许将组件的配置和依赖关系管理从代码中解耦出来。此外,Spring提供了面向切面编程(AOP),允许横切关注点(如日志、事务管理)与业务逻辑分离。Spring MVC支持构建Web应用程序,而Spring Boot为创建和部署独立的、生产级别的基于Spring的应用程序提供了便利。Spring Data简化了数据访问层的实现,而Spring Security提供了全面的安全性解决方案。Spring框架文件类型通常包括`.java`源代码文件、XML配置文件(虽然Spring 3之后逐渐被Java配置所取代)以及用于自动化测试的`.java`或`.xml`测试配置文件。描述的修饰语应强调其模块化、开源、灵活、易用、高效和广泛社区支持的特点。
    作者其他创作
 大纲/内容
  Spring基础    
     什么是Spring框架    
     Spring 是基于java开发的以IOC和AOP为核心的轻量级低侵入式框架,
是java开发非常流行的框架,可以用来快速搭建一个java项目。
  
    是java开发非常流行的框架,可以用来快速搭建一个java项目。
 Spring IOC    
     Spring XML 方式    
     引入spring maven依赖     
      
     定义期望创建的类    
     User类定义  
     创建springXML配置文件    
     xml配置  
     从spring容器中获取Bean    
     使用对象  
     Spring Config方式    
     注解介绍    
     @Component/@Repository/@Service/@Controller    
     声明一个类可成为bean  
     @Configuration    
     声明一个类为Spring的主配置类  
     @ComponentScan    
     声明包扫描路径,一般加在主配置类上  
     @PropertySource    
     读取配置文件注解  
     @Value    
     从spring上下文环境变量中取出指定值  
     @Import    
     导入bean  
     创建bean相关接口    
     ImportSelector    
     结合@Import注解批量注册bean接口,返回类的全限定名称数组  
     ImportBeanDefinitionRegistrar    
     结合@Import注解自定义创建bean  
     声明配置类    
     @Configuration  
     声明包扫描路径    
     @ComponentScan("com")  
     读取配置文件    
     @PropertySource/@Value  
     注册类到IOC容器中    
     @Component方式     
      
     @Bean方式     
      
     @Import方式    
     UserDaoImpl 是没有任何注解和其他描述的普通类  
     通过ImportSelector接口和@Import结合批量注册    
     这里的Student和Teacher 都是普通类,没有加任何注解;@Import 导入MyImportSelector  
     通过ImportBeanDefinitionRegistrar接口和@Import结合自定义创建    
     @Import 导入MyImportBeanDefinitionRegistrar  
     创建Spring容器    
     从spring容器从获取user对象  
     Spring AOP    
     什么是AOP    
     OOP是面向对象编程,AOP是在面向对象编制基础上的一种新的编程思想。它能在不改变原对象代码逻辑的情况下,在原对象执行前后植入新的代码逻辑,达到增强对象功能的目的。如:日志处理、事务实现、安全管理等  
     代理模式    
     静态代理    
     代码实现  
     动态代理    
     JDK动态代理    
     代理对象  
     InvocationHandler实现  
     Proxy创建动态代理对象  
     CJLIB动态代理    
     CJLIB代码实现  
     Spring AOP实现    
     开启AOP    
     引入Spring AOP相关依赖     
      
     配置类上添加开启Spring AOP注解,@EnableAspectJAutoProxy     
      
     创建被代理类    
     被代理类  
     创建切面    
     创建切面类,添加注解:@Aspect     
      
     编写切点表达式    
     切点表达式用来定位被代理类    
     切点表达式  
     添加增强逻辑    
     前置通知实现    
     添加前置通知注解:@Before     
      
     后置返回通知实现    
     添加后置返回通知注解:@AfterReturning     
      
     后置异常通知实现    
     添加后置异常通知注解:@AfterThrowing     
      
     后置通知实现    
     添加后置通知注解:@After     
      
     环绕通知实现    
     添加环绕通知注解:@Around     
      
     Spring AOP 核心概念    
     切面(Aspect)    
     表示切面,如@Aspect注解的类就是切面,可以在切面中定义Pointcut、Advice等等  
     连接点(Join point)    
     表示一个程序在执行过程中的一个点,比如一个方法执行,比如一个异常的处理,在Spring AOP中,一个连接点通常表示一个方法的执行  
     通知(Advice)    
     表示在一个特点的连接点上所采取的动作(前置通知、后置返回通知......)  
     切点(Pointcut)    
     用来匹配一个或多个连接点,Advice与切点表达式市关联在一起的,Advice将会执行在和切点表达式匹配的连接点上  
     Spring 声明式事务    
     什么是事务    
     把一组事务当做一个事务来执行,这一组事务要么都执行成功,要么都执行失败。保证操作的完整性  
     事务特性    
     原子性(A)  
     一致性(C)  
     隔离性(I)  
     持久性(D)  
     事务分类    
     编程式事务  
     声明式事务  
     Spring事务代码示例    
     核心依赖    
     mavn引入依赖  
     Spring主配置文件中添加注解开启服务支持:
@EnableTransactionManagement
    
    @EnableTransactionManagement
 添加注解  
     事务管理器设置DataSource数据源    
     设置数据源  
     方法或者类上添加注解开启事务:
@Transactional
    @Transactional
 开启事务  
     Spring 事务属性设置    
     隔离级别@Transactional(isolation = Isolation.REPEATABLE_READ)     
      
     传播属性@Transactional(propagation = Propagation.REQUIRED)     
      
     超时时间@Transactional(timeout = 2)  
     只读属性@Transactional(readOnly = true)  
     异常属性@Transactional(noRollbackFor=RuntimeException.class)  
     Spring底层核心原理    
     Spring创建对象过程    
     1. 解析AppConfig配置文件,得到ComponentScan定义的扫描路径  
     2. 扫描路径下可成为Bean的类型(标注有@Component、@Service、@Controller等注解的类),通过特点算法从类中获取到beanName(类名称的首字母小写)。以beanNmae为key ,class和属性信息为value 放入一个map中  
     3. 遍历上面的map ,通过类和其属性创建对象(bean),放入key为benName,value为bean对象的map中  
     4. context.getBean("userService") 就是从Spring容器中(上述的map)通过beanName获取到创建的Bean  
     Bean的生命周期    
     实例化  
     依赖注入  
     Aware回调  
     初始化前  
     初始化  
     初始化后  
     推断构造方法    
     如果一个类只存在一个构造方法,不管该构造方法是无参还是有参构造方法,Spring都会用这个构造方法进行实例化。  
     如果一个类有多个构造方法    
     a.这些构造方法中,存在一个无参构造方法,那么Spring会使用这个无参构造方法进行实例化bean  
     b.这些构造方法中,不存在无参构造方法,那么Spring会报错。  
     如果一个类有多个构造方法,某个构造方法上加了@Autowired注解,那么Spring就会用这个加了注解的构造方法进行实例化。    
     如果Spring选择了有入参的构造方法    
     a.先根据类型去找,如果找到一个,直接用来作为入参  
     b.如果根据类型找到多个,则在根据入参的名称来确定唯一一个  
     c.如果最终都没有找到,Spring则会报错,无法创建当前Bean对象  
     Spring AOP实现    
     1. 找出所有的切面Bean,也就是被@Aspect注解标注的Bean  
     2. 遍历切面中的每个方法,找出标识了@Before、@After等注解的方法  
     3. 如果标识了,则判断对应的PointCut是否和当前Bean对象的类是否匹配  
     4. 如果匹配则表示当前Bean对象有匹配的PointCut,需要进行AOP  
     5. 判断Bean是否继承了接口,然后通过JDK动态代理或者CGLIB动态代理创建代理类  
     6. 将代理对象作为bean放入spring容器中  
     Spring 事务实现    
     事务动态代理创建  
     事务执行    
     1.判断当前执行的方法是否存在@transactional注解  
     2.如果存在,则利用事务管理器(TransactionManager)新建一个数据库连接  
     3.修改数据库连接的autocommit 为false  
     4.执行target目标方法  
     5.执行完成后如果没有异常则提交,否则回滚  
     Spring事务是否失效判断    
     加了@transactional注解的方法被调用时,判断当前是不是直接被代理对象调用,如果是则事务生效,如果不是则失效。  
     Spring源码剖析    
     核心概念    
     BeanDefinition     
      
     BeanDefinitionReader    
     AnnotatedBeanDefinitionReader  
     XmlBeanDefinitionReader  
     ClassPathBeanDefinitionScanner  
     BeanFactory    
     DefaultListableBeanFactory     
      
     ApplicationContext    
     ApplicationContext接口  
     AnnotationConfigApplicationContext    
     AnnotationConfigApplicationContext容器  
     类型转换    
     PropertyEditor     
      
     ConversionService     
      
     TypeConverter     
      
     OrderComparator     
      
     AnnotationAwareOrderComparator     
      
     BeanPostProcessor     
      
     BeanFactoryPostProcessor     
      
     FactoryBean     
      
     ExcludeFilter和IncludeFilter    
     ExcludeFilter    
     表示扫描com.redis.cache.demo.dao包下的所有类,但是排除了ProductDao类,即使它上面有@Component注解也不会成为Bean  
     IncludeFilter    
     表示扫描com.redis.cache.demo.dao包下的所有类,包含ProductDao类,即使ProductDao没有加@Component注解,它也会被扫描成为一个Bean  
     FilterType    
     ANNOTATION:表示是否包含某个注解  
     ASSIGNABLE_TYPE:表示是否包含某个类  
     ASPECTJ:  表示否是符合某个Aspectj表达式  
     REGEX:  表示是否符合某个正则表达式  
     CUSTOM:  自定义  
     MetadataReader、ClassMetadata、AnnotationMetadata    
     SimpleMetadataReader     
      
     Bean生命周期解析    
     1. BeanDefinition解析    
     1.ResourcePatternResolver 获取指定包路径下的.class文件,Spring中会将文件包装成Resource对象   
     2.遍历每一个Resource对象,利用MetadataReaderFactory解析Resource对象得到MetadataReader  
     3.利用MetadataReader进行excludeFilters、includeFilters和条件注解@Conditional的筛选  
     4. 筛选通过后,基于MetadataReader生成ScannedGenericBeanDefinition  
     5. 再基于MetadataReader判断对应的类是不是接口或者抽象类(接口和抽象类是不能生成bean的)  
     6. 筛选通过后,就表示扫描到了一个Bean,将ScannedGenericBeanDefinition加入结果集(BeanDefinitionMap)  
     2. 合并BeanDefinition  
     3.类加载  
     4. 实例化前  
     5.Supplier创建对象  
     6.实例化  
     7.BeanDefinition的后置处理  
     8. 实例化后  
     9.依赖注入  
     10. Aware回调  
     11.初始化前  
     12.初始化  
     13.初始化后  
     依赖注入解析    
     XML中的Autowire自动注入  
     @Autowire注解自动注入  
     寻找注入点    
     查找过程  
     桥接方法  
     注入点注入    
     AutowiredAnnotationBeanPostProcessor 后置处理器进行依赖注入  
     关键方法    
     findAutowireCandidates()  
     determineAutowireCandidate()  
     循环依赖解析    
     什么是Spring的循环依赖  
     三级缓存    
     一级缓存SingletonObjects  
     二级缓存earlySingletonObjects  
     三级缓存singletonFactories  
     三级缓存解决循环依赖过程  
     AOP解析    
     Spring中的动态代理ProxyFactory  
     Advice的分类  
     Advisor  
     ProxyFactoryBean  
     BeanNameAutoProxyCreator  
     DefaultAdvisorAutoProxyCreator  
     @EnableAspectJAutoProxy注解开启AOP  
     Spring事务解析    
     @EnableTransctionManagement  
     Spring事务传播机制  
     
    收藏 
      
    收藏 
     
 
 
 
 
  0 条评论
 下一页
  
   
   
  
  
  
  
  
  
  
  
  
  
 