06、IoCContainer-6 Bean定义的继承、容器扩展点

工业缺陷检测大模型本地化部署与可视化系统实战 深度学习大模型在工业缺陷检测领域展现出强大的特征提取和泛化能力,逐渐替代传统机器视觉方法。其技术原理是通过卷积神经网络或Transformer架构学习缺陷特征表示,在工程实践中需要解决模型轻量化、推理加速等关键问题。本地化部署采用YOLOv8等主流架构,结合TensorRT优化和Docker容器化技术,可显著提升检测实时性并保障数据安全。典型应用场景包括电子产品装配线的焊点检测、元件定位等质量管控环节,其中模型量化与可视化系统设计是确保项目落地的两个核心技术点。 阅读详情

Bean定义的继承、容器扩展点

  1. 定义继承

    在<bean>元素中定义parent属性,使这个bean定义继承另一个bean定义。

     <bean id="inheritedTestBean" abstract="true"
        class="org.springframework.beans.TestBean">
        <property name="name" value="parent"/>
        <property name="age" value="1"/>
     </bean>
    
     <bean id="inheritsWithDifferentClass"
            class="org.springframework.beans.DerivedTestBean"
            parent="inheritedTestBean" init-method="initialize">  
        <property name="name" value="override"/>
        <!-- the age property value of 1 will be inherited from parent -->
     </bean>
    

    子定义可以继承父定义的作用域,构造器参数,属性值;也可以覆盖父定义的方法,比如初始话回调,销毁回调和静态工厂方法等。

    下面的设置总是取自子定义:依赖、自动装配模式、依赖检查和懒启动。

    如果在一个bean定义中abstract属性为true,那么这个bean将不会被实例化,它只会作为子定义的模板。如果一个bean定义没有指定class属性,一定要配置abstract属性。

  2. 使用BeanPostProcessor定制Bean

    2.1 BeanPostProcessor

    实现BeanPostProcessor接口定义的方法,我们可以定义自己的实例化逻辑和依赖解析逻辑等。也可以在容器完成实例化、配置、和初始化bean之后完成我们定义的一些逻辑。

    如果我们实现了多个BeanPostProcessor,我们还可以通过实现Ordered接口来定义这些工作逻辑的执行顺序。

    每个post-processor只在自己所在的容器中起作用。

    容器将自动搜寻并注册那些实现了BeanPostProcessor接口且在配置元数据中有定义的bean。下面是一个简单的例子,这个post-processor将在每个bean初始化后都打印结果。

    class InitialResultPostProcessor implements BeanPostProcessor, Ordered {
        public static Logger log = Logger.getLogger("com.heisenberg.spring");
        //post-processor的执行顺序
        @Override
        public int getOrder() {
            return 0;
        }
        //每一个bean初始化之前回调该方法
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
        //每一个bean初始化之后回调该方法
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            log.info(Utils.buildLogInfo(beanName + " has been initialed"));
            return bean;
        }
    }
    
    <bean id="postProcessor" class="com.heisenberg.spring.pojo.InitialResultPostProcessor"/>
    
  3. 使用BeanFactoryPostProcessor定制配置数据元

    从语义上看,BeanFactoryPostProcessor与BeanPostProcessor相似,但是它们有一个主要的不同点:BeanFactoryPostProcessor操作bean的配置数据元。Spring IoC容器让一个BeanFactoryPostProcessor读取配置信息,也允许它在初始化这些bean(除BeanFactoryPostProcessorbean之外)之前修改他们的配置。

    如果我们实现了多个BeanFactoryPostProcessor,我们还可以通过实现Ordered接口来定义这些工作逻辑的执行顺序。

    每个bean factory post-processor只在自己所在的容器中起作用。

    Spring包含几个预定义的bean factory post processor,如PropertyOverrideConfigurer和PropertySourcesPlaceholderConfigurer。

    BeanPostProcessor和BeanFactoryPostProcessor会预初始化,即使我们将这些bean设置为lazy-init=true,或者整个容器的bean都懒加载default-lazy-init=true。

    public interface BeanFactoryPostProcessor {
        void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException;
    }
    

    3.1 PropertySourcesPlaceholderConfigurer

    org.springframework.context.support.PropertySourcesPlaceholderConfigurer 实现了BeanFactoryPostProcessor接口。这个类可以让我们在单独的文件中配置bean的属性值。

    <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="locations" value="classpath:com/something/jdbc.properties"/>
    </bean>
    
    <bean id="dataSource" destroy-method="close"
            class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    

    jdbc.properties文件内容:

    jdbc.driverClassName=org.hsqldb.jdbcDriver
    jdbc.url=jdbc:hsqldb:hsql://production:9002
    jdbc.username=sa
    jdbc.password=root
    

    通过上面的配置,dataSourcebean的属性值在应用运行时被替换。

    我们也可以使用专门的元素<context>来配置property placeholder:

    <!-- location的值可以是多个用,隔开的文件路径 -->
    <context:property-placeholder location="classpath:com/something/jdbc.properties"/>
    

    property placeholder不仅可以用来替换bean的基础类型值,还可以用来替换<bean>元素的class属性值。当我们在运行时必须要指定一个实现类型时,这个特性就十分的有用

    <bean class="org.springframework.beans.factory.config.PropertySourcesPlaceholderConfigurer">
        <property name="locations">
            <value>classpath:com/something/strategy.properties</value>
        </property>
        <property name="properties">
            <value>custom.strategy.class=com.something.DefaultStrategy</value>
        </property>
    </bean>
    
    <bean id="serviceStrategy" class="${custom.strategy.class}"/>
    

    3.2 PropertyOverrideConfigurer

    与PropertySourcesPlaceholderConfigurer类似,但是PropertyOverrideConfigurer允许bean的属性有默认值或者没有值。如果一个Properties文件没有对应于这个bean某个属性的实体时,这个属性就使用某人值,否则默认值将被覆盖。Properties文件的格式为:

    dataSource.driverClassName=com.mysql.jdbc.Driver
    dataSource.url=jdbc:mysql:mydb
    

    上面的配置是dataSourcebean的driverClassName与url属性的覆盖值。还支持符合属性名:

    aaa.bbb.ccc=ddd
    

    beanaaa的域bbb的ccc属性的覆盖值为:ddd

    简便的PropertyOverrideConfigurerbean配置:

    <context:property-override location="classpath:override.properties"/>
    
  4. 通过FactoryBean制定实例化逻辑(注意不是BeanFactory)

    FactoryBean接口有3个方法:

    public interface FactoryBean<T> {
         String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
    
         @Nullable
         T getObject() throws Exception;
    
         @Nullable
         Class<?> getObjectType();
    
         default boolean isSingleton() {
             return true;
         }
     }
    

    在容器中注册一个FactoryBean,并为其设置一个id(这里假设为:factoryBean),那么调用ApplicationContext的getBean()方法,入参beanName的值若是"factoryBean",那么我们实现的getObject方法将会被调用。若入参beanName的值为:"&factoryBean"(多了&前缀),我们将的到factoryBeanbean本身的实例。

    若一个bean的实例化过程十分的复杂,使用FactoryBean是一个非常好的选择。

科技中介服务机构想要提升服务效率,需要哪些数智工具支持?.docx 科技中介服务机构想要提升服务效率,需要哪些数智工具支持? 立即下载

相关推荐

usb 扩容盘检测修复工具源码,编译产物

usb 扩容盘检测修复工具源码,编译产物

spring文档阅读笔记(二)

1.实现beanPostProcesor(后置处理器理)bean初始化完成前后的操作(调用用户定义的init-method的前后操作)public class InstantiationTracingBeanPostProcessor implements BeanPostProcessor { // simply return the instantiated bean as-is ...

mingshen3的博客 216

融合UWB和IMU割草机定位EKF研究(Matlab代码实现)

内容概要:本文主要介绍了一个名为“Plecs全桥LLC谐振变换器仿真模型”的技术资源,该资源聚焦于电力电子领域中的LLC谐振变换器建模与仿真,涵盖开环、闭环控制、软启动设计及参数优化等核心内容。文档不仅提供了LLC变换器的详细建模方法与仿真案例,还系统梳理了其在高效电源转换系统中的应用,包括隔离型全桥拓扑结构的设计与性能分析。此外,资源汇总了大量Matlab/Simulink仿真模型及相关科研方向,涉及新能源并网、储能控制、电机驱动等多个前沿领域,全面展示LLC谐振变换器在现代电力系统中的关键技术实现路径。同时,文档附带多种学习资料获取途径,如网盘链接和公众号资源,便于研究人员深入实践与拓展研究。; 适合人群:具备扎实的电力电子、自动控制理论基础,从事新能源发电、开关电源设计、电力系统仿真等相关领域的研究生、工程师及科研人员。; 使用场景及目标:①深入理解LLC谐振变换器的工作原理、建模方法与控制策略;②开展电力电子变换器的仿真验证与参数优化设计;③支撑科研项目、学位论文或工程项目的系统仿真与方案验证; 阅读建议:建议结合所提供的仿真模型与参考文献,使用Plecs或Simulink软件进行动手实践,重点掌握LLC谐振变换器的建模流程、闭环控制设计、软启动机制及参数调试技巧,以全面提升在实际工程中的应用与创新能力。

SpringBoot中引入WebSocket

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

风萧水寒的博客 5036

实验记录 | 如何拆分scATAC-seq数据成为单个细胞?(1、解决barcode问题)

在师兄的帮助下,我得到了师兄筛选过的细胞的barcode的数据,那么接下来我想根据这些barcode,将来源于同一个barcode的细胞的reads提取出来,这个还是一个蛮有技术含量的事情的,因为上次我有使用过perl的脚本进行提取,最后的实验结果很糟糕,故而这件事情一直搁置到现在,没有继续去做(我的脚本的编写能力还是有待于加强,可能是刚刚喝了奶茶,和老妈弟弟聊了好多闲话,很开心,觉得在某种程度上休息够了,对于工作也是一种非常快乐和积极的状态了)。 0。前期失败尝试回顾 ...

weixin_40640700的博客 1887

Windows Server 2008 R2装不上VMware Tools?别急,手动安装驱动补丁的保姆级教程来了

本文提供了Windows Server 2008 R2手动安装VMware Tools驱动补丁的详细教程,解决驱动签名验证失败问题。通过获取特定补丁文件、创建安装介质、挂载虚拟机并安装补丁等步骤,帮助用户顺利完成VMware Tools安装,提升虚拟机功能与性能。

weixin_28335283的博客 468

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

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

风萧水寒的博客 827

2024广东省职业技能大赛云计算——集群部署GitLab

题目是这样的:在Kubernetes集群中新建命名空间gitlab-ci,将GitLab部署到该命名空间下,Deployment和Service名称均为gitlab,以NodePort方式将80端口对外暴露为30880,设置GitLab服务root用户的密码为admin@123,将项目包demo-2048.tar.gz导入到GitLab中并命名为demo-2048。GitLab是一个功能强大且灵活的 DevOps 平台,为开发团队和企业提供了从代码管理到持续集成、交付和部署的一整套解决方案。

kuuuugua的博客 4396

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

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

风萧水寒的博客 627

WGS-84 ECEF ENU 坐标系学习记录

地球坐标系固定在地球上而随地球一起在空间做公转和自转运动,因此地球上任一固定点在地球坐标系的坐标就不会由于地球旋转而变化。地心地固直角坐标系和大地坐标系都属于这种坐标系。 一、 几种坐标系 地心地固直角坐标系(ECEF)坐标系 其原点为地球的质心,x轴延伸通过本初子午线(0度经度)和赤道(0deglatitude)的交点。 z轴延伸通过的北极(即,与地球旋转轴重合)。 y轴完成右手坐标系,穿...

YYshuangshuang的博客 1万+

WPS文档编辑时空行问题解决方案

本文详细介绍了如何解决WPS文档编辑时空行的问题,从问题描述与分析、解决方案详解到操作示例与注意事项等多个方面进行了全面阐述。通过本文的介绍和指导,用户可以快速定位问题根源并采取有效措施进行解决,从而提升文档编辑效率和美观性。未来,随着WPS软件的不断升级和优化,相信会有更多便捷高效的功能被添加到软件中。同时,用户也需要不断学习和探索新的操作技巧和方法,以适应不断变化的办公需求。希望本文能够为广大WPS用户提供有益的参考和帮助,共同推动办公效率的提升和发展。

mmoo_python的博客 1244

《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

2026.2.23:AgentScope框架实战<一>:安装并使用agentscope

本文介绍了AgentScope框架的安装与使用实践。通过PyPI安装agentscope[full]后,演示了如何创建ReActAgent代理:1)配置DashScope聊天模型;2)注册自定义工具函数(查询位置和天气);3)初始化代理并处理用户请求。示例展示了代理如何响应复合查询(如同时获取北京位置和天气信息),输出结果显示代理成功执行了工具调用并返回结构化响应。该框架支持Python 3.13环境,提供内存管理、工具集成等功能,适用于构建智能代理系统。

拥抱具身智能,昇腾Ascend C 509

《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

超声波传感器(CHx01) 学习笔记 Ⅲ-API介绍

超声波传感器(CHx01) API介绍

nicole088的专栏 1387

OpenClaw实战系列04:Jira/Confluence深度集成实战指南

汇总 Confluence 空间 TEAM 下所有关于“性能优化”的文档,输出要点自然语言创建和查询 Jira 任务,无需离开聊天工具基于 Confluence 的私有知识库问答,让 AI 真正理解团队文档Jira 与 Confluence 联动,打通项目管理与知识管理定时同步与通知,自动化团队信息流转至此,你的 OpenClaw AI 助理已经不仅是一个聊天机器人,而是真正融入团队工作流的“智能项目管理助手”。下一期我们将带来OpenClaw 自定义技能开发实战。

PeterPan的博客 574

《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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spring MVC 是如何处理请求的

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

风萧水寒的博客 423

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

《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

01、IoCContainer-1 容器、Bean

容器、Bean 介绍 IoC(IoCInversion of Control)也叫依赖注入DI(dependency injection) 对象可以通过构造函数参数、工厂方法参数,或者是对象自己被实例化后设置的属性来定义它们所依赖的其它对象。当所依赖的对象被实例化后,容器注入这些bean。bean自己控制依赖的实例化,或者是直接通过类的解析和Service Locator模式这...

风萧水寒的博客 307

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
上一篇: 05、IocContainer-5 自定义Bean的性质
下一篇: Java 与文字编码
风萧水丶寒
博客等级 码龄11年 6粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值