美文网首页Spring
Spring 中 Aware 结尾接口

Spring 中 Aware 结尾接口

作者: 当当一丢丢 | 来源:发表于2018-01-14 22:26 被阅读79次

以 Aware 为结尾的接口介绍

  • 举例:BeanFactoryAware、BeanNameAware、ApplicationContextAware、ResourceLoaderAware、ServletContextAware
  • 功能
    • 实现这些接口的 bean 在被实例化后,可以得到一些相对应的资源
    • 如,实现 BeanFactoryAware 的 bean 在被实例化后,Spring容器将会为其注入 BeanFactory 的实例,而实现 ApplicationContextAware 的bean,在bean 被实例化后,将会被注入ApplicationContext的实例
    • 这里的bean 指
      • 实现类需要以bean的形式出现在上下文中,通常以 @Configuration,@Controller,@Service等来修饰,本质上这些注解都是 @Component
      • 当被这些注解修饰时,Spring 启动过程会在上下文生成该类的bean,同时为其set 相应资源,这涉及到 @ComponentScan 的作用
      • 若未加这些注释,Spring 上下文 不能掌控该类的实例化,只能通过手动 new 来实例化,但此刻资源不能自动注入

实验环境

  • SpringBoot

案例 1

//@Configuration
@RestController
public class MyApp implements ApplicationContextAware {
    
    private ApplicationContext applicationContext;
    //static 变量,用于方法为 static 方法情况下,如工具类
    //private static ApplicationContext applicationContext;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext; //执行注入资源的动作
        System.out.println("in aware");
    }

    public void test() {
        //验证注入资源不为空
        Objects.nonNull(applicationContext);
        String applicationName = applicationContext.getApplicationName(); 
        System.out.println("applicationName: " + applicationName);
    }
}
  • 注入相应资源的方式

    • 这些 Aware 的接口,都带有一个 SetResourceName(ResourcName resourceName) 的 方法
    • 实现类中添加 该ResourceName 的field变量,
    • 然后重写 Aware 接口的 setter 方法 resourceField = resourceName
    • 当需要用到静态方法中时,如工具类时,可以设为 static field
  • 获取 Spring 内置对象的其他方法

    • @Autowired,既然Spring上下文存在资源对象,为何不直接 autowire 呢

案例 2

@Configuration
public class MyApp2 {

    //直接注入
    @Autowired
    private ApplicationContext applicationContext;

    public void test() {
        System.out.println(applicationContext.getClass().getName());
    }

}

main 方法

@SpringBootApplication
public class SpringlearnApplication {

    public static void main(String[] args) {
        
        ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringlearnApplication.class, args);
        
        //获取实例 bean 
        //MyApp app = (MyApp)applicationContext.getBean("myApp");
        MyApp2 app = (MyApp2)applicationContext.getBean("myApp2");

        //MyApp app = new MyApp();
        
        app.test();
    }
}
参考

相关文章

网友评论

    本文标题:Spring 中 Aware 结尾接口

    本文链接:https://www.haomeiwen.com/subject/jxbloxtx.html