java回调spring接口_(011)Spring Boot之回调接口ApplicationContextInitializer、CommandLineRunner、ApplicationRunne...

ApplicationContextInitializer接口在spring容器执行refreshed之前回调,实现方式有3种

方式一:调用SpringApplication的addInitializers方法注册

pom.xml

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

4.0.0

com.edu.spring

springboot

1.0.0

jar

springboot

http://www.example.com

org.springframework.boot

spring-boot-dependencies

2.1.6.RELEASE

import

pom

UTF-8

1.8

1.8

org.springframework.boot

spring-boot-starter

View Code

MyApplicationContextInitializer.java,实现ApplicationContextInitializer接口

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.edu.spring.springboot;importorg.springframework.context.ApplicationContextInitializer;importorg.springframework.context.ConfigurableApplicationContext;public class MyApplicationContextInitializer implementsApplicationContextInitializer{

@Overridepublic voidinitialize(ConfigurableApplicationContext applicationContext) {//TODO Auto-generated method stub

System.out.println("当前容器bean数量:"+applicationContext.getBeanDefinitionCount());

}

}

View Code

App.java,调用SpringApplication的addInitializers方法(可以有多个)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.edu.spring.springboot;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;

@SpringBootApplicationpublic classApp

{public static voidmain( String[] args )

{

SpringApplication app=new SpringApplication(App.class);

app.addInitializers(newMyApplicationContextInitializer());

ConfigurableApplicationContext context=app.run(args);

context.close();

}

}

View Code

运行结果如下:

3a287d72e1f49e00974150183776dd08.png

方式二:application.properties中配置context.initializer.classes属性(可以配置多个)

application.properties

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

context.initializer.classes=com.edu.spring.springboot.MyApplicationContextInitializer,com.edu.spring.springboot.MyApplicationContextInitializer2

View Code

MyApplicationContextInitializer2.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.edu.spring.springboot;importorg.springframework.context.ApplicationContextInitializer;importorg.springframework.context.ConfigurableApplicationContext;public class MyApplicationContextInitializer2 implementsApplicationContextInitializer{

@Overridepublic voidinitialize(ConfigurableApplicationContext applicationContext) {//TODO Auto-generated method stub

System.out.println("app name:"+applicationContext.getApplicationName());

}

}

View Code

App.java,去掉addInitializers方法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.edu.spring.springboot;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;

@SpringBootApplicationpublic classApp

{public static voidmain( String[] args )

{

SpringApplication app=new SpringApplication(App.class);

ConfigurableApplicationContext context=app.run(args);

context.close();

}

}

View Code

运行结果如下:

7cf30770f0f5cc0e33b2b9c947e122c3.png

方式三:使用spring.factories机制

resources/META-INF/spring.factories

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

org.springframework.context.ApplicationContextInitializer=com.edu.spring.springboot.EchoApplicationContextInitializer

View Code

EchoApplicationContextInitializer.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.edu.spring.springboot;importorg.springframework.context.ApplicationContextInitializer;importorg.springframework.context.ConfigurableApplicationContext;public class EchoApplicationContextInitializer implementsApplicationContextInitializer{public voidinitialize(ConfigurableApplicationContext applicationContext) {

System.out.println("=============EchoApplicationContextInitializer=================");

}

}

View Code

App.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.edu.spring.springboot;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;

@SpringBootApplicationpublic classApp

{public static voidmain( String[] args )

{

SpringApplication app=new SpringApplication(App.class);

ConfigurableApplicationContext context=app.run(args);

context.close();

}

}

View Code

运行结果如下:

49f4ea060673eaaef4c37f2e241291b4.png

由于spring.factories机制会扫描所有工程里面的/META-INF/spring.factories文件,所以另建一个工程也可以运行,如下:

新建core-bean

pom.xml

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

4.0.0

com.edu.core

core-bean

1.0.0

jar

springboot

http://www.example.com

UTF-8

1.8

1.8

org.springframework

spring-context

4.3.2.RELEASE

View Code

EchoApplicationContextInitializer.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.edu.initializer;importorg.springframework.context.ApplicationContextInitializer;importorg.springframework.context.ConfigurableApplicationContext;public class EchoApplicationContextInitializer implementsApplicationContextInitializer{public voidinitialize(ConfigurableApplicationContext applicationContext) {

System.out.println("=============core-bean:EchoApplicationContextInitializer=================");

}

}

View Code

resources/META-INF/spring.factories

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

org.springframework.context.ApplicationContextInitializer=com.edu.initializer.EchoApplicationContextInitializer

View Code

原工程的pom.xml文件引入core-bean坐标

pom.xml

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

4.0.0

com.edu.spring

springboot

1.0.0

jar

springboot

http://www.example.com

org.springframework.boot

spring-boot-dependencies

2.1.6.RELEASE

import

pom

UTF-8

1.8

1.8

org.springframework.boot

spring-boot-starter

com.edu.core

core-bean

1.0.0

View Code

运行原工程App.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.edu.spring.springboot;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;

@SpringBootApplicationpublic classApp

{public static voidmain( String[] args )

{

SpringApplication app=new SpringApplication(App.class);

ConfigurableApplicationContext context=app.run(args);

context.close();

}

}

View Code

运行结果如下:

f5273cb08fba8ec6aa220957d89072e2.png

CommandLineRunner、ApplicationRunner是spring容器启动成功后最后的回调,@Order控制顺序,数字越小越先执行,请看示例:

ServerSuccessReport.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.edu.spring.springboot;importjava.util.Arrays;importorg.springframework.boot.CommandLineRunner;importorg.springframework.core.annotation.Order;importorg.springframework.stereotype.Component;

@Order(1)

@Componentpublic class ServerSuccessReport implementsCommandLineRunner {

@Overridepublic void run(String... args) throwsException {//TODO Auto-generated method stub

System.out.println("==========ServerSuccessReport1============"+Arrays.asList(args));

}

}

View Code

ServerSuccessReport2.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.edu.spring.springboot;importjava.util.Arrays;importorg.springframework.boot.CommandLineRunner;importorg.springframework.core.annotation.Order;importorg.springframework.stereotype.Component;

@Order(3)

@Componentpublic class ServerSuccessReport2 implementsCommandLineRunner {

@Overridepublic void run(String... args) throwsException {//TODO Auto-generated method stub

System.out.println("==========ServerSuccessReport2============"+Arrays.asList(args));

}

}

View Code

StartedApplicationRunner.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.edu.spring.springboot;importjava.util.Arrays;importorg.springframework.boot.ApplicationArguments;importorg.springframework.boot.ApplicationRunner;importorg.springframework.core.annotation.Order;importorg.springframework.stereotype.Component;

@Order(2)

@Componentpublic class StartedApplicationRunner implementsApplicationRunner {public void run(ApplicationArguments args) throwsException {

System.out.println("应用已经启动,参数为:"+Arrays.asList(args.getSourceArgs()));

}

}

View Code

App.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.edu.spring.springboot;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;

@SpringBootApplicationpublic classApp

{public static voidmain( String[] args )

{

SpringApplication app=new SpringApplication(App.class);

ConfigurableApplicationContext context= app.run("aa","bb ");

context.close();

}

}

View Code

运行结果如下:

f94fc8fc4dc581d80ff4df1e37b5711e.png

CommandLineRunner与ApplicationRunner的区别是CommandLineRunner参数是原始的,ApplicationRunner参数是对原始参数的封装。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值