多模块maven spring注入豆类

时间:2013-07-11 17:37:32

标签: spring maven dependency-injection module vaadin

我有两个maven模块:

  1. 逻辑(带有bean等的Spring项目) - 打包到.jar

  2. Web(具有弹性的Vaadin项目) - 数据包到.war

  3. 在Web .pom中我依赖于逻辑。在java代码中,autowired等是可以的。 我想在Web项目中使用来自逻辑的bean。

    我的web.xml(Web项目):路径:../ src / main / webapp / WEB-INF

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext.xml
    
        </param-value>
    </context-param>
    

    我的应用程序上下文:(路径:../ src / main / webapp / WEB-INF)

    <beans ...
    <context:annotation-config />
    
    <import resource="logic.xml"/>
    
    <context:component-scan base-package="b2b"
        annotation-config="true" />
    

    logic.xml包含逻辑模块中bean的配置。基础包名称为b2b。

    在UI类我有:

    @Autowired
    private CompanyService companyService;
    

    我尝试以多种方式获取bean,但启动Web后,companyService始终为null。

    我应该添加什么来从Web模块中看到逻辑模块中的bean?

    UI类:

    @Theme("mytheme")
    @SuppressWarnings("serial")
    @Controller
    public class MyVaadinUI extends UI
    { }
    

    我也在这里提到vaadin V7:enter link description here

    但没有帮助。

    这是我的UI类:

    enter code here
    @Theme("mytheme")
    @SuppressWarnings("serial")
    @Controller
    public class MyVaadinUI extends UI
    {
    
     SpringContextHelper helper = new SpringContextHelper(VaadinServlet.getCurrent().getServletContext());
    
    private static Logger LOGGER = Logger.getLogger(MyVaadinUI.class);
    
    @WebServlet(value = "/*", asyncSupported = true)
    @VaadinServletConfiguration(productionMode = false, ui = MyVaadinUI.class, widgetset = "b2b.frontend.AppWidgetSet")
    public static class Servlet extends VaadinServlet {
    }
    
    @Override
    protected void init(VaadinRequest request) {
        final VerticalLayout layout = new VerticalLayout();
        layout.setMargin(true);
        setContent(layout);
        final CompanyService companyService = (CompanyService) helper.getBean("companyService");
    
        Button button = new Button("Click Me");
        button.addClickListener(new Button.ClickListener() {
            public void buttonClick(ClickEvent event) {
                //layout.addComponent(new Label("Thank you for clicking"));
    
                LOGGER.info("pushed the button");
                layout.addComponent(new Label("aa " +companyService +" Thank you for clicking"));
    
            }
        });
        layout.addComponent(button);
    }
    

    }

2 个答案:

答案 0 :(得分:0)

您没有展示您的UI类。我怀疑UI不是Spring托管bean,因此自动装配已关闭。或者您的UI注释为Spring bean,但是使用 new 运算符创建,而不是从Spring上下文中获取。

好吧,如果按照你的解释那样做,它必须有效。没有怜悯。我做了一个简单的项目https://github.com/michaldo/multi-module-vaadin-spring,它的工作原理

答案 1 :(得分:0)

您可以将UI分为两层 - 视图(UI)和控制器(视图和逻辑类之间的中间类)。您可以通过标准方式从视图创建控制器,即使用 new 运算符。

然后使用@Configurable:

注释您的控制器类
@Configurable
public class MyController 
{
   @Autowired
   private MyService service;
}

Configurable告诉Spring这个从Spring上下文创建的bean应该仍然是依赖注入的主题。为了完成这项工作,您需要在类路径上添加AspectJ运行时+在构建中添加aspectj编译阶段 - 更改ui项目的pom.xml,如下所示:

    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>${aspectj.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!-- Aspectj plugin to make Spring aware of non-managed
        beans and support autowiring -->
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>aspectj-maven-plugin</artifactId>
      <version>1.4</version>
      <configuration>
        <!-- Required as the plugin does not resolve this by default -->
        <source>1.6</source>
        <target>1.6</target>
        <aspectLibraries>
          <aspectLibrary>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
          </aspectLibrary>
        </aspectLibraries>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>compile</goal>
            <goal>test-compile</goal>
          </goals>
        </execution>
      </executions>
    </plugin> 

我在我的项目中使用这种方法并且效果很好。