Spring Ioc 依赖来源-7

news2024/11/30 4:57:26

1. 依赖查找的来源:除容器内建和自定义Spring Bean之外,还有其他来源提供依赖查找吗?

  • 查找来源

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JSS4j7qU-1670835429210)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202104519610.png)]

  • Spring 內建 BeanDefintion

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s1USFp7D-1670835429211)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202113551771.png)]

  • Spring 內建单例对象

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hPyA3wXh-1670835429211)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202113628018.png)]

  • 当spring在注解环境下面, 这个 registerAnnotationConfigProcessors API会被调用, 它会被显示的去调用, 这个显示调用会有几个场景

    第一个就是xml配置Annotation驱动

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
    
           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
    
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/beans/spring-context.xsd
    ">
    
        <!-- 加载注解驱动所需要的 Spring 基础组件 -->
        <context:annotation-config />
    
        <!-- 扫描 @Component Class -->
        <context:component-scan base-package="org.xiaoge" />
    
    <!--    实施加载bean-->
        <bean id="user" class="org.xiaoge.thinking.in.spring.ioc.overview.domain.User">
            <property name="id" value="1" />
            <property name="name" value="xiaoge"/>
            <property name="city" value="WUHAN"/>
            <property name="configFileLocation" value="classpath:/META-INF/dependency-lookup-context.xml"/>
            <property name="workCities" value="WUHAN, HANGZHOU"/>
    <!--        <property name="lifeCities" value="WUHAN, BEIJING"/>-->
            <property name="lifeCities">
                <list>
                    <value>WUHAN</value>
                    <value>BEIJING</value>
                </list>
            </property>
            <property name="map">
                <map>
                   <entry key="one" value="1" />
                   <entry key="two" value="2" />
                </map>
            </property>
        </bean>
    
        <!-- 延迟bean 是沟通objectFactory简介创建的 -->
        <bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
            <property name="targetBeanName" value="user" />
        </bean>
    
        <!-- parent继承 -->
        <bean id="superUser" class="org.xiaoge.thinking.in.spring.ioc.overview.domain.SuperUser" parent="user" primary="true">
            <property name="address" value="武汉" />
        </bean>
    
    </beans>
    

    annotation-config/component-scan都是注解驱动着一个XML元素的配置, 这些元素触发如下API调用:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFcNKcM3-1670835429212)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202133824397.png)]

    看一下它到底被谁给调用了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5PhGQnW2-1670835429212)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202135008834.png)]

    它在xml处理的时候会被调用, 同时也会被, 同时ComponentScan里面进行调用了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wi1Q5YGU-1670835429212)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202140644026.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S2lLpvQh-1670835429213)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202140708742.png)]

    包括AnnotatedBeanDefinitionReader它实际上是在AnnotationConfigApplicationContext关联的当它load的时候吧对应的信息读取进来

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jdSTcd3N-1670835429213)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202140805037.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1voSlbCX-1670835429213)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202141029841.png)]

    最终调用 registerAnnotationConfigProcessors API把这些信息注入到应用上下文中, @Configuration @Autowired @Resource等

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dwhTj4OY-1670835429214)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202141307086.png)]

    这些Bean都会放到应用上下文中来进行注册, 这些东西都是称之为一个常规的Bean, 这些常规的Bean是在 AbstractApplicationContext#prepareBeanFactory 地方调用的, 这里头会注册非常多的一些信息, 包括上面的内建单例对象等

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-POWNoDYa-1670835429214)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202142117074.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lrEkWdum-1670835429214)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202142202778.png)]

    那么当有BeanDefinition初始化完成之后, 它会调用 invokeBeanFactoryPostProcessors API, 通常我们AnnotationConfigUtils注册的这个类基本上BeanFactoryPostProcessor实现或者FactoryBean的实现, 因此在实现来说注册和调用它会激活它里面的生命周期。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y5RsZlip-1670835429215)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202142430160.png)]

2. 依赖注入的来源:难道依赖注入的来源与依赖查找的不同吗?

  • 注入来源

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8f8ow2Pf-1670835429215)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202143127627.png)]

    从这里可以看出它用了类型和对应做了个映射关系, 这种关系能够帮助我们进行依赖注入, 它这里还写了个相关的 API 它说这个地方是用于 autowiring 自动绑定时候所运用来找到, 那么这种方式也始终依赖注入的方式。那么相较于我们的依赖查找, 这里增加了种新的来源, 这几个对象在DefaultListableBeanFactory#findAutowireCandidates依赖查找中运用到

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ji314YO-1670835429215)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202144258718.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8YQMiVQE-1670835429216)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202145026305.png)]

    从this.resolvableDependencies值中可以看出我们锁保存的resolvableDependencies实际上就是我们刚刚注入或注册的由框架内部来进行注册的这些信息, 为了证明这个猜想回过头来看它里面的一个实现, 可以看到实际上就是这样做的, 它就是把东西方法ConcurrentHashMap里面去, 前面有四个注入的对象, 因此, 这个时候通过不同四个类型注入两个不同对象, 一个是BeanFactory, 一个是三个相同的List就是当前的应用上下文

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T84cHRlD-1670835429216)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202145951853.png)]

    package org.xiaoge.thinking.in.spring.ioc.dependency.source;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.NoSuchBeanDefinitionException;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationEventPublisher;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.core.io.ResourceLoader;
    
    import javax.annotation.PostConstruct;
    
    /**
     * 依赖来源 示例
     *
     * @author <a href="mailto:1330137071@qq.com">Zhang Xiao</a>
     * @since
     */
    public class DependencySourceDemo {
    
        // 注入在 postProcessProperties 方法执行。早于 setter注入,也早于@PostConstruct
        @Autowired
        private BeanFactory beanFactory;
    
        @Autowired
        private ResourceLoader resourceLoader;
    
        @Autowired
        private ApplicationEventPublisher applicationEventPublisher;
    
        @Autowired
        private ApplicationContext applicationContext;
    
        @PostConstruct
        public void initByInjection() {
            System.out.println("beanFactory == applicationContext " + (beanFactory == applicationContext));
            System.out.println("beanFactory == applicationContext.getBeanFactory() " + (beanFactory == applicationContext.getAutowireCapableBeanFactory()));
            System.out.println("resourceLoader == applicationContext " + (resourceLoader == applicationContext));
            System.out.println("applicationEventPublisher == applicationContext " + (applicationEventPublisher == applicationContext));
        }
    
        @PostConstruct
        public void initByLookup() {
            getBean(BeanFactory.class);
            getBean(ResourceLoader.class);
            getBean(ApplicationEventPublisher.class);
            getBean(ApplicationContext.class);
        }
    
        private <T> T getBean(Class<T> beanType) {
            try {
                return beanFactory.getBean(beanType);
            } catch (NoSuchBeanDefinitionException e) {
                System.err.println("当前类型" + beanType.getName() + "无法在 BeanFactory 中查找!");
            }
            return null;
        }
    
        public static void main(String[] args) {
            // 创建 ApplicationContext 容器
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
    
            // 注册 Configuration Class 配置类
            applicationContext.register(DependencySourceDemo.class);
    
            // 启动应用上下文
            applicationContext.refresh();
    
            // 关闭应用上下文
            applicationContext.close();
        }
    
    }
    
    
    // 运行结果
    beanFactory == applicationContext false
    beanFactory == applicationContext.getBeanFactory() true
    resourceLoader == applicationContext true
    applicationEventPublisher == applicationContext true
    当前类型org.springframework.beans.factory.BeanFactory无法在 BeanFactory 中查找!
    当前类型org.springframework.core.io.ResourceLoader无法在 BeanFactory 中查找!
    当前类型org.springframework.context.ApplicationEventPublisher无法在 BeanFactory 中查找!
    当前类型org.springframework.context.ApplicationContext无法在 BeanFactory 中查找!
    

    总结:

    Spring IOC的三种依赖来源,自定义注册的Spring bean、内建的Spring bean以及内建的可注入的依赖,其中自定义注册的Spring bean基本上是通过xml、注解或者api注册BeanDefination创建的,内建的Spring bean是通过registerSingleton()创建的,内建的可注入的依赖是通过registerResolveDependency()创建的,后续如果我们需要往Spring容器里放入一些非Spring托管的bean但又可以被依赖注入的, 可以通过registerResolveDependency() API实现
    

3. Spring容器管理和游离对象:为什么会有管理对象和游离对象?

  • 依赖对象

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dbcuTmxT-1670835429216)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202160552393.png)]

4. Spring Bean Definition作为依赖来源:Spring Bean的来源

  • 要素

    • 元数据:BeanDefinition

    • 注册:BeanDefinitionRegistry#registerBeanDefinition

    • 类型:延迟和非延迟

    • 顺序:Bean 生命周期顺序按照注册顺序

      BeanDefinitionRegistry它是个注册中心,它里面包含 增/删/查 没有修改, 修改我们可以通过生命周期postProcessMergedBeanDefinition这么一个回调方法来进行操作

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-opRGb1Tf-1670835429217)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202164457864.png)]

      BeanDefinitionRegistry它的一个标准的实现我们只需要看DefaultListableBeanFactory这个类

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I0uDTl4p-1670835429217)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202165209832.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lhuZSrAc-1670835429217)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202170503877.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T8AgYHmw-1670835429218)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202170622294.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nMpbtaLC-1670835429218)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221202175056199.png)]

5. 单例对象作为依赖来源:单体对象与普通Spring Bean存在哪些差异?

  • 要素

    • 来源:外部普通 Java 对象(不一定是 POJO )
    • 注册:SingletonBeanRegistry#registerSingleton
  • 限制

    • 无生命周期管理
    • 无法实现延迟初始化 Bean

    因为它是一个单例对象, 也是来源于外部, 因此它的生命周期不由spring上下文来进行托管, 第二方面它没有办法实现所有对的延迟初始化, 道理非常简单, 由于单一对象没有在 Spring Ioc 容器里面进行托管, 所以它没有办法执行我们的生命周期管理, 同理可得, 它的延迟加载也是没有办法进行处理的, 所以这里是它的一个限制, 但是它可以用于依赖查找, 也可以用于依赖注入

    注册

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zdWCA9Xu-1670835429218)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212143820125.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lyKECEkH-1670835429219)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212143847816.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gPvVEJQQ-1670835429219)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212143922712.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WpQFh35i-1670835429219)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212144949531.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vijr1wM5-1670835429220)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212145005479.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hfc4DCt2-1670835429220)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212145051778.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9S6nTkDH-1670835429220)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212145110175.png)]

    依赖查找

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1R85epU-1670835429221)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212145256899.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aryflvs4-1670835429221)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212145527668.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PWiPSNjt-1670835429221)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212145546396.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MpxE7TTL-1670835429222)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212145642437.png)]

    而不是走的 else BeanDefinition 那条路, BeanDefinition 相对来说是比较复杂的, 因为它查找 BeanDefinition 之后, 它需要把BeanDefinition 变成 Bean 那么就会激活所有 Bean 的生命周期, 那之后就会有个生命周期管理, 而 SingletonBean 它其实比较简单只把对象直接返回就行, 所以相对来说它的方式比较单一一点

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0YtZAg7P-1670835429222)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212145742828.png)]

    总结:

    有人就会问了为什么要采用BeanDefinition的方式在存储元数据,每次在getBean的时候都需要初始化bean,直接采用singletonObjects方式存储不是更简单吗?
    
    因为BeanDefinition对象有完整的生命周期控制,比如初始化等,更便于你业务bean的扩展(就是为了提高框架的扩展点,便于自己的定制化操作)
    

6. 非Spring容器管理对象作为依赖来源:如何理解ResolvableDependency?

  • 要素

    • 注册:ConfigurableListableBeanFactory#registerResolvableDependency
  • 限制

    • 无生命周期管理
    • 无法实现延迟初始化 Bean
    • 无法通过依赖查找
    package org.xiaoge.thinking.in.spring.ioc.dependency.source;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    import javax.annotation.PostConstruct;
    
    /**
     * ResolvableDependency 作为依赖来源
     *
     * @author <a href="mailto:1330137071@qq.com">Zhang Xiao</a>
     * @since
     */
    public class ResolvableDependencysourceDemo {
    
        @Autowired
        private String value;
    
        @PostConstruct
        public void init() {
            System.out.println(value);
        }
    
        public static void main(String[] args) {
            // 创建 ApplicationContext 容器
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
    
            // 注册 Configuration Class 配置类
            applicationContext.register(ResolvableDependencysourceDemo.class);
    
            // 回调, 它是在初始化之前回调
            applicationContext.addBeanFactoryPostProcessor(beanFactory -> {
                // 注册 Resolvable Dependency
                beanFactory.registerResolvableDependency(String.class, "Hello world");
            });
    
            // 启动应用上下文
            applicationContext.refresh();
    
    
            // 关闭应用上下文
            applicationContext.close();
        }
    
    }
    
    
    // 运行结果
    Hello world
    

7. 外部化配置作为依赖来源:@Value是如何将外部化配置注入Spring Bean的?

  • 要素

    • 类型:非常规 Spring 对象依赖来源
  • 限制

    • 无生命周期管理
    • 无法实现延迟初始化 Bean
    • 无法通过依赖查找

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bYNg8ply-1670835429222)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212162252165.png)]

    package org.xiaoge.thinking.in.spring.ioc.dependency.source;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.core.io.Resource;
    
    /**
     * 外部配置作为依赖来源
     *
     * @author <a href="mailto:1330137071@qq.com">Zhang Xiao</a>
     * @since
     */
    @Configuration
    @PropertySource(value = "META-INF/default.properties", encoding = "UTF-8") // 加载配置文件注解
    public class ExternalConfiqurationDependencySourceDemo {
    
        @Value("${user.id:-1}")
        private Long id;
    
        @Value("${usr.name:xiaoge}")
        private String name;
    
        @Value("${user.resource:META-INF/default.properties}")
        private Resource resource;
    
        public static void main(String[] args) {
            // 创建 ApplicationContext 容器
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
    
            // 注册 Configuration Class 配置类
            applicationContext.register(ExternalConfiqurationDependencySourceDemo.class);
    
            // 启动应用上下文
            applicationContext.refresh();
    
            ExternalConfiqurationDependencySourceDemo demo = applicationContext.getBean(ExternalConfiqurationDependencySourceDemo.class);
    
            System.out.println("demo.id = " + demo.id);
            System.out.println("demo.name = " + demo.name);
            System.out.println("demo.resource = " + demo.resource);
    
            // 关闭应用上下文
            applicationContext.close();
        }
    
    }
    
    
    // 运行结果
    demo.id = 1
    demo.name = 啸哥
    demo.resource = class path resource [META-INF/default.properties]
    

    @Value的实现

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JquNxhMX-1670835429223)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212162401208.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9PEpNDJq-1670835429223)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212162615904.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4kfq2vvb-1670835429223)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212162631248.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QhgF2gKy-1670835429223)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212162708313.png)]

C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212163224480.png

从图中可以看出他可以操作@Value和@Qualifier直接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yUqSs15p-1670835429224)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212163055679.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UfFX9EER-1670835429224)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212162805963.png)]

strVal是从resolveEmbeddedValue去出来的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NyydLr1O-1670835429225)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221212163421531.png)]

8. 面试题精选

  • 注入和查找的依赖来源是否相同?
    • 答:否,依赖查找的来源仅限于 Spring BeanDefinition 以及单例 对象,而依赖注入的来源还包括 Resolvable Dependency 以及 @Value 所标注的外部化配置
  • 单例对象能在 IoC 容器启动后注册吗?
    • 答:可以的,单例对象的注册与 BeanDefinition 不同,BeanDefinition 会被 ConfigurableListableBeanFactory#freezeConfiguration() 方法影响,从而冻结注册,单例对象则没有这个限制。
  • Spring 依赖注入的来源有哪些?
    • 答:
      • Spring BeanDefinition
      • 单例对象
      • Resolvable Dependency
      • @Value 外部化配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/84940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xilinx Vivado的RTL分析(RTL analysis)、综合(synthesis)和实现(implementation)的区别?

1、一般流程 Xilinx 的开发工具Vivado其实还是比较好上手的&#xff0c;在左边的设计流程导航已经把FPGA的开发过程按先后顺序给排列出来了&#xff1a; Project Manager&#xff1a;项目管理器&#xff0c;此项是对项目的参数进行设置 IP Integrator&#xff1a;IP集成器&…

广域铭岛参编《数智化供应链参考架构》标准正式发布

近日&#xff0c;广域铭岛参编的《数智化供应链参考架构》标准正式发布。该标准由工业互联网产业联盟&#xff08;以下简称“联盟/AII”&#xff09;发布&#xff0c;是国内首个数智化供应链领域的参考架构标准&#xff0c;明确了新兴的数字化和智能化技术如何在供应链领域应用…

大数据进程管理

进程管理 查看进程 进程查看命令 ps la | head -5&#xff0c;能够观察所有系统的数据 ps axjf | head -20&#xff0c;连同部分程序树状态 ps l仅查看自己的bash相关的进程 ps aux观察系统所有进程 属性含义USER进程使用者PID进程标识符%CPU进程使用掉的CPU 资源百分比%MEM…

一个不错的docker支持音频的rdp桌面

docker pull danielguerra/xfce4-rdp-audio 获取该镜像后&#xff0c;运行 docker run -d --name xfce4_0 --shm-size 1g -p 3389:3389 danielguerra/xfce4-rdp-audio相当于开了3个不同的系统容器&#xff0c;端口分别的13389,23389,33389&#xff0c;这时用远程桌面就可以连…

记录--记一次前端CSS升级

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 目前平台前端使用的是原生CSSBEM命名&#xff0c;在多人协作的模式下&#xff0c;容易出现样式冲突。为了减少这一类的问题&#xff0c;提升研效&#xff0c;我调研了业界上主流的7种CSS解决方案&…

Java基于springboot+vue 的传统乐器培训管理系统 elementUI

此网站系统的开发方式和信息管理方式&#xff0c;借鉴前人设计的信息和研发。以在线乐器培训管理为主&#xff0c;以乐器培训管理为核心功能来进行设计和研发&#xff0c;把网站信息和技术整合&#xff0c;开发出一套网上乐器培训管理系统。主要运用现在社会公司中最新的技术框…

rocketmq源码学习-nameServer

前言 最近看了下rocketmq的源码&#xff0c;计划针对最近的学习&#xff0c;做一个笔记&#xff0c;先从nameServer启动的逻辑开始记录吧 在rocketmq中&#xff0c;有四个关键的组件 nameServerbrokerproducerconsumer 这四个组件之间的关系是这样的 关于nameSrv namese…

[附源码]Python计算机毕业设计钓鱼爱好者交流平台Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

老照片修复清晰?父母以前的老照片还能修复吗?

父母结婚时拍摄的结婚照片&#xff0c;现在大概快四十年了&#xff0c;因为保存不善&#xff0c;导致照片泛黄&#xff0c;严重模糊。因为这是父母年轻的时候唯一保留下来的&#xff0c;对我们来说意义重大&#xff0c;所以想要修复照片可以实现吗&#xff1f; 有些照相馆是提…

论文投稿指南——中国(中文EI)期刊推荐(第6期)

&#x1f680; EI是国际知名三大检索系统之一&#xff0c;在学术界的知名度和认可度仅次于SCI&#xff01;&#x1f384;&#x1f388; 【前言】 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊。其中&#xf…

ADI Blackfin DSP处理器-BF533的开发详解51:Bin_Conver (图像二值变换处理)(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了图像二值变换处理&#xff0c;代码运行时&#xff0c;会通过文件系统打开工程文件根目下" …/ImageView"路径中的…

阿里云DataWorks荣获DAMA中国数据治理优秀产品奖

DAMA&#xff08;国际数据管理协会&#xff09;是一个全球性的专业组织&#xff0c;协会自1980年成立以来&#xff0c;一直致力于数据管理和数字化的研究、实践及相关知识体系的建设&#xff0c;先后发行了《DAMA 数据管理字典》和《DAMA数据管理的知识体系》等&#xff0c;该知…

C/C++程序的断点调试 - Visual Studio Code

本文以Visual Studio Code为例&#xff0c;简述C/C程序断点调试的基本方法和过程。其它的IDE环境&#xff0c;大同小异。 本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载&#xff0c;但需要注明原作者"海洋饼干叔 叔"&#xff1b;本…

视频特效如何制作?快把这些方法收好

小伙伴们平时刷短视频的时候&#xff0c;有没有发现一些短视频的效果很惊艳。这些惊艳的效果&#xff0c;大部分都是在视频中添加的一些动画特效。那你们知道手机视频怎么添加特效吗&#xff1f;为了帮助大家解决这个问题&#xff0c;接下来我就将为大家分享几种添加特效的方法…

架构高可用之限流-抽刀断水水更流

上图中是一个水坝泄洪的图&#xff0c;那么&#xff0c;对于软件系统&#xff0c;如何使用最方便的可编程的方式增加服务限流能力呢&#xff1f; 下面我结合一个常规的springCloud项目实践了一把&#xff0c;希望他山之石可以攻玉。 背景 简单使用jmeter&#xff0c;压20个并…

FL Studio21.0.0完整版最高版本升级功能有哪些?

支持苹果 Silicon 芯片 – 对苹果 Silicon 芯片&#xff08;M1 芯片以及相关 CPU&#xff09;的原生 ARM 代码支持&#xff0c;但请注意&#xff1a; NewTime、NewTone 和一些 DirectWave 采样格式的导入功能尚未完全重构可能会有问题。 FL Studio-win21中文更新下载如下: htt…

新通药物被暂缓审议:科创属性遭质疑,招股书“数据打架”

12月12日&#xff0c;上海证券交易所披露的信息显示&#xff0c;西安新通药物研究股份有限公司&#xff08;下称“新通药物”&#xff09;的首发申请被暂缓审议。据贝多财经了解&#xff0c;新通药物于2021年12月6日在科创板递交招股书&#xff0c;计划募资12.79亿元。 科创板上…

识破贷后资金归集——关联网络

近几年&#xff0c;金融机构为了扩大信贷规模&#xff0c;抢占市场份额&#xff0c;通过贷款将贷款发放给无法直接通过金融机构获得贷款的个人或者企业&#xff0c;但这也给金融机构带来了多重风险。 首先&#xff0c;我们来看下资金归集是什么。所谓资金归集&#xff0c;是银…

GCSE英语语言考试-语言和结构

Language语言 Example of a simile from The Hunger Games, Suzanne Collins 《饥饿游戏》中的比喻例子&#xff0c;苏珊娜-柯林斯的作品 When talking about language in prose fiction, there are a number of things you could look for: 在谈论散文小说的语言时&#xff0c…

如何在XMLMap端口修改字段映射?

在使用知行EDI系统的过程中&#xff0c;我们经常会用到XMLMap端口进行数据转化&#xff0c;XMLMap端口可以通过拖拽方式进行字段取值映射&#xff0c;同时也可以写代码添加字段对应的取值及判断条件。有时在完成映射后&#xff0c;发现源文件/目标文件待映射的字段和段落需要添…