Spring源码深度解析(三)——使用Aware接口编写SpringUtils

在了解过一段时间源码后,深深的被折服,就那简简单单的ApplicationContext初始化那几条代码都够我研究很长一段时间了。Spring强大的地方很多,它留给了我们很多能够扩展的地方比如BeanFactoryPostProcessor,BeanPostProcessor等等,今天来说一个也是很牛的接口就是Aware接口。
由于一次我的特殊要求,Spring提供的功能并不能满足我的需求,那我就想起了这个接口了。

public interface Aware {

}

没有什么代码,很明显就是一个标签类(顶级父类,标志着这一项功能),它的子类们都可厉害了,如BeanFactoryAware,ApplicationContextAware,MessageSourceAware,今天用到的主角就是ApplicationContextAware

加入有一个需求:在Spring环境外部进行数据库的访问和修改,你该怎么做?

那么我们就可以利用这个接口制作一个SpringUtils工具类,供外部去访问Spring的环境

package com.wrial.checkdev.utils;
/*
 * @Author  Wrial
 * @Date Created in 0:40 2019/8/27
 * @Description
 */

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * Created by
 */
@Component
public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if(SpringUtil.applicationContext == null) {
            SpringUtil.applicationContext = applicationContext;
        }
    }

    //获取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    //通过name获取 Bean.
    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }

    //通过class获取Bean.
    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }

    //通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name,Class<T> clazz){
        return getApplicationContext().getBean(name, clazz);
    }
}

当然,如果就仅仅上面这一种需求的话,那使用BeanFactoryAware也是足够,动态从工厂中获取Bean,调用BeanFactory的getBean。

读Spring源码往往不是表面能力的提升,而是思考方式的提升

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值