事件监听
方法一:
//新建事件监听器。 实现ApplicationListener接口
import org.springframework.context.ApplicationListener;
public class MyApplicationListener implements ApplicationListener<MyApplicationEvent> {
@Override
public void onApplicationEvent(MyApplicationEvent event) {
System.out.println("监听事件!!!!!"+event.getClass());
}
}
//新建事件类 继承ApplicationEvent 类
public class MyApplicationEvent extends ApplicationEvent {
/**
* 定义事件
*/
private static final long serialVersionUID = 1L;
public MyApplicationEvent(Object source) {
super(source);
// TODO Auto-generated constructor stub
}
}
//发布事件
@EnableAutoConfiguration
@ComponentScan
public class App {
public static void main(String[] args) {
SpringApplication app=new SpringApplication(App.class);
app.addListeners(new MyApplicationListener());
ConfigurableApplicationContext context = app.run(args);
context.publishEvent(new MyApplicationEvent(new Object()));
context.close();
}
}
方法二,注解ApplicationLister配置到Spring容器中
不需要以下方法
//app.addListeners(new MyApplicationListener());
方法三、Application.properties 中context.listener.classes=全类名
方法四、给监听方法加@EventListener注解,所在的类要加入Spring容器
@Component
public class MyHandle {
@EventListener
public void event(MyApplicationEvent event) {//监听容器给定的事件,引用就好 ContextStopEvent
System.out.println("监听事件!!!!!"+event.getClass());
}
}
ApplicationContextInitializer 接口是在 容器refresh之前的回调
1、写一个类实现此接口
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
public class MyInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("bean count:"+applicationContext.getBeanDefinitionCount());
}
}
2、注册 ApplicationContextInitializer
public class App {
public static void main(String[] args) {
SpringApplication app=new SpringApplication(App.class);
//方法1️⃣app.addInitializers(new MyInitializer());
ConfigurableApplicationContext context=app.run(args);
context.close();
}
}
//方法2️⃣ 在application.properties配置
context.initializer.classes=com.lsq.test.MyInitializer
//方法3️⃣其他项目引用 spring.factories、、spring.factory机制
里面 ApplicationContextInitializer全类名=实现类全类名
ComandLineRunner容器启动之后的最后一步回调
可以拿到ApplicationArguments接口 启动选项中可以添加参数 ,--name=value
如果有多个,可以使用@order(number)或者ordered 接口 来控制顺序,数字越小,顺序越靠前