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