你不知道的Spring——实用特性(一)

最近学习Spring源码,看到的一些实用的Spring的功能,写下来给自己一个备忘,同时分享给大家
1.proflie属性
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
profile="test">
...
</beans>
集成到Web环境中,在web.xml中加入以下代码:
<context-param>
<param-name>Spring.profiles.actvie</param-name>
<param-value>dev</param-value>
</context-param>
有了这个属性我们就可以同时在配置文件中部署两套配置来适应生产和开发环境,这样就可以方便的进行切换开发、部署环境,常用的就是更换不同的数据库。
if (StringUtils.hasText(profileSpec)) {
Assert.state(this.environment != null, "Environment must be set for evaluating profiles");
String[] specifiedProfiles = StringUtils.tokenizeToStringArray(
profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);//MULTI_VALUE_ATTRIBUTE_DELIMITERS=",;";
if (!this.environment.acceptsProfiles(specifiedProfiles)) {
return;
}
}
因此猜想xml也可以这样写
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
profile="test,;dev">
</beans>
2.SPEL语言的支持
自定义事件和监听器定义
public class TestEvent extends ApplicationEvent{
private String msg;
public TestEvent(Object source) {
super(source);
}
public TestEvent(Object source,String msg){
super(source);
this.msg = msg;
}
public void print(){
System.out.println(msg);
}
}
public class TestListener implements ApplicationListener{
public void onApplicationEvent(ApplicationEvent event) {
if(event instanceof TestEvent){
TestEvent testEvent = (TestEvent)event;
testEvent.print();
}
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beanFactoryTest.xml");
TestEvent event = new TestEvent("hello","msg");
context.publishEvent(event);
}
}
监听器注册
<bean id="testListener" class="TestListener" />
默认使用SimpleApplicationEventMulticaster 进行时间分发执行,可以给它设置Executor taskExecutor提高执行效率
4.LifecycleProcessor
在spring中提供了Lifecycle接口,Lifecycle中包含start/stop方法,实现此接口后Spring会保证在启动的时候调用start方法开发生命周期,并在Spring关闭的时候调用stop方法来结束生命周期,通常来配置后台程序,在启动后一直运行(轮询)。
Srping加载完毕会发出ContextRefreshedEvent事件,进行通知。