Spring学习(三十)-@EventListener监听事件

@EventListener:监听事件

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EventListener {

	/**
	 * Alias for {@link #classes}.
	 */
	@AliasFor("classes")
	Class[] value() default {};

	/**
	 *监听那个事件 如ApplicationEvent.class
	 */
	@AliasFor("value")
	Class[] classes() default {};

	/**
	 * Spring Expression Language (SpEL) attribute used for making the
	 *根据条件监听事件
	 */
	String condition() default "";

}

原理:使用EventListenerMethodProcessor处理器来解析方法上的@EventListener;

Spring学习(三十)-@EventListener监听事件_第1张图片

public interface SmartInitializingSingleton {

	//单实例所有bean全部创建完成触发类似与容器刷新完成
	void afterSingletonsInstantiated();

}

调用位置:

@Override
public void refresh() throws BeansException, IllegalStateException {
	synchronized (this.startupShutdownMonitor) {
        。。。。。。。。。。。。。。
	//初始化单实例bean
	finishBeanFactoryInitialization(beanFactory);

	// Last step: publish corresponding event.
	finishRefresh();

		。。。。。。。。。。
	}
}

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
	。。。。。。。。。。。。。。
	//初始化单实例bean
	beanFactory.preInstantiateSingletons();
}


@Override
public void preInstantiateSingletons() throws BeansException {
	。。。。。。。。。。。。。。。。。。
	//单实例bean初始化
	getBean(beanName);
	。。。。。。。。。。。。

	// 获取所有创建好的单实例bean
	for (String beanName : beanNames) {
		Object singletonInstance = getSingleton(beanName);
		//判断是否是SmartInitializingSingleton类型的;
		if (singletonInstance instanceof SmartInitializingSingleton) {
			final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
			if (System.getSecurityManager() != null) {
				//权限验证
				AccessController.doPrivileged(new PrivilegedAction() {
					@Override
					public Object run() {
						smartSingleton.afterSingletonsInstantiated();
						return null;
					}
				}, getAccessControlContext());
			}
			else {
				//回调该方法
				smartSingleton.afterSingletonsInstantiated();
			}
		}
	}
} 
  

流程:

1)、ioc容器创建对象并refresh();
2)、finishBeanFactoryInitialization(beanFactory);初始化剩下的单实例bean;
       1)、先创建所有的单实例bean;getBean();
       2)、获取所有创建好的单实例bean,判断是否是SmartInitializingSingleton类型的;
           如果是就调用afterSingletonsInstantiated();

用法测试:

业务层:

@Service
public class UserService {

	@EventListener(classes={ApplicationEvent.class})
	public void listen(ApplicationEvent event){
		System.out.println("UserService。。监听到的事件:"+event);
	}

}

 配置类:

@ComponentScan("com.spring.ext")
@Configuration
public class ExtConfig {

	

}

测试类:

@Test
	public void test01(){
		AnnotationConfigApplicationContext applicationContext  = new AnnotationConfigApplicationContext(ExtConfig.class);
		applicationContext.close();
	}

结果:

你可能感兴趣的:(spring)