01、IoCContainer-1 容器、Bean

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码) 数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994 立即下载

容器、Bean

  1. 介绍

    IoC(IoCInversion of Control)也叫依赖注入DI(dependency injection)

    对象可以通过构造函数参数、工厂方法参数,或者是对象自己被实例化后设置的属性来定义它们所依赖的其它对象。当所依赖的对象被实例化后,容器注入这些bean。bean自己控制依赖的实例化,或者是直接通过类的解析和Service Locator模式这样的机制来自己决定自己的依赖,这个过程就是IoC。

    使用IoC容器,需要用到org.springframework.beans和org.springframework.context两个包

    BeanFactroy接口提供了一个先进的配置机制,使得容器可以管理任何类型的对象。ApplicationContext是BeanFactroy的子接口,它加入了一下功能:

    • 与Spring AOP特性的组合更加容易
    • 消息资源处理(在网络化时使用)
    • 事件发布
    • 如在web应用中使用的WebApplicationContext这样的应用层特殊上下文

    总之,BeanFactroy提供了配置框架和基本的功能,ApplicationContext增加了企业级应用特有的功能。

    在Spring中,对象被称之为Bean,一个Bean就是被实例化的被组装的且被Spring IoC容器管理的众多对象中的一个。bean以及bean之间的依赖关系,在容器使用的配置元数据上反应出来。

  2. IoC 容器

    org.springframework.context.ApplicationContext定义了IoC容器,也负责bean的实例化、配置以及装配。

    容器通过读取配置元数据来获取实例化、配置合装配bean的指令。配置元数据可以通过XML,java注解以及java代码进行描述。通过配置元数据来描述构成应用的对象以及这些对象之间丰富的内在依赖。

    高度抽象的描述Spring如何工作:

    在ApplicationContext被创建和初始化后,使用应用程序的类文件+配置文件形成完全配置化的可运行的程序

    5893832-2f2d9057d2c15d96.png
    How Spring Work

    2.1 配置元数据

    我们通过配置元数据来告诉Spring容器如何在应用中初始化、配置合组织对象。

    在基于XML的元数据中,我们使用<bean>标签来配置一个对象,这些<bean>标签被包含在一个<beans>父标签中。

    一个简单的基于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
             https://www.springframework.org/schema/beans/spring-beans.xsd">
    
         <bean id="..." class="...">  
             <!-- collaborators and configuration for this bean go here -->
         </bean>
    
         <bean id="..." class="...">
             <!-- collaborators and configuration for this bean go here -->
         </bean>
    
         <!-- more bean definitions go here -->
    
     </beans>
    

    id:对象的唯一标识符;

    class:使用类的限定类名(带包名)定义bean的类型

  3. 实例化容器

    提供给ApplicationContext构造器的路径是一个资源字符串,这些字符串使得容器从不同的外部资源中加载配置元数据。例如从本地文件系统或者CLASSPATH加载配置元数据。

    //加载在CLASSPATH路径下的service.xml和dao.xml配置元数据来初始化上下文。
    ApplicationContext context = ClassPathXmlApplicationContext("service.xml","dao.xml");
    

    service.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
             https://www.springframework.org/schema/beans/spring-beans.xsd">
    
         <!-- services -->
    
         <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
             <property name="accountDao" ref="accountDao"/>
             <property name="itemDao" ref="itemDao"/>
             <!-- additional collaborators and configuration for this bean go here -->
         </bean>
    
         <!-- more bean definitions for services go here -->
    
     </beans>
    

    dao.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
             https://www.springframework.org/schema/beans/spring-beans.xsd">
    
         <bean id="accountDao"
             class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
             <!-- additional collaborators and configuration for this bean go here -->
         </bean>
    
         <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
             <!-- additional collaborators and configuration for this bean go here -->
         </bean>
    
         <!-- more bean definitions for data access objects go here -->
    
     </beans>
    

    service层由PetStoreServiceImpl类和两个数据访问类JpaAccountDao和JpaItemDao组成,元素property name参考PetStoreServiceImpl类域的名字,ref参考对应bean的id。id与ref元素之间的链接描述了合作对象之间的依赖关系。

  4. 组织基于XML的配置元数据

    按照不同的逻辑层或者按应用模块将bean的定义分布在不同的xml文件中是非常有用的。

    我们可以使用应用上下文构造器从分散的XML配置文件中加载配置信息。如下所示:

    <beans>
      <import resource="service.xml"/>
      <import resource="resources/message.xml"/>
      <import resource="/resources/themeSource.xml"/>
    
      <bean id="bean1" class="..."/>
      <bean id="bean2" class="..."/>
    </beans>
    

    上述配置加载了三个xml配置文件,其路径都是相对路径,即使第三个资源的路径前有一个/,这个/也会被忽略。

    不建议使用../这样的相对路径来引用父路径文件,并且classpath:URLs(如:classpath:../services.xml)也不建议这样的引用。我们可以使用绝对路径来引用配置文件,如:file:c:/config/service.xml或者classpath:/config/service.xml

  5. 使用容器

    ApplicationContext是一个接口,使得实现它的工厂类拥有各种bean及其依赖bean的注册表。通过调用T getBean(String name, Class<T> requeredType),我们得到需要的bean实例。

    // create and configure beans
    ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
    
    // retrieve configured instance
    PetStoreService service = context.getBean("petStore", PetStoreService.class);
    
    // use configured instance
    List<String> userList = service.getUsernameList();
    

    GenericApplicationContext与加载器的组合灵活多变的,如我们可以使用XmlBeanDefinitionReader来加载XML配置文件

    GenericApplicationContext context = new GenericApplicationContext();
    new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml");
    context.refresh();
    

    ApplicationContext还有其它的方法,但是理论上,我们的代码不应该去调用这些方法,甚至是getBean,因为调用这些方法,就意味着我们的代码和Spring耦合了。

  6. Bean 简介

    在容器中,我们编写的对bean的配置元数据表现为BeanDefinition对象。这个对象中包含以下的元数据:

    • 一个限定类名:特别的,当配置的是一个接口时,将会定义它的实现类。
    • Bean的行为配置元素,这将描述bean在容器总应该如何运行。
    • bean依赖的其他bean的引用,这些引用也被称为合作者或者依赖。
    • 设置新建对象的配置,如链接池的大小。

    ApplicationContext的实现类也允许注册已经存在由用户自己实例化的尚且不在容器中的对象。调用ApplicationContext的getBeanFactroy()方法,得到一个DefaultListableBeanFactroyBean工厂的实现类对象,调用DefaultListableBeanFactroy的registerSingletion()或者registerBeanDifinition()来注册bean

  7. 命名Bean

    每个Bean都已一到多个标识符,大部分情况下只有一个,在存在多个标识符的情况下,初第一个外的标识符被认定为Bean的别名。

    在基于XML的配置中,可以使用id属性、name属性或者两个都是用来命名Bean。id标签只能定义一个名称,name标签可以定义多个名称,名称之间用,、;或者是空格来隔开。

    容器规定Bean的id应该是唯一的。

    容器不强制规定需要定义id或者name属性,如果不需要引用这个bean,我们就可以不提供id和name,否则必须命名Bean。

    在Bean的定义之外为其指定别名:

    <!-- 为名为bean的Bean取别名为beanA -->
    <alias name="bean" alias="beanA"/>
    <!-- 为名为bean的Bean取别名为beanB -->
    <alias name="bean" alias="abeanB"/>
    
  8. 实例化Bean

    我们在<bean/>标签中通过class属性指定bean的类型,我们又两种使用class属性的方式:

    • 通常情况下,容器直接通过反射调用构造器构造对象。
    • 如果类存在构造对象的静态工厂方法,在这种情况下,容器可以通过调用工厂方法来构造对象。

    内部类的名称:如果我们想要定义一个嵌套类bean,我们必须使用嵌套类的二进制名称。例如:在com.example包中有一个SomeThing类,这个类嵌套了一个嵌套类OtherThing。
    那么在定义这个嵌套类时,class属性的值应该是:com.example.SomeThing$OtherThing。这里使用$将嵌套类名与外围基类名隔开。

    通过构造器实例化Bean

    大部分普通的类都可以通过这种方式实例化Bean,类不需要实现任何指定的接口或者需要按照指定的方式编写,简单的一些约定就足够了。比如需要一个默认的(空的)构造器。

    事实上,SpringIoC容器可以管理任何的类,不管是否符合JavaBean规格。

    通过构造器实例化Bean的配置方式:

    <bean id="exampleBean" class="examples.ExampleBean"/>
    <bean id="ontherExampleBean" class="examples.OntherExampleBean"/>
    

    通过工厂方法实例化Bean

    当一个类存在静态工厂方法时,使用class属性指定bean的类型,使用factory-method属性指定这个类的工厂方法的名字。工厂方法应该能够被调用且返回一个存活的对象。

    下面的定义通过调用静态工厂方法来实例化Bean,定义没有指定返回对象的类型,只指定了工厂方法所存在的类。工厂方法createInstance()必须是静态方法

    <bean id="clientService"
     class="examples.ClientService"
     factory-method="createInstance"/>
    

    下面的ClientService类符合上面的定义

    public class ClientService{
      public static ClientService clientService = new ClientService();
      public ClientService(){}
    
      public static ClientService createInstance(){
        return clientService;
      }
    }
    

    通过实例工厂方法实例化Bean

    同使用静态工厂方法相似,该方法通过调用已近存在于容器中的对象的非静态方法来实例化Bean。

    <!-- 工厂bean, 有一个名为createClientServiceInstance的方法-->
    <bean id="serviceLocator" class="examples.DefaultServiceLocator">
       <!-- inject any dependencies required by this locator bean -->
    </bean>
    
    <!-- 通过实例工厂实例化的bean -->
    <bean id="clientService"
       factory-bean="serviceLocator"
       factory-method="createClientServiceInstance"/>
    
产业园区如何高效对接企业技术需求与高校科研成果?.docx 科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。 立即下载

相关推荐

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Spring IOC容器的理解(五)

Spring框架学习指南

h123456789999999的博客 600

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

SpringBoot中引入WebSocket

SpringBoot中引入WebSocket 1、引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot

风萧水寒的博客 5036

Python与numpy版本兼容性排查指南

本文详细解析了Python与numpy版本兼容性问题,提供了快速诊断和解决版本冲突的实用方法。通过查看版本信息、使用官方兼容性对照表以及降级或升级环境等方案,帮助开发者有效避免常见的报错问题,如'ImportError'和'AttributeError'。文章还介绍了使用虚拟环境和requirements.txt等工程实践,确保项目依赖的稳定性。

weixin_29089057的博客 319

基于陀螺仪航向反馈的轮式机器人PID直线控制

航向角控制是移动机器人实现稳定直线运动的基础技术,其本质是通过实时感知机体朝向偏差并动态调节驱动输出,以抵消机械不对称、轮径误差等固有扰动。该方法依托陀螺仪测量角速度并积分解算航向角,结合离散化PID算法生成补偿性PWM指令,在嵌入式平台(如STM32)上构建低延迟闭环。相比依赖编码器的速度闭环,它规避了轮径标定与安装偏心等误差源,显著提升低成本平台的工程鲁棒性与部署效率。典型应用场景包括教育机器人直线循迹、AGV基础导航模块开发及IMU-PID融合控制原型验证。

web39explorer的博客 1110

《Spring in Action》第8章-异步消息发送

异步消息发送 JMS JMS是一个标准,它定义了同消息中间件工作的通用API。Spring提供了JmsTemplate,我们可以使用这个模板来使用JMS。 JMS设置 在使用JMS之前,我们需要在项目中添加JMS客户端。对于Spring Boot来说,我们只需要添加starter依赖就可以了。 如果我们使用ActiveMQ: <dependency> <groupId&g...

风萧水寒的博客 827

《Spring in Action》第3章-使用数据库

Spring与数据库 使用JDBC读写数据 使用JDBC(Java Database Connectivity)完成一次查询: Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; try{ connection = dataSource.getConnecti...

风萧水寒的博客 627

通义千问语言模型Qwen2.5架构详解

此外,将基于API的模型 Qwen-Plus 与领先的专有和开源模型进行了对比,包括 GPT4-o、Claude-3.5-Sonnet、Llama-3.1-405B和DeepSeek-V2.5。Qwen2.5-Math-72B-Instruct的整体性能超越了Qwen2-Math-72B-Instruct和GPT4-o,甚至是非常小的专业模型如 Qwen2.5-Math-1.5B-Instruct也能在与大型语言模型的竞争中取得高度竞争力的表现。近来也出现了明显的转向小型语言模型(SLMs)的趋势。

搏博的专栏 1万+

MQTT在智能家居中的实战:用Android手机控制ESP8266设备(基于EMQX)

本文详细介绍了如何利用MQTT协议构建一个完整的智能家居控制系统,通过Android手机App远程操控ESP8266设备。文章提供了从EMQX服务器部署、ESP8266端Arduino固件开发到Android客户端搭建的完整实战指南,并深入探讨了系统联调、稳定性优化与安全加固等关键环节,为物联网开发者提供了一套可复用的解决方案。

ujm567890的博客 457

《Spring in Action》第6章-REST services

REST services 编写RESTful风格的controller SpringMVC 提供了@RequestMapping注解用于映射请求与对应的Controller方法。同时,还提供了以下几个更加详细的注解: Annotation HTTP method Typical use @GetMapping HTTP GET requests Reading resource ...

风萧水寒的博客 574

PMOS缓启动电路设计实战:用LTspice优化上电时序,把60A冲击降到15A

本文通过一个实战案例,深入解析了PMOS缓启动电路如何有效抑制上电冲击电流。文章指出,低ESR电容是导致冲击电流飙升的元凶,并详细阐述了利用LTspice仿真工具,通过优化栅极电阻和栅源电容等参数,将高达60A的冲击电流成功降至15A的设计与优化过程,为电源开关电路设计提供了可复用的方法论。

onion的博客 899

《Spring in Action》第1章-开始使用Spring

开始使用Spring 1、构建一个Spring应用 使用Spring Initializr构建应用: http://start.spring.io 为Eclipse安装插件,并使用Eclipse创建 在IntelliJ IDEA中创建 2、构建后的应用结构 在构建项目时我们选择以下的依赖: 生成的项目结构如下: mvnw和mvnw.cmd是maven的打包脚本,及时我们没有安装mav...

风萧水寒的博客 502

基于C#开发ABB机器人上位机系统:从操作控制到数据交互的全方位实现

ABB工业机器人是世界领先的自动化设备之一,广泛应用于焊接、装配、搬运、喷涂、包装等多个行业。机器人控制器:用于控制机器人运动、路径规划、状态监控等。上位机系统:提供人机交互界面,允许操作员与机器人进行交互,实现实时控制、参数调整和数据分析。上位机系统通过与机器人控制器通信,采集机器人状态数据,发送控制指令,实现远程监控和控制操作。通过高效的操作界面和数据交互,可以大大提高机器人的工作效率和系统的可维护性。基于C#开发ABB机器人上位机系统,能够实现高效的机器人控制与实时数据交互。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1178

ADT MCP Server 把 ABAP 开发带进 Agent 模式

今天讨论 ADT MCP Server,不能只把它看成 Visual Studio Code 里多出来的一个开关。它真正有意思的地方,在于它把 ABAP 后端开发里那些原本需要手工点击、手工创建、手工激活、手工查服务元数据的动作,包装成一组可以被 GitHub Copilot 这类 coding agent 调用的工具。SAP 在 RAP130 练习里把它描述为运行在 ADT for Visual Studio Code 扩展内部的本地 HTTP Server,它实现的是 Model Context Pro

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 184

《Spring in Action》第2章-创建一个Web应用

开发Web应用 建立Domain Domain:一个引用的Domain就是这个应用处理的主体领域。在TacoCloud应用中,我们希望提供一个用户自己设计Taco的功能,那么Taco的成分类就属于该应用的Domain。 import lombok.Data; import lombok.RequiredArgsConstructor; @Data @RequiredArgsConstructor...

风萧水寒的博客 454

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

《Spring in Action》第4章-Spring Security

Spring Security 开始使用Spring Security 加入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </depen...

风萧水寒的博客 453

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring MVC 是如何处理请求的

SpringMVC 处理请求的过程 请求离开浏览器,到达DispathcerServlet,SpringMVC的每个请求都要通过这个前端控制器(front controller) Servlet。 在这里一个单实例的Servlet将请求委托给应用程序的其他组件来执行实际的操作。 DispathcerServlet的任务是将请求发送给Spring MVC控制器(Controller),一般应...

风萧水寒的博客 423

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

《Spring in Action》第5章-Configuration Properties

Configuration Properties 调整自动配置 Environment abstraction 对于任何可配置属性来说,Spring的Enviroment abstraction就是一个一站式的仓库。它抽象出各种属性源以供bean使用。Spring从以下几个属性源中抽取属性: JVM system propterties 操作系统环境变量 命令行擦桉树 应用的属性配置文件 Spr...

风萧水寒的博客 352

《Spring in Action》第7章-使用REST服务

使用REST服务 RestTemplate 同JDBCTemplate一样,为了消除大量繁琐的样板代码,RestTemplate提供了很多方法,使得我们能够很方便的调用REST服务。这些方法大致可分为以下12组重载方法: Method group Description getForObject Retrieves a representation via GET. ge...

风萧水寒的博客 342

04、IoCContainer-4 Bean作用域(Bean Scopes)

Bean作用域(Bean Scopes) Spring总的6种作用域 作用域 描述 singleton (默认作用域)在每个Spring容器中,一个bean定义只有一个对象实例 prototype 一个bean定义可以有任意多个对象实例 request 在一次HTTP请求中,一个bean定义对应一个对象实例。该作用域只在基于Web的Spring上下文中有效...

风萧水寒的博客 254

Spring AOP(面向切面编程)

基于接口的AOP 代理接口的所有方法 配置: <bean id="msgServerImpl" class="com.canwin.aop.MsgServerImpl"/> <bean id="beforeAdvice" class="com.canwin.aop.BeforeAdvice"/> <!--简单aop,需要使用代理bean--> <bean id="proxyMsgServer" class="org.springframework.aop.frame

风萧水寒的博客 252

03、IoCContainer-3 依赖

depends-on的使用 一般情况下,我们使用<ref/>元素来定义bean之间的依赖关系,但是有时候bean之间并不直接依赖。depends-on属性可以显式的强制一个或多个被依赖的beans在使用依赖的bean初始化之前被初始化。 <bean id="beanOne" class="ExampleBean" depends-on="manager"/&g...

风萧水寒的博客 216

02、IoCContainer-2 依赖

依赖 依赖注入(Dependency Injection) 依赖注入主要有两种形式: 基于构造器的依赖注入: 在改方式下,容器调用构造器,并向构造器传入参数,每个参数都是一个依赖。向静态工厂方法传递参数与向构造器传参一样。 下面这个类只能通过构造器注入进行依赖注入 public class SimpleMovieLister { // the SimpleMovieL...

风萧水寒的博客 211
上一篇: 核心技术(卷一)06、第12章-泛型程序设计
下一篇: 核心技术(卷一)07、第13章-集合
风萧水丶寒
博客等级 码龄11年 6粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值