以 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();
}
}
网友评论