Spring 弹簧&x2B;Vaadin集成设计模式

Spring 弹簧&x2B;Vaadin集成设计模式,spring,integration,vaadin,Spring,Integration,Vaadin,将spring与vaadin/gwt集成时使用了哪些设计模式?我们在应用程序中使用spring和hibernate,每个dao都是Springbean。问题是在瓦丁方面使用它们的最佳方式是什么 到目前为止,我们发现的选项有: 制作所有vaadin控件SpringBean(有时可能很难…,使用原型范围etcc) 使用编译时编织-但是,每次更改后运行maven install会非常烦人,因为编译需要几分钟的时间 加载时间编织似乎与atomikos冲突 创建一些bean管理器,它自动连接了所有需要的

将spring与vaadin/gwt集成时使用了哪些设计模式?我们在应用程序中使用spring和hibernate,每个dao都是Springbean。问题是在瓦丁方面使用它们的最佳方式是什么

到目前为止,我们发现的选项有:

  • 制作所有vaadin控件SpringBean(有时可能很难…,使用原型范围etcc)
  • 使用编译时编织-但是,每次更改后运行maven install会非常烦人,因为编译需要几分钟的时间
  • 加载时间编织似乎与atomikos冲突
  • 创建一些bean管理器,它自动连接了所有需要的DAO,并像在单例中一样返回其实例

在使用了Vaadin和Spring之后,我们决定只在DAO类中使用Springbean,在DAO类中,PersistenceContext注入非常非常方便。所有其他类,包括但不限于Vaadin控件,都是“普通”类,没有Spring控件

在做出这个决定之后,实际的问题变成了“如何在一个非Spring相关的代码中获得支持Spring的DAO?”我们选择了一个快速而肮脏的解决方案,该解决方案“只工作”而麻烦最少

0)向web.xml添加了两个Spring侦听器和一个筛选器:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<filter>
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
    <servlet-name>BlahBlah Application</servlet-name>
</filter-mapping>
2) 通常通过@service原型注释来声明Spring服务类

3) Vaadin应用程序servlet已启用启动时加载。实际的init()方法执行以下操作:

@Override
public void init( ServletConfig config ) throws ServletException {
    Logger.getLogger( InitServlet.class ).info( "init()..." );

    super.init( config );

    WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext( config.getServletContext() );

    DAO.initialize( wac );
}
4) 应用程序代码必须调用DAO.getThisOrThatService()并正常使用它。

试试我的Vaadin插件,它有一些用于集成Vaadin和Spring的有用类


有一个例子说明了它是如何工作的。

将spring与vaadin/gwt集成时使用了哪些设计模式

与上述内容略有不同。它适合我,非常简单,所以我把它贴在这里

我在web.xml中添加了以下内容,并使用了对依赖项的spring上下文的精确类路径引用(更改路径以满足您的需要):

现在创建DAO类(如前一篇文章中所建议的):

最后,确保初始化您现在将在各种视图类中使用的DAO。此初始化将在扩展应用程序的任何类中进行,如下所示:

import com.vaadin.Application;
import com.vaadin.ui.Window;

/**
 * The Application's "main" class
 * 
 * Vaadin framework associates requests with sessions so that 
 * an application class instance is really a session object.
 */
@SuppressWarnings("serial")
public class VoucherTool extends Application
{
  private Window mainWindow;

  @Override
  public void init() {
    mainWindow = new Window("Application");
    setMainWindow(mainWindow);

    // Needed because composites are full size
    mainWindow.getContent().setSizeFull();

    LoginView myComposite = new LoginView();
    mainWindow.addComponent(myComposite);
    setTheme("applicationtheme");

DAO.initialize(this);
 }
}

我建议使用瓦丁机制。 这样,UI中的自动连接是完全透明的


您可以看看在github上使用此解决方案的一个非常简单的示例:

现在事实上的方法是使用官方的集成库。这使得UI类成为Spring管理的bean,并提供了方便的与Vaadin相关的作用域。然后,您可以根据自己的需求决定希望在UI代码中生成多少个Springbean助手类。至少考虑制作所有视图,例如Spring管理。< /P> io服务包含一个选项,可以添加相关的Vaadin spring依赖项,然后只需创建UI类并使用@SpringUI注释对其进行注释。不需要单独创建VaadinServlet

<!-- Spring context loader -->
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>      
</listener>
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>classpath:com/company/appserv/spring/spring-context.xml</param-value>
 </context-param>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>${org.springframework.version}</version>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
  <version>2.5</version>
</dependency>
import com.vaadin.Application;
import com.vaadin.terminal.gwt.server.WebApplicationContext;
import javax.servlet.ServletContext;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SpringContextHelper {

private ApplicationContext context;

private static Logger logger = LoggerFactory.getLogger(SpringContextHelper.class);

public SpringContextHelper(Application application) {
    ServletContext servletContext = ((WebApplicationContext) application.getContext()).getHttpSession().getServletContext();
    context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
    logger.debug("Number of beans: {}",context.getBeanDefinitionCount());
}

public Object getBean(final String beanRef) {
    return context.getBean(beanRef);
}    
}
import com.company.appserv.dbo.DatabaseHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vaadin.Application;

public class DAO {

private static DatabaseHelper databaseHelper;

private static Logger logger = LoggerFactory.getLogger(DAO.class);

public static final void initialize(Application application) {
    logger.debug("DAO initializing...");
    if (databaseHelper == null) {
        logger.debug("Creating databaseHelper...");
        SpringContextHelper helper = new SpringContextHelper(application);
        databaseHelper = (DatabaseHelper)helper.getBean("databaseHelper");
    }
}

public static DatabaseHelper getDatabaseHelper() {
    return databaseHelper;
}
}
import com.vaadin.Application;
import com.vaadin.ui.Window;

/**
 * The Application's "main" class
 * 
 * Vaadin framework associates requests with sessions so that 
 * an application class instance is really a session object.
 */
@SuppressWarnings("serial")
public class VoucherTool extends Application
{
  private Window mainWindow;

  @Override
  public void init() {
    mainWindow = new Window("Application");
    setMainWindow(mainWindow);

    // Needed because composites are full size
    mainWindow.getContent().setSizeFull();

    LoginView myComposite = new LoginView();
    mainWindow.addComponent(myComposite);
    setTheme("applicationtheme");

DAO.initialize(this);
 }
}