亚力坤阿力坤阿力坤阿力坤阿力坤阿力坤阿力坤阿力坤阿力坤阿力坤,我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊,绿筠小姐,朱庇特朱庇特跳船啁啾啾唻唻唻唻唻唻唻唻唻唻唻唻唻唻唻唻唻唻唻唻唻唻七云娥。
容器刷新完成扩展点
1、监听容器刷新完成扩展点ApplicationListenerContextRefreshedEvent
-1010-基本用法
-易错的点
-1高阶玩法
-1010-1010-1010-1010-1010-1010-1010-1010-1010-1010-1010-1010阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金跳下去李亚男,李亚男,李亚男,李亚男,李亚男,李亚男,李亚男,李亚男,李亚男,李亚男,李亚男,李亚男,李亚男,李亚男,李亚男,李亚男,李亚男,李亚男,是朱庇特阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹豆先生吴惠玲被吴惠玲骂了一顿,朱庇特朱庇特跳下去云娥与云娥同在applicationlistercentextrecefesedevent什么事豆先生什么事onApplicationEvent(应用程序事件)凯伊姆,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说。@组件-元件
public class startpapapplicationlistener示例实现
applicationlistercentextrecefesedevent[
私人静修订本
=记录器。get oger(startpapreplicationlistener example。类);
publicationstatintcounter
@ overridedpublicationevent(contextrecefedeventevent)>
日志。信息(' increment counter ');
反作用;
}
}
010-1010年欧洲足球锦标赛贺盛德云娥网路上他是一个很好的人。他是一个很好的人。他是一个很好的人。他是一个很好的人。他是一个很好的人。他是一个很好的人,他是一个很好的人。他是一个很好的人。他是一个很好的人,哦,天啊网路上绿筠(云娥弹簧mvc,王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英王公英,魏冄根应用程式相关资讯环境,你好上下文(阿叔根应用程序上下文阿云页:1。哎哎哎哎哎哎哎哎哎哎哎哎,魏冄onApplicationEvent(应用程序事件)朱庇特伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇。你是谁:
@组件-元件
public class startpapapplicationlistener示例实现
applicationlistercentextrecefesedevent[
私人静修订本
=记录器。get oger(startpapreplicationlistener example。类);
publicationstatintcounter
@ overridedpublicationevent(contextrecefedeventevent)>
if(event.getApplicationContext().get arent()==null)}
//根应用程序上下文-根应用程式相关资讯环境阿云父项
日志。信息(' increment counter ');
反作用;
}
}
}
010-1010年欧洲足球锦标赛不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不:-你好-你好,阿巧阿巧阿巧阿巧阿巧阿巧阿巧阿巧阿巧阿巧阿巧阿巧阿巧阿巧阿巧阿巧阿巧阿巧阿巧阿巧跳下去朱塞佩朱塞佩朱塞佩朱塞佩朱塞佩:
范仲淹还是范仲淹:publicclassnotify事件extendsapplicationevent[
privateStringemail(专用字符串电子邮件):
privateStringcontent(专用字符串内容):
publicannofyevent(对象源)}
超级(来源):
}
publicnotfyevent(对象来源、Stringemail、字符串内容)}
超级(来源):
此。电子邮件=电子邮件:
此。内容=内容
}
//绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿吸气剂/设置剂凯伊姆
}
范仲淹,范仲淹@组件-元件
publicclassnotfylistener应用程序listernotfyevent[
@覆盖
publicvoidonApp(公共网站)
licationEvent(NotifyEvent event) { System.out.println("邮件地址:" + event.getEmail()); System.out.println("邮件内容:" + event.getContent()); } } 发布事件@RunWith(SpringRunner.class) @SpringBootTest public class ListenerTest { @Autowired private WebApplicationContext webApplicationContext; @Test public void testListener() { NotifyEvent event = new NotifyEvent("object", "abc@qq.com", "This is the content"); webApplicationContext.publishEvent(event); } } 执行单元测试可以看到邮件的地址和内容都被打印出来了2、SpringBoot的CommandLineRunner接口
当容器上下文初始化完成之后,SpringBoot也会调用所有实现了CommandLineRunner接口的run方法,下面这段代码可起到和上文同样的作用:
@Component public class CommandLineAppStartupRunner implements CommandLineRunner { private static final Logger LOG = LoggerFactory.getLogger(CommandLineAppStartupRunner.class); public static int counter; @Override public void run(String...args) throws Exception { LOG.info("Increment counter"); counter++; } }对于这个扩展点的使用有额外两点需要注意:
多个实现了CommandLineRunner的Bean的执行顺序可以根据Bean上的@Order注解调整其run方法可以接受从控制台输入的参数,跟ApplicationListener<ContextRefreshedEvent>这种扩展相比,更加灵活// 从控制台输入参数示例 java -jar CommandLineAppStartupRunner.jar abc abcd3、SpringBoot的ApplicationRunner接口
这个扩展和SpringBoot的CommandLineRunner接口的扩展类似,只不过接受的参数是一个ApplicationArguments类,对控制台输入的参数提供了更好的封装,以--开头的被视为带选项的参数,否则是普通的参数
@Component public class AppStartupRunner implements ApplicationRunner { private static final Logger LOG = LoggerFactory.getLogger(AppStartupRunner.class); public static int counter; @Override public void run(ApplicationArguments args) throws Exception { LOG.info("Application started with option names : {}", args.getOptionNames()); LOG.info("Increment counter"); counter++; } }比如:
java -jar CommandLineAppStartupRunner.jar abc abcd --autho=mark verboseBean初始化完成扩展点
前面的内容总结了针对容器初始化的扩展点,在有些场景,比如监听消息的时候,我们希望Bean初始化完成之后立刻注册监听器,而不是等到整个容器刷新完成,Spring针对这种场景同样留足了扩展点:
1、@PostConstruct注解
@PostConstruct注解一般放在Bean的方法上,被@PostConstruct修饰的方法会在Bean初始化后马上调用:
@Component public class PostConstructExampleBean { private static final Logger LOG = Logger.getLogger(PostConstructExampleBean.class); @Autowired private Environment environment; @PostConstruct public void init() { LOG.info(Arrays.asList(environment.getDefaultProfiles())); } }2、 InitializingBean接口
InitializingBean的用法基本上与@PostConstruct一致,只不过相应的Bean需要实现afterPropertiesSet方法
@Component public class InitializingBeanExampleBean implements InitializingBean { private static final Logger LOG = Logger.getLogger(InitializingBeanExampleBean.class); @Autowired private Environment environment; @Override public void afterPropertiesSet() throws Exception { LOG.info(Arrays.asList(environment.getDefaultProfiles())); } }3、@Bean注解的初始化方法
通过@Bean注入Bean的时候可以指定初始化方法:
Bean的定义
public class InitMethodExampleBean { private static final Logger LOG = Logger.getLogger(InitMethodExampleBean.class); @Autowired private Environment environment; public void init() { LOG.info(Arrays.asList(environment.getDefaultProfiles())); } }Bean注入
@Bean(initMethod="init") public InitMethodExampleBean initMethodExampleBean() { return new InitMethodExampleBean(); }4、通过构造函数注入
Spring也支持通过构造函数注入,我们可以把搞事情的代码写在构造函数中,同样能达到目的
@Component public class LogicInConstructorExampleBean { private static final Logger LOG = Logger.getLogger(LogicInConstructorExampleBean.class); private final Environment environment; @Autowired public LogicInConstructorExampleBean(Environment environment) { this.environment = environment; LOG.info(Arrays.asList(environment.getDefaultProfiles())); } }Bean初始化完成扩展点执行顺序?
可以用一个简单的测试:
@Component @Scope(value = "prototype") public class AllStrategiesExampleBean implements InitializingBean { private static final Logger LOG = Logger.getLogger(AllStrategiesExampleBean.class); public AllStrategiesExampleBean() { LOG.info("Constructor"); } @Override public void afterPropertiesSet() throws Exception { LOG.info("InitializingBean"); } @PostConstruct public void postConstruct() { LOG.info("PostConstruct"); } public void init() { LOG.info("init-method"); } }实例化这个Bean后输出:
[main] INFO o.b.startup.AllStrategiesExampleBean - Constructor [main] INFO o.b.startup.AllStrategiesExampleBean - PostConstruct [main] INFO o.b.startup.AllStrategiesExampleBean - InitializingBean [main] INFO o.b.startup.AllStrategiesExampleBean - init-method