我正在学习在我的项目中使用的Spring Framework.我在web.xml文件中找到了 ContextLoaderListener条目.但无法弄清楚它对开发人员有何帮助?
在ContextLoaderListener的官方文档中,它说它是启动WebApplicationContext.关于WebApplicationContext JavaDocs说:
用于为Web应用程序提供配置的界面.
但我无法理解我在ContextLoaderListener中实现了什么,它在内部初始化WebApplicationContext?
根据我的理解,ContextLoaderListener 读取Spring配置文件(使用web.xml中的contextConfigLocation给出的值),解析它并加载该配置文件中定义的单例bean.类似地,当我们想要加载原型bean时,我们将使用相同的webapplication上下文来加载它.因此,我们使用ContextLoaderListener初始化web应用程序,以便我们提前读取/解析/验证配置文件,每当我们想要注入依赖项时,我们都可以毫不拖延地直接执行它.这种理解是否正确?
我想在我的应用程序的开头读取文本数据夹具(CSV文件)并将其放入我的数据库中.
为此,我使用初始化方法(@PostConstruct注释)创建了一个PopulationService.
我也希望它们在一个事务中执行,因此我在同一个方法上添加了@Transactional.
但是,似乎忽略了@Transactional:在我的低级DAO方法中启动/停止事务.
我需要手动管理交易吗?
我想在加载Spring上下文后运行一些工作,但我不知道如何做到这一点.
你知道怎么做吗?
我有几个服务正在侦听Spring事件以更改我的基础数据模型.这些都通过实施来完成ApplicationListener<Foo>.一旦所有Foo侦听器修改了底层数据模型,我的用户界面就需要刷新以反映更改(想想fireTableDataChanged()).
有没有办法确保特定的听众Foo始终是最后的?或者有没有办法在所有其他听众完成后调用函数?我正在使用基于注释的布线和Java配置,如果这很重要的话.
在加载Spring的应用程序上下文后,我需要立即发生一些事情.据我了解,我需要创建一个Lifecycle实现并在上下文中放置一个bean引用.所以我在上下文中有类似的东西:
<bean id="mySpringLifecycle" class="com.my.project.MySpringLifecycle" />
Run Code Online (Sandbox Code Playgroud)
该类看起来像这样:
public class MySpringLifecycle implements Lifecycle {
@Override
public void start() {
System.out.println("The lifecycle has started.");
}
@Override
public void stop() {
return;
}
@Override
public boolean isRunning() {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我没有错误,但MySpringLifecycle从未打印出"生命周期已经开始.",我的应用程序启动就好了.
编辑:
这是固定代码:
public class MySpringLifecycle implements SmartLifecycle {
private volatile boolean isRunning = false;
@Override
public boolean isAutoStartup() {
return true;
}
@Override
public void stop(Runnable r) {
System.out.println("STOPPED RUNNABLE!!!");
isRunning = false;
}
@Override
public void start() {
System.out.println("STARTED!!!");
isRunning …Run Code Online (Sandbox Code Playgroud)