内容概要:
- BeanFactory 能做哪些事
- ApplicationContext 有哪些扩展功能
- 事件解耦
什么是BeanFactory
BeanFactory 能干点啥
ApplicationContext 相对于 BeanFactory, 扩展了哪些功能
ApplicationContext 的扩展功能主要体现在它实现的另外4个接口上
MessageSource : 处理国际化资源的能力
messages
开头的 properties 文件中context.getMessage()
方法,获取配置在不同语种下 key 对应的信息ResourcePatternResolver : 使用通配符/路径匹配资源的能力
classpath:
开头的是指 类路径下的资源classpath:
开头是找不到这个资源的classpath*:
开头获取 jar 包中的资源,比如 classpath*:META-INF/spring.factories
classpath:
开头的是指 磁盘路径下的资源context.getResources()
方法,返回对象为 Resource
,该类是Spring中对资源的抽象ApplicationEventPublisher : 发布Spring中的 ApplicationEvent 事件对象
ApplicationEvent
,重写构造方法class UserRegistEvent extends ApplicationEvent {
// source指当前事件的事件源,谁发的这个事件
public UserRegisteredEvent(Object source) {
super(source);
}
}
context.publishEvent()
方法发布事件对象// 将ApplicationContext作为事件源
context.publishEvent(new UserRegisteredEvent(context))
@EventListener
注解标明当前方法为事件监听器@Component
public class Component1 {
@EventListener
public void aaa(UserRegisteredEvent event) {
// 可以从evnet中获取事件源,用于传递监听到事件后处理逻辑时所需要的上下文信息
Object source = event.getSource();
}
}
EnvironmentCapable : 可以读取系统中的配置信息(键值对),比如系统环境变量、application.properties
context.getEnvironment()
方法获取配置信息目标: 学习ApplicationEvent事件对象,实现功能解耦
知识点: ApplicationEventPublisher 是事件发布器, Spring中的任何一个组件都可以作为事件监听器,使用事件发布器发布事件对象,事件监听器监听并处理事件对象
实现功能: 完成一个用户注册成功后发送短信的功能,在用户注册成功后,发布用户已注册事件;发送短信组件监听该事件后,发送短信。实现用户注册与发送短信解耦
步骤:
1)自定义事件对象,事件对象需要集成 ApplicationEvent
,重写构造方法
public class UserRegisterEvent extends ApplicationEvent {
/**
* source指当前事件的事件源,谁发的这个事件
* @param source
*/
public UserRegisterEvent(Object source) {
super(source);
}
}
2)使用 applicationContext.publishEvent()
方法发布事件对象
/**
* 用户注册服务
*/
@Slf4j
@Service
public class UserRegisterService {
@Autowired
private ApplicationContext applicationContext;
public User userRegister(String userName) {
User user = new User();
user.setUid(UUID.randomUUID().toString().replace("-", ""));
user.setUserName(userName);
log.info("user register success, userName:{}", userName);
// 发布用户注册成功事件
applicationContext.publishEvent(new UserRegisterEvent(user));
return user;
}
}
3)监听事件,方法名任意,返回值为void,方法接受一个事件对象的参数,使用@EventListener
注解标明当前方法为事件监听器
/**
* 用户注册监听器
*/
@Slf4j
@Component
public class UserRegisterListener {
@EventListener
public void sendRegisterSuccessMessage(UserRegisterEvent event) {
// 可以从evnet中获取事件源,用于传递监听到事件后处理逻辑时所需要的上下文信息
User user = (User) event.getSource();
log.info("receive user register success event, user:{}", user);
log.info("send user message success!");
}
}