spring 一览众山小

本文介绍了Spring框架,它是管理对象的大容器,对象统称Bean。阐述了依赖注入(DI)、面向切面编程(AOP)等重要概念,还提及控制反转(IOC)的两种方式。说明了父子容器关系,以及容器启动过程,包括装载Bean配置、实例化Bean等,最后介绍了代理的分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一览众山小
简单的理解Spring就是一个大的容器,它管理诸多不同职责的对象,我们把这些对象统称为Bean。说到Spring 有两个重要的概念不得不提,一个是依赖注入(DI),另一个是面向界面编程(AOP)。依赖注入降低我们代码的耦合度,使得对象间或模块间松散耦合,让我们的整个软件结构变的更加灵活、可变。这里我要多提一点,就是在设计Bean的时候一般是面向接口的,这一点对于模块外露的功能类来说至关重要。

名词解释
控制反转(IOC, Inversion of Control),是面向对象编程的一种设计原则,可以降低代码之间的耦合度。在Java中常见的有两种方式,一是依赖注入,另一个是依赖查找。

依赖注入(DI,Dependency Injection ),将依赖通过外部以参数的形式注入。

依赖查找(DL,Dependency Lookup) ,通过配置或其他方式指明接口的实现类。如Java 中的SPI。

面向切面编程(AOP,Aspect Oriented Programming),主要针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某一步骤或阶段,从而降低各部分的耦合性。我们可以通过Spring 对业务代码实现日志记录、安全控制、事务处理等。

父子容器
我们可以给一个容器设置父容器,父容器对于子容器是可见的,这里说的可见的是指子容器可以获取到父容器中的Bean,需要注意的是某些特殊职责的Bean只对本容器起作用,例如实现了BeanPostProcesser、ApplicationListener等接口的Bean,虽然可以在子容器中获取的到但它们的职责只对所在容器起作用。

容器的启动过程
装载Bean的配置,容器读取Bean的配置并生成一个相应的Bean的定义类。
实例化Bean
Bean的定义:我们在定义一个Bean时一般做三件事情,1、指定Bean的类 2、指定Bean的依赖 3、指定Bean的职责,我们可以通过接口或者是注解指定这个Bean是用来干什么的,例如我们可以为Bean指定实现BeanPostProcesser接口,那么在Bean创建的过程中会被调用。Spring支持三种方式让我们提供Bean的定义,1)配置文件 2)Java Config 3)在Spring 周期中动态设置ean的定义。

1、配置文件

    <beans:bean name="loadEntityDataService" class="com.sprite.framework.base.entitydata.LoadEntityDataService">
         <beans:property name="delegator" ref="delegator"/>
     </beans:bean>

2、Java Config

  @Configuration
  @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
  public class EntityConfig {
      private static final String DIALECT = "hibernate.dialect";
      private static final String SHOW_SQL = "hibernate.show_sql";
      private static final String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
  
      @Bean  
      public DataSource dataSource(Environment env) {  
         BasicDataSource druidDataSource = new BasicDataSource();  
         druidDataSource.setPassword(env.getProperty("jdbc.password"));  
         druidDataSource.setUsername(env.getProperty("jdbc.username"));  
         druidDataSource.setUrl(env.getProperty("jdbc.url"));  
         druidDataSource.setDriverClassName(env.getProperty("jdbc.driver"));  
         druidDataSource.setMaxActive(Integer.parseInt(env.getProperty("jdbc.maxActive"))); 
         druidDataSource.setMaxIdle(Integer.parseInt(env.getProperty("jdbc.maxIdle")));
         druidDataSource.setMaxWait(Integer.parseInt(env.getProperty("jdbc.maxWait")));
         return druidDataSource;  
     } 
 }

3、动态设置

  public class AnnotationConfigBeanDefinitionParser implements BeanDefinitionParser {
  
      @Override
     public BeanDefinition parse(Element element, ParserContext parserContext) {
          Object source = parserContext.extractSource(element);
  
          // Obtain bean definitions for all relevant BeanPostProcessors.
          Set<BeanDefinitionHolder> processorDefinitions =
                  AnnotationConfigUtils.registerAnnotationConfigProcessors(parserContext.getRegistry(), source);
 
         // Register component for the surrounding <context:annotation-config> element.
         CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source);
         parserContext.pushContainingComponent(compDefinition);
 
         // Nest the concrete beans in the surrounding component.
         for (BeanDefinitionHolder processorDefinition : processorDefinitions) {
             parserContext.registerComponent(new BeanComponentDefinition(processorDefinition));
         }
 
         // Finally register the composite component.
         parserContext.popAndRegisterContainingComponent();
 
         return null;
     } 
 }
 

实例化Bean:容器在实例化Bean时一般分为三部分,1、根据Bean的定义实例化原有对象2、设置对象属性、3、装饰对象(生成代理、切面编程等)。在这个过程中Spring为我们提供了一些接口,可以通过这些接口改对象属性或者生成特定功能的代理对象。

代理
代理可分为两种:动态代理 、静态代理。静态代理是通过编码或工具生成代理,动态代理在编译或运行时生成代理。

动态代理:Spring 动态代理的实现有两种,它们是CGLIB 和JDK动态代理。CGLIB 是一个可以操作字节码的库。

系列文章 Spring的里里外外

内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值