spring aware 的个人理解

本文探讨了SpringAware接口如何帮助Bean在Spring容器中保持松耦合,并介绍了常用的接口如ApplicationContextAware、BeanNameAware等。通过实例说明了如何在Bean中设置和获取BeanName及资源,展示了SpringAware在实际项目中的应用场景和意义。
摘要由CSDN通过智能技术生成

今天学习到了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,就是不知道这样做实际上有什么意义)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wx: fulltilt8

文章原创,对你有用的话请打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值