Aware Mode

2019-01-19  本文已影响45人  若兮缘

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中无法获取上下文对象

上一篇 下一篇

猜你喜欢

热点阅读