3.IOC容器

CentOS7无外网环境下MySQL8.0完整离线部署指南 本文详细介绍了在CentOS7无外网环境下,如何通过MySQL8.0二进制包进行完整离线部署。指南涵盖了从环境准备、依赖安装、用户与目录创建,到数据库初始化、服务配置及远程访问设置的全过程,并提供了关键的避坑技巧,帮助企业运维人员在内网环境中高效、稳定地搭建MySQL数据库服务。 阅读详情

ioc容器

三种配置方式

  1. XML:最基本,最完整、强大

  2. 注解(Annotation),@Sine 2.5

    1. 疑问:基于注解,怎么读取<context:component-scan base-package="com.xxx"/> 并去扫描,初始化有此类的bean? 会用到自定义空间解析
    2. 常用几种注解
      1. @Componet 通用型
      2. @Controller controller层
      3. @Service service层
      4. @Repository dao层
      5. @Autowired 默认byType注入
      6. @Resource JSR,默认byName注入
  3. Java配置, @Sine 3.0

  4. 理解:

    基于XML功能强大,但是与代码分开了,感觉编写起来麻烦,基于注解和Java配置,让配置像写代码一样,易于理解和维护,但是可能缺失了部分功能.无论使用哪种方式,最终达到的效果是一样的,即会统一转化为Spring BeanDefinition等配置。

依赖注入

自定义属性解析器

  1. 定义bean

    package com.desmond.springlearning.customproperty;
    
    import java.util.Date;
    
    /**
    * @author presleyli
    * @date 2018/9/11 下午10:04
    */
    public class UserBean {
       private Date birthday;
    
       public Date getBirthday() {
           return birthday;
       }
    
       public void setBirthday(Date birthday) {
           this.birthday = birthday;
       }
    }
    
  2. 定义解析器

    package com.desmond.springlearning.customproperty;
    
    import java.beans.PropertyEditorSupport;
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Locale;
    
    /**
    * @author presleyli
    * @date 2018/9/11 下午10:04
    */
    public class DatePropertyEditor extends PropertyEditorSupport{
       @Override
       public void setAsText(String text) throws IllegalArgumentException {
           try {
               DateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
    
               this.setValue(df.parse(text));
           } catch (ParseException e) {
               e.printStackTrace();
           }
       }
    }
    
  3. 配置文件

    <?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 http://www.springframework.org/schema/beans/spring-beans.xsd "
           default-autowire="default">
    
      <bean id="userBean" class="com.desmond.springlearning.customproperty.UserBean">
          <!-- 时间属性,需要属性编辑器 -->
          <property name="birthday" value="2017-11-26"/>
      </bean>
    
       <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
           <property name="customEditors">
               <map>
                   <entry key="java.util.Date" value="com.desmond.springlearning.customproperty.DatePropertyEditor"/>
               </map>
           </property>
       </bean>
    </beans>
  4. 测试

    package com.desmond.springlearning.customproperty;
    
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    /**
    * @author presleyli
    * @date 2018/9/11 下午10:11
    */
    public class Test {
       public static void main(String[] args) {
           BeanFactory factory = new ClassPathXmlApplicationContext("customproperty/applicationContext.xml");
           UserBean ub = factory.getBean(UserBean.class);
    
           System.out.println(ub.getBirthday());
       }
    }
  5. 输出

    Sun Nov 26 00:00:00 CST 2017
  6. 大概原理:

    Spring 会内置一些字面量的解析器,比如把字符串"2"转化成整数2. 也会根据用户的需求,填充自定义属性,过程如下
    

    流程图

循环依赖(构造器)

描述

​ A 依赖 B, B 也依赖 A:

public Class Bar {
    private Foo foo;

    public Bar(Foo foo) {
        this.foo = foo;
    }

    // setter and getter
}

public Class Foo {
    private Bar bar;

    public Foo(Bar bar) {
        this.bar = bar;
    }

    // setter and getter
}

运行时,抛出BeanCurrentlyInCreationException.

解决

​ 容器创建A(提早曝光,这时只是 A a = new A(), a只是最原始的实例,没有装配任何属性) -> 发现需要依赖B -> new B(a) -> 发现需要实例a, 因为 a 已经提早曝光了,所以能够拿到这个最原始的实例,完成B的实例 b的创建(是先new B(),然后setA,还是直接 new B(a)?) -> 返回实例 b -> a.setB(b) -> 结束.

重写Bean定义

​ 两种重写机制:配置元素 和 容器级别

配置元素

​ 利用配置元素的先后顺序,相同的bean name, 后面的会覆盖前面的

基于Java配置
  1. 两个配置类(同一配置类里,bean name唯一)

    package com.desmond.springlearning.bean_name_override;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    /**
     * @author presleyli
     * @date 2018/9/13 上午4:18
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Foo {
        private String name;
    }
    
    package com.desmond.springlearning.bean_name_override;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @author presleyli
     * @date 2018/9/13 上午4:18
     */
    @Configuration
    public class ConfigurationBean1 {
        @Bean
        public Foo foo1() {
            return new Foo("foo1 from b1");
        }
    
        @Bean
        public Foo foo2() {
            return new Foo("foo2 from b1");
        }
    
    package com.desmond.springlearning.bean_name_override;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @author presleyli
     * @date 2018/9/13 上午4:18
     */
    @Configuration
    public class ConfigurationBean2 {
        @Bean
        public Foo foo1() {
            return new Foo("foo1 from b2");
        }
    
        @Bean
        public Foo foo2() {
            return new Foo("foo2 from b2");
        }
    }
    
    1. 测试类
    package com.desmond.springlearning.bean_name_override;
    
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    /**
    * @author presleyli
    * @date 2018/9/13 上午4:20
    */
    public class Test {
       public static void main(String[] args) {
           AnnotationConfigApplicationContext applicationContext
                   = new AnnotationConfigApplicationContext(ConfigurationBean1.class, ConfigurationBean2.class);
    
           Foo foo = applicationContext.getBean("foo1", Foo.class);
           System.out.println(foo.getName());
       }
    }
    1. 结果
    foo1 from b2
基于XML配置
  1. 连个配置文件(同一配置文件,beanName唯一)

    <?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:p="http://www.springframework.org/schema/p"
          xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "
          default-autowire="default">
    
       <bean id="foo" class="com.desmond.springlearning.bean_name_override.Foo" p:name="I'm foo from config1."/>
    </beans>
    <?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:p="http://www.springframework.org/schema/p"
          xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "
          default-autowire="default">
    
       <bean id="foo" name="foo2" class="com.desmond.springlearning.bean_name_override.Foo" p:name="I'm foo from config2."/>
    </beans>
  2. 测试类

    package com.desmond.springlearning.bean_name_override;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    /**
    * @author presleyli
    * @date 2018/9/13 上午4:20
    */
    public class Test2 {
       public static void main(String[] args) {
           ApplicationContext applicationContext
                   = new ClassPathXmlApplicationContext(new String[]{
                   "bean_name_override/applicationContext2.xml",
                   "bean_name_override/applicationContext1.xml"
    
           });
    
           Foo foo = applicationContext.getBean("foo", Foo.class);
           System.out.println(foo.getName());
       }
    }
    
  3. 结果

    I'm foo from config1.

容器级别

​ 不同的容器,可以存在同名的bean, 比如child container与parent container.

Android性能优化之Android Profiler 在移动应用开发中,打造一个流畅、省电且不卡顿的用户体验是至关重要的。然而,随着应用功能的日益复杂,内存泄漏、CPU暴涨、网络卡顿以及电量消耗过快等问题常常化身为隐形杀手,悄悄吞噬着用户体验。为了帮助开发者精准定位并解决这些性能瓶颈,谷歌在Android Studio中集成了一款强大的一站式性能分析工具Android Profiler。Android Profiler作为Android Studio内置的实时数据可视化工具,支持运行在Android 5.0及更高版本的设备上。 阅读详情

相关推荐

stm32使用TB6600驱动器控制42BYGH型步进电机

stm32使用TB6600驱动器控制42BYGH型步进电机

qq_35653974的博客 9587

2024已过半,还没试过在vue3中使用ioc容器吗?

那么,如果搬砖累了,就玩一玩支持ioc容器的vue3框架吧,尝试一下全新的开发体验。濮水大叔引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构。

sdgfafg_25的博客 857

【Unity】Unity 跨平台及编译过程

早期的Unity跨平台是基于MONO运行时的,又通过CLS实现了跨语言。其基本思路是将各个版本的语言统一编译成CIL语言,在不同平台运行时使用CLR进行解释。有点类似于Java的jdk和jvm。 CLS(Common Language System)通用语言规范:CLS是一种规范,类似于schema,当文件被指定遵守CLS规范后,在某语言中写出不符合通用规范的代码后将被警告或报错。 MONO是一个开源工程,其中包含C#编译器,CLR运行时,以及一组类库。该工程常见了一系列符合ECMA标准的.NET工具,MO

一个普普通通的游戏开发者 7239

加油,为Vue3提供一个可媲美Angular的ioc容器

为什么要为Vue3提供ioc容器 Vue3因其出色的响应式系统,以及便利的功能特性,完全胜任大型业务系统的开发。但是,我们不仅要能做到,而且要做得更好。大型业务系统的关键就是解耦合,从而减缓shi山代码的生长。而ioc容器是目前最好的解耦合工具。Angular从一开始就引入了ioc容器,因此在业务工程化方面一直处于领先地位,并且一直在向其他前端框架招手:“我在前面等你们,希望三年后能再见”。那么...

weixin_36976343的博客 421

ARM Cortex平台NEON指令集优化实战指南

本文为ARM Cortex平台开发者提供了一份全面的NEON指令集优化实战指南。文章从NEON的SIMD架构原理讲起,详细介绍了开发环境搭建、NEON内联函数与自动向量化两种核心编程方法、关键数据类型与指令,并通过图像饱和运算、矩阵乘法等实战案例,深入解析了性能调优技巧与常见避坑指南,旨在帮助开发者充分释放ARM处理器的并行计算潜力。

weixin_29162439的博客 260

【教程】ENVI主成分分析详解

主成分分析(PCA)是一种统计方法,简而言之就是用几种特性去描述事物。每个事物都可以用不同的特性去进行表达,但这些特性一般而言是存在相互的融合和冗余,而用主成分分析方法将这些特性进行转换成不相关的新特性。 在ENVI软件中共提供了三种主成分分析方式分别为:(1)Forward PCA Rotation Existing Statistics(2)Forward PCA Rotation New Statistics and Rotate(3)Inverse PCA Rotati...

YW_remote的博客 1万+

3、IOC 容器

3、IOC 容器 3.1 IOC(Inversion of Control 概念和原理) 3.1.1 什么是 IOC ? (1)控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 (2)使用IOC目的:为了耦合度降低 (3)做入门案例就是IOC实现 3.1.2 IOC 底层原理 xml解析、工厂模式、反射 3.1.3 画图讲解IOC底层原理 3.2 IOC 接口 (1)IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂 (2)Spring提供IOC容器实现两种方式:(两个接口

CoderJay 218

【AUTOSAR】MCU Port的配置(MCAL)【EB】

熟悉Classic AUTOSAR架构的朋友应该知道,经常需要用到MCU中的Port这个模块。那么如何通过工具快速配置一个Port呢?

xinsuiwodong2014的博客 9513

3、Spring 之IOC 容器 详解

IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。

一切总会归于平淡 2480

Snort源代码编译 _ 采坑之旅(for Windows VS2015)

    系统环境:Windows7 sp1 x64     编译环境:VS2015 SP1     Snort版本:2.9.12     daq版本:2.0.6     Snort官网:https://www.snort.org/downloads#snort-downloads 背景     最近需要实现一个类似网络防火墙的产品,主要参考Snort源码,先花了点时间简单读了下网上比较流行的《...

magictong的专栏 8889

平衡电桥检测高压绝缘电阻的原理

检测绝缘漏电的高压拓扑如下:BMU需要连接BAT+,BAT-和PE线,并测量电池总压(Ubatt)和负母线电压(Un),并计算出正母线电压(Up)。

booksyhay的专栏 1万+

3、IoC容器

3、容器:IoC原理 IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。我们将由 IoC 容器管理的 Java 对象称为 Spring Bean,它与使用关键字 new 创建的 Java 对象没有任何区别。 IoC 容器是 Spring 框架中最重要的核心组件之一,

Hang-的博客 436

BUCK型DC/DC变换器的建模与仿真

BUCK型DC-DC变换器的建模与仿真摘要1 文献调研1.1 研究背景1.2 Buck电路的应用场合2 原理分析2.1 模型介绍2.2 模型分析2.3 频域和时域响应2.4 参数指标要求3 参数设计3.1 校正器选择3.2 校正器参数整定3.2.1 积分器3.2.2 一阶微分环节3.2.3 超前校正器3.3 改进4 结论与展望参考文献 摘要   目前工业自动化水平已成为衡量各行各业现代化水平的一个重要标志。如何对一个系统进行建模分析、补偿校正变得越来越重要。   本文选择BUCK型DC/DC变换器作为载体,

屠龙归来仍是少年 2万+

3-Spring IoC容器概述

文章目录1. Spring IoC依赖查找1.1 根据Bean名称查询1.2 根据Bean类型查找1.3 根据Bean名称和类型查找1.4 根据Java注解查找 参考:小马哥讲Spring核心编程思想 1. Spring IoC依赖查找 1.1 根据Bean名称查询 实时查找 延时查找 1.2 根据Bean类型查找 单个Bean对象 集合Bean对象 1.3 根据Bean名称和类型查找 1.4 根据Java注解查找 单个Bean对象 集合Bean对象 ...

tobebetter9527的博客 390

visio安装包

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

android 蓝牙通讯demo

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

Spring3.1.3 Ioc在Web容器中的建立

Spring3.1.3  Ioc在Web容器中的建立

zhenyaoMilenfan的专栏 333

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

《SpringBoot 3:入门与应用实战》第 3 章 IOC 容器中的 Bean 阅读笔记 3

《SpringBoot 3:入门与应用实战》第 3 章 IOC 容器中的 Bean 阅读笔记 3

道友 239

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

四 WPF-IOC框架第3.5讲之完善容器

【代码】四 WPF-IOC框架第3.5讲之完善容器。

Major_S的博客 422

Spring6 第3章——容器:IoC

Spring6 第3章——容器:IoC

weixin_74019079的博客 1497

Spring 学习笔记3 —— IOC容器 3 (使用注解配置IOC容器)

传送门——>官方文档 这里我做的这份笔记的意义仅仅是记录下自己初涉Spring的历程,既不是对官方API的深入解释,也不一定是对新手友好的、知识点详尽的一份学习清单。 综上,不喜勿喷,但是有问题欢迎评论区交流! 文章目录1 Spring IoC容器和Bean简介 1 Spring IoC容器和Bean简介 注解在配置Spring上比XML更好吗? ...

SongyangJi 519

Spring 6: 3容器-Ioc

FactoryBean是Spring提供的一种整合第三方框架的常用机制。和普通的bean不同,配置一个FactoryBean类型的bean,在获取bean的时候得到的并不是class属性中配置的这个类的对象,而是getObject()方法的返回值。通过这种机制,Spring可以帮我们把复杂组件创建的详细过程和繁琐细节都屏蔽起来,只把最简洁的使用界面展示给我们。将来我们整合Mybatis时,Spring就是通过FactoryBean机制来帮我们创建SqlSessionFactory对象的。/*

jianjiange1的博客 1140

Spring二次学习——3.ioc容器的概念

2.2.1 IoC容器的概念 IoC容器就是具有依赖注入功能的容器,IoC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中new相关的对象,应用程序由IoC容器进行组装。在Spring中BeanFactory是IoC容器的实际代表者。 Spring IoC容器如何知道哪些是它管理的对象呢?这就需要配置文件,Spring IoC容器通过读取配置文件中的...

微微安的博客 553

《SpringBoot 3:入门与应用实战》第 3 章 IOC 容器中的 Bean 阅读笔记 1

《SpringBoot 3:入门与应用实战》第 3 章 IOC 容器中的 Bean 阅读笔记 1

道友 222

《SpringBoot 3:入门与应用实战》第 3 章 IOC 容器中的 Bean 阅读笔记 5

《SpringBoot 3:入门与应用实战》第 3 章 IOC 容器中的 Bean 阅读笔记 5

道友 375
上一篇: 2.知识点拾遗-轻量级容器和控制反转
下一篇: 杂记-JPA DO
desmond_assis
博客等级 码龄14年 33粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值