对Spring aware理解

 

 

 aware翻译过来时就是意识到,我对他的理解就是spring的感知器。是不是很诡异这个名字起得^_^

先来看看aware接口的结构

 

 spring提供了许多的aware,Aware.java也只是做一个标志,他并没有定义任何的方法

 

 spring提供的这些aware只展示红框框起来的额三个

一、BeanNameAware

从名字的定义上来看他就是bean对象名字的感知器,他可以获取到bean对象的名字的,目前我只知道在记录日志的时候确实好用,其他的功能有待挖掘。。。。

package com.lhf.aware;

import org.springframework.beans.factory.BeanNameAware;

public class DomeBeanNameAware implements BeanNameAware {
    private String beanName;
    @Override
    public void setBeanName(String name) {
        this.beanName = name;
    }
    public void test(){
        System.out.println("bean的名称:"+beanName);
    }
}

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》


package com.lhf.aware;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.lhf.aware")
public class Config {

    @Bean
    public DomeBeanNameAware domeBeanNameAware(){
        return new DomeBeanNameAware();
    }
}

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》


package com.lhf.aware;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        DomeBeanNameAware bean = context.getBean(DomeBeanNameAware.class);
        bean.test();
        context.close();
    }
}

使用很简单,正如上边代码所示,只需要实现BeanNameAware接口并重写setBeanName方法即可,该方法的入参就是bean对象的名称。

二、ApplicationContextArare

spring容器的感知器,可以获取到spring的容器对象

package com.lhf.aware;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class DomeApplicationContextAware<T> implements ApplicationContextAware, InitializingBean, DisposableBean {

    private ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.context = applicationContext;
        if (context instanceof GenericApplicationContext) {
//            注销spring容器
            ((GenericApplicationContext) applicationContext).registerShutdownHook();
        }
    }


    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("bean对象被创建了");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("bean对象被销毁了");
    }
}

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

package com.lhf.aware;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.lhf.aware")
public class Config {

    
}

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

package com.lhf.aware;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        context.getBean(DomeApplicationContextAware.class);

//        为了证明不是这里关闭的吧下边的一行注释
//        context.close();
    }
}

同样的使用ApplicationContextAware同样是实现该接口,并重写set方法。在这个东东很秀,要知道,非spring的对象是不能直接使用spring的bean对象的,而通过这个就可以用了。

三、BeanFactoryAware

类似的,beanFactory的感知器用法和上边两种一样,都是实现BeanFactoryAware,重写set方法,代码就不贴了。

 

 

总结aware的功能还是很方便的,而且使用起来也很简单粗暴。博客写的不好,大佬勿喷,欢迎吐槽

posted @ 2020-01-14 09:51  葬月!  阅读(527)  评论(0编辑  收藏  举报