日常创建对象的方式
UserService userService = new UserService()
这中方式创建对象,是程序运行中,才会创建的对象。在web中,我们需要再web服务器启动完成就创建一系列的对象。这是就可以把创建对象的任务交给spring的IOC框架。
例如创建UserService 对象
public UserService getUserService() {
if (userService == null) {
userService = Application.getBean(UserService.class);
}
return userService;
}
通过实现 ApplicationContextAware, ApplicationListener<ContextRefreshedEvent> , EnvironmentAware交给spring框架
将创建对象的权利
public UserService getUserService() {
if (userService == null) {
userService = Application.getBean(UserService.class);
}
return userService;
}
public class Application implements ApplicationContextAware, ApplicationListener<ContextRefreshedEvent> , EnvironmentAware {
private static final Log logger = LogFactory.getLog(Application.class);
private static ApplicationContext applicationContext; // Spring应用上下文环境
private static String applicatioName;
private static String appName;
private static volatile Map<Class<?>, Object> beanMap = new ConcurrentHashMap<>();
private static boolean isSetApplicationContext = false;
private static Properties defaultProperties = new Properties();
private static Environment environment;
/**
* 获取对象
*
* @param name
* @return Object 一个以所给名字注册的bean的实例
* @throws BeansException
*/
public static Object getBean(String name) throws BeansException {
if (getApplicationContext() != null && getApplicationContext().containsBean(name))
{
return getApplicationContext().getBean(name);
}
return null;
}
}
ApplicationContextAware
通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware
接口中的setApplicationContext
方法。
我们在ApplicationContextAware
的实现类中,就可以通过这个上下文环境对象得到Spring容器中的Bean。
看到—Aware就知道是干什么的了,就是属性注入的,但是这个ApplicationContextAware的不同地方在于,实现了这个接口的bean,当spring容器初始化的时候,会自动的将ApplicationContext注入进来
我们拿到 IOC 容器的方式有3种,使用ApplicationContext接口下的三个实现类:ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、AnnotationConfigApplicationContext, 但是 SpringBoot 中,IOC 配置文件都被简化了,无法通过上述3种方式拿到 IOC 容器,但是有时候需求又必须是用 Spring 容器才能实现,所以:
ApplicationContextAware 就是用来获取框架自动初始化到IOC 容器对象的。