BeanFactory接口典型功能:
getbean
ApplicationContext 接口,是 BeanFactory 的子接口。它扩展了 BeanFactory 接口的功能,如:
-
国际化
-
通配符方式获取一组 Resource 资源
-
整合 Environment 环境(能通过它获取各种来源的配置信息)
-
事件发布与监听,实现组件之间的解耦
1.BeanFactory是ApplicationContext的父接口,是Spring的核心容器,主要的ApplicationContext实现都组合了它的功能。表明只能getBean,实际上控制反转、基本的依赖注入甚至Bean的生命周期都由它的实现类提供。
2. BeanFactory - 表面上只有 getBean
但实际上控制反转、基本的依赖注入、直至 Bean 的生命周期的各种功能, 都由它的实现类提供
如
Field singletonObjects = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
singletonObjects.setAccessible(true);
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
Map<String,Object> map= (Map<String, Object>) singletonObjects.get(beanFactory);
map.entrySet().stream().filter(e->e.getKey().startsWith("component"))
.forEach(e->{
System.out.println(e.getKey()+"="+e.getValue());
});
ApplicationContext 组合并扩展了 BeanFactory 的功能国际化、通配符方式获取一组 Resource 资源、整合 Environment 环境、事件发布与监听
1.国际化System.out.println(context.getMessage("hi", null, Locale.CHINA)); System.out.println(context.getMessage("hi", null, Locale.ENGLISH)); System.out.println(context.getMessage("hi", null, Locale.JAPANESE));
2.通配符方式获取一组 Resource 资源
Resource[] resources = context.getResources("classpath*:META-INF/spring.factories");
for (Resource resource : resources) {
System.out.println(resource);
}
System.out.println(context.getEnvironment().getProperty("java_home"));
System.out.println(context.getEnvironment().getProperty("server.port"));
3.事件发布与监听
context.getBean(Component1.class).register();
package com.itheima.a01copy;
import com.itheima.a01.UserRegisteredEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
@Component
public class Component1 {
private static final Logger log = LoggerFactory.getLogger(Component1.class);
@Autowired
private ApplicationEventPublisher context;
public void register() {
log.debug("用户注册");
context.publishEvent(new UserRegisteredEvent(this));
}
}
@Component
public class Component2 {
private static final Logger log = LoggerFactory.getLogger(Component2.class);
@EventListener
public void aaa(UserRegisteredEvent event) {
log.debug("{}", event);
log.debug("发送短信");
}
}
@Autowired
private ApplicationEventPublisher context;表示事件发布
@EventListener表示监听
建议练习:完成用户注册与发送短信之间的解耦,用事件方式、和 AOP 方式分别实现
@Aspect
@Component
public class UserRegistrationAspect {
private static final Logger log = LoggerFactory.getLogger(UserRegistrationAspect.class);
@After("execution(* com.itheima.a01copy.Component1.register(..))")
public void afterUserRegister() {
// 执行发送短信的逻辑
log.debug("发送短信");
log.debug("发送邮件");
}
}