spring aware
用于辅助Bean中所的属性。如BeanNameAware,可以将bean name 赋值给某个对象的属性中。
常用的aware:
- ApplicationContextAware: 获取ApplicationContext实例
- BeanNameAware: 获取bean name。即bean的id
- BeanFactoryAware: 获取BeanFactory实例
- MessageSourceAware: 获取MessageSource
使用ApplicationContextAware的例子:
ApplicationContext可以获取容器中的bean,但是必须注入才能使用,当一些不需要注入的类(如util类)可通过ApplicationContextAware接口中的setApplicationContext将ApplicationContext传递到util类中
package com.example.demo.awaretest;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class ApplicationContextAwareImpl implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextUtil.setApplicationContext(applicationContext);
}
}
package com.example.demo.awaretest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
public class ApplicationContextUtil {
private static ApplicationContext applicationContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static void setApplicationContext(ApplicationContext applicationContext) {
ApplicationContextUtil.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> clazz){
return applicationContext.getBean(clazz);
}
public static Object getBean(String beanName){
return applicationContext.getBean(beanName);
}
}
使用BeanNameAware的例子:
UserAware类实现了BeanNameAware接口,通过setBeanName方法将beanName赋值给了UseAware对象的Name中
package com.example.demo.awaretest;
import org.springframework.beans.factory.BeanNameAware;
//使用了BeanNameAware
public class UseAware implements BeanNameAware {
String name;
@Override
public void setBeanName(String s) {
this.name = s;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "UseAware{" +
"name='" + name + '\'' +
'}';
}
}
NoUserAware未实现BeanNameAware接口
package com.example.demo.awaretest;
//未使用BeanNameAware
public class NoUseAware {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "NoUseAware{" +
"name='" + name + '\'' +
'}';
}
}
将UseAware和NoUseAware封装成bean对象
package com.example.demo.awaretest;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class Comp {
@Bean(name = "UseAware")
public UseAware initUseAware(){
return new UseAware();
}
@Bean(name = "NoUseAware")
public NoUseAware initNoUseAware(){
return new NoUseAware();
}
}
通过spring中的getBean方法获取UseAware对象后,该对象name字段的值为bean name。而NoUseAware对象的name字段的值为null。
@SpringBootApplication
public class Demo2Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = new SpringApplicationBuilder(Demo2Application.class).web(WebApplicationType.NONE).build().run(args);
//输出: 使用BeanNameAware: UseAware{name='UseAware'}
System.out.println("使用BeanNameAware: "+context.getBean(UseAware.class).toString());
//输出: 未使用BeanNameAware: NoUseAware{name='null'}
System.out.println("未使用BeanNameAware: "+context.getBean(NoUseAware.class).toString());
}
}