在 spring-MVC 应用程序开始时运行一个类



是否可以在春季 MVC 开始申请时运行一个类 我想初始化该类中的线程??

还是有什么办法..?

public class MyServletContextListener implements Runnable {

public void run() {
while (true) {
try {
System.out.println("Inside run()");
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}

}
}

添加应用程序侦听器接口后我得到的输出

NFO: HHH000206: hibernate.properties not found
Jul 24, 2017 8:42:33 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
Jul 24, 2017 8:42:35 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
Jul 24, 2017 8:42:36 PM org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
Thread Started
getApplicationName() : /Hibernate_webservice
getId() : org.springframework.web.context.WebApplicationContext:/Hibernate_webservice
getParent() : null
getDisplayName() : Root WebApplicationContext

Jul 24, 2017 8:42:38 PM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization completed in 8880 ms
Jul 24, 2017 8:42:38 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring FrameworkServlet 'appServlet'
Jul 24, 2017 8:42:38 PM org.springframework.web.servlet.DispatcherServlet initServletBean
INFO: FrameworkServlet 'appServlet': initialization started
Jul 24, 2017 8:42:38 PM org.springframework.web.context.support.XmlWebApplicationContext prepareRefresh
INFO: Refreshing WebApplicationContext for namespace 'appServlet-servlet': startup date [Mon Jul 24 20:42:38 IST 2017]; parent: Root WebApplicationContext
Jul 24, 2017 8:42:38 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/spring-config.xml]
Jul 24, 2017 8:42:38 PM org.springframework.context.support.PropertySourcesPlaceholderConfigurer loadProperties
INFO: Loading properties file from class path resource [application.properties]
Jul 24, 2017 8:42:38 PM org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init>
INFO: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
Jul 24, 2017 8:42:38 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod
INFO: Mapped "{[/form],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView sample.test.TestController.method()
Jul 24, 2017 8:42:39 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
Jul 24, 2017 8:42:39 PM org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
Thread Started
getApplicationName() : /Hibernate_webservice
getId() : org.springframework.web.context.WebApplicationContext:/Hibernate_webservice/appServlet
getParent() : Root WebApplicationContext: startup date [Mon Jul 24 20:42:30 IST 2017]; root of context hierarchy
getDisplayName() : WebApplicationContext for namespace 'appServlet-servlet'

Thread Started
getApplicationName() : /Hibernate_webservice
getId() : org.springframework.web.context.WebApplicationContext:/Hibernate_webservice/appServlet
getParent() : Root WebApplicationContext: startup date [Mon Jul 24 20:42:30 IST 2017]; root of context hierarchy
getDisplayName() : WebApplicationContext for namespace 'appServlet-servlet'

Jul 24, 2017 8:42:39 PM org.springframework.web.servlet.DispatcherServlet initServletBean
INFO: FrameworkServlet 'appServlet': initialization completed in 1365 ms
Jul 24, 2017 8:42:40 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8082"]
Jul 24, 2017 8:42:40 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-nio-8011"]
Jul 24, 2017 8:42:40 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 19807 ms

Spring 提供了ApplicationListener<ContextRefreshedEvent>接口及其onApplicationEvent(ContextRefreshedEvent event)钩子。

例如:

@Component
public class MyServiceCreationListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// do something on container startup
}
}

无论你用onApplicationEvent方法编写什么,都将执行一次,并且只在创建 Spring 上下文时执行一次。

如果您发现此方法被多次调用,那么您一定有多个ApplicationContext在起作用。如果您检查event.getApplicationContext()您可能会看到它们中的每一个都有不同的 id 和 displayName,并且您可能能够找出它们的起源。如果你是一个Spring MVC应用程序,那么你可能同时有一个ContextLoaderListenerDispatcherServlet,两者都创建自己的ApplicationContext每个都会触发一个ContextRefreshedEvent

如果要确定哪个是父上下文,可以尝试event.getApplicationContext().getParent() != null或者可以在 ApplicationListener 中切换类布尔值,例如alreadyInitialised.

还有Spring 4的SmartInitializingSingleton,它可能允许你在不同的级别上连接到上下文创建。

您可以添加应用程序侦听器(类实现上下文侦听器接口(以轻松创建线程 如果要创建时间表,则可以使用石英或弹簧计时器

从 Spring 4.2 开始,您可以简单地使用@EventListener注释,侦听ContextRefreshedEvent

@Component
public class StartupManager {
@EventListener(ContextRefreshedEvent.class)
public void doStartupStuff() {
// ... up, up and away
}
}

通过扩展 Thread 创建一个简单的 Java 线程,并通过 Spring 的容器通过@Component.Bean 作用域必须是"原型",以便每个请求将返回一个新实例,以运行每个单独的线程。

PrintThread.java:
package com.mkyong.thread;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope("prototype")
public class PrintThread extends Thread{
@Override
public void run() {
System.out.println(getName() + " is running");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + " is running");
}
}
AppConfig.java:
package com.mkyong.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages="com.mkyong.thread")
public class AppConfig{
}
App.java:
package com.mkyong;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.mkyong.config.AppConfig;
import com.mkyong.thread.PrintThread;
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
PrintThread printThread1 = (PrintThread) ctx.getBean("printThread");
printThread1.setName("Thread 1");
PrintThread printThread2 = (PrintThread) ctx.getBean("printThread");
printThread2.setName("Thread 2");
PrintThread printThread3 = (PrintThread) ctx.getBean("printThread");
printThread3.setName("Thread 3");
PrintThread printThread4 = (PrintThread) ctx.getBean("printThread");
printThread4.setName("Thread 4");
PrintThread printThread5 = (PrintThread) ctx.getBean("printThread");
printThread5.setName("Thread 5");
printThread1.start();
printThread2.start();
printThread3.start();
printThread4.start();
printThread5.start();
}
}

输出 – 每次顺序都会有所不同,这是线程:)

Thread 3 is running
Thread 2 is running
Thread 1 is running
Thread 5 is running
Thread 4 is running
Thread 2 is running
Thread 4 is running
Thread 5 is running
Thread 3 is running
Thread 1 is running

希望这对:)有所帮助

相关内容

最新更新