zoukankan      html  css  js  c++  java
  • spring aware 的个人理解

    今天学习到了spring aware ,特地百度了下这方面的知识,现在谈下我的理解。

    Spring的依赖注入的最大亮点就是你所有的BeanSpring容器的存在是没有意识的。即你可以将你的容器替换成别的容器,例如Goggle Guice,这时Bean之间的耦合度很低。

    但是在实际的项目中,我们不可避免的要用到Spring容器本身的功能资源,这时候Bean必须要意识到Spring容器的存在,才能调用Spring所提供的资源,这就是所谓的Spring Aware。其实Spring Aware本来就是Spring设计用来框架内部使用的,若使用了Spring Aware,你的Bean将会和Spring框架耦合。

    -------------------------------------

    ps:这段话很官(抽)方(象),我的理解是,spring aware 的这些接口的存在,让我们可以获取、修改beanName(getBeanName)、事件发布(applicationContext.publishEvent)等。具体场景,我暂时不了解,百度也找不到,估计是会在一些架构方面做文章吧。

    spring aware 以下是几个常用的接口:

    1、ApplicationContextAware   能获取Application Context调用容器的服务

    2、BeanNameAware    提供对BeanName进行操作

    3、ApplicationEventPublisherAware   主要用于事件的发布

    4、BeanClassLoadAware 相关的类加载器

    5、BeanFactoryAware 声明BeanFactory的

    下面直接上代码:

    定义一个Bean AwareSevice ,继承BeanNameAware 和ResourceLoaderAware接口

    package com.abc.service;
    
    
    import org.springframework.beans.factory.BeanNameAware;
    import org.springframework.context.ResourceLoaderAware;
    import org.springframework.core.io.Resource;
    import org.springframework.core.io.ResourceLoader;
    import org.springframework.stereotype.Service;
    
    import java.io.IOException;
    
    @Service
    public class AwareService implements BeanNameAware, ResourceLoaderAware {
    
        private String beanName;
        private ResourceLoader resourceLoader;
    
        @Override
        public void setBeanName(String s) {
            this.beanName=s+"111";
        }
    
        @Override
        public void setResourceLoader(ResourceLoader resourceLoader) {
            this.resourceLoader=resourceLoader;
        }
    
        public void outputResult() {
            System.err.println("Bean名字是:" + beanName);
    
            Resource resource = resourceLoader.getResource("classpath:application.yml");
    
            try {
                System.err.println("resource加载的文件内容是:" + resource.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    可以看到,这里提供了setBeanName()和setResourceLoader(),用于设置BeanName和ResourceLoader。而我们没有继承这个的时候,用getBeanName()和getResourceLoader() 来获取的beanName和resourceLoader。

    设置一个config,用来扫描这个包

    package com.abc.config;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ComponentScan("com.abc.service")
    public class AwareConfig {
    }

    调动service 的结果如下:

    可以看到,这里的AwareService 的BeanName的确被改变了。(ps,就是不知道这样做实际上有什么意义)

  • 相关阅读:
    win8 需要管理员权限才能删除此应用程序
    windows 8 解决端口(COM和LPT)问题:Prolific USBtoSerial Comm Port(COM4)驱动异常的问题
    sqlite 获取数据库中的所有表
    ListView simpleAdapter的基本使用
    一根长度为133米的材料需要截成长度为19米和23米的短料,求两种短料各截多少根时剩余的材料最少?
    打印输出九九乘法表
    写一个函数,输入一个十六进制,输出相应的十进制数。
    求3100的素数!
    从键盘输入若干个同学的成绩,统计并输出最高成绩 最低成绩 平均分,当输入负数时结束输入
    编写两个函数,分别求由键盘输入两个整数的最大公约数和最小公倍数。用主函数调用这两个函数,并输出结果
  • 原文地址:https://www.cnblogs.com/drafire/p/9273940.html
Copyright © 2011-2022 走看看