Aware Mode

Aware接口

Spring中提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后,可以获取相应资源
通过Aware接口,可以对Spring相应资源进行操作(使用需慎重)
为对Spring进行简单的扩展提供了方便的入口

ApplicationContextAware

实现了ApplicationContextAware接口的类将会获得ApplicationContext实例的引用

BeanNameAware

实现BeanNameAware接口的类将会获得该类对象的bean定义的name值(id)

主要Aware子接口

Aware相关示例

ApplicationContextAware

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


public class MoocApplicationContext implements ApplicationContextAware  {
    //定义成员变量
    private ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        //获取spring上下文进行相关操作
        this.applicationContext = applicationContext;
        System.out.println("MoocApplicationContext : " + applicationContext.getBean("moocApplicationContext").hashCode());
    }
    
}

@RunWith(BlockJUnit4ClassRunner.class)
public class TestAware extends UnitTestBase {
    
    public TestAware() {
        super("classpath:spring-aware.xml");
    }
    
    @Test
    public void testMoocApplicationContext() {
        System.out.println("testMoocApplicationContext : " + super.getBean("moocApplicationContext").hashCode());
        //执行结果为: MoocApplicationContext : 1795799895
        //           testMoocApplicationContext : 1795799895
    }
    
}

<bean id="moocApplicationContext" class="com.rxy.aware.MoocApplicationContext" ></bean>

BeanNameAware

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class MoocBeanName implements BeanNameAware, ApplicationContextAware {

    private String beanName;
    
    @Override
    public void setBeanName(String name) {
        this.beanName = name;
        System.out.println("MoocBeanName : " + name);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        System.out.println("setApplicationContext : " + applicationContext.getBean(this.beanName).hashCode());
    }

}

@RunWith(BlockJUnit4ClassRunner.class)
public class TestAware extends UnitTestBase {
    
    public TestAware() {
        super("classpath:spring-aware.xml");
    }   
    
    @Test
    public void textMoocBeanName() {
        System.out.println("textMoocBeanName : " + super.getBean("moocBeanName").hashCode());
        //MoocBeanName : moocBeanName
        //setApplicationContext : 1795799895
       //textMoocBeanName : 1795799895
    }
    
}

<bean id="moocBeanName" class="com.imooc.aware.MoocBeanName" ></bean>

注意:不同Aware接口执行顺序不同,如ApplicationContextAware的方法在BeanNameAware的方法执行之后,所以setBeanName中无法获取上下文对象

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容