3

spring mvc を使用して、銀行向けの非常に大規模なプロジェクトを設計する必要があります。私はすでに XML 構成を使用することを選択しています。私の懸念は、サーバーの起動時間を制限することです。約 2000 のコントローラがあります。

をスキャンするために、すでにコンポーネント スキャンを使用しています@Controller。うまくいきました。しかし、問題は、XML からコンポーネント スキャンを削除し、XML で手動で Bean 構成を使用してコントローラー Bean を追加すると、IOC コンテナーにコントローラーのインスタンスが作成されないことです。そして、404 not found エラーが表示されます。では、XML でコンポーネントをスキャンせずにコントローラーを構成するにはどうすればよいでしょうか。

以下は私のコードサンプルです。何か助けはありますか?

サーブレット-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

    <mvc:resources mapping="/resources/**" location="/resources/" />

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!--<context:component-scan base-package="" />-->
</beans>

root-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

    <import resource="dataContext/data-context.xml" />

    <bean id="contactSetupController" class="com.stl.afs.ci.cca.controller.ContactSetupController">
        <property name="contactSetupDao" ref="contactSetupDao" />
    </bean>

    <bean id="contactSetupDao" class="com.stl.afs.ci.cca.controller.ContactSetupDao" scope="prototype">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

</beans>

ContactSetupController.java

package com.stl.afs.ci.cca.controller;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;


@Controller
@RequestMapping("/contactsetup")
public class ContactSetupController {
    private static final Logger logger = LoggerFactory.getLogger(ContactSetupController.class);


    private ContactSetupDao contactSetupDao;

    public void setContactSetupDao(ContactSetupDao contactSetupDao) {
        this.contactSetupDao = contactSetupDao;
    }

    @RequestMapping(method = RequestMethod.GET)
    public String index(ModelMap model) {
        contactSetupDao.showDepedency();

        model.addAttribute("message", "Hello world! Nice to see you in the planet");
        return "ci/contactsetup/index";
    }
}

ContactSetupDao.java

package com.stl.afs.ci.cca.controller;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * Created by ARNAB on 1/8/2015.
 */
public class ContactSetupDao {
    public ContactSetupDao() {
        System.out.println("------DAO------");
    }

    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@" + sessionFactory);
        this.sessionFactory = sessionFactory;
    }

    @Transactional(readOnly = true)
    public void showDepedency(){
        Query query = sessionFactory.getCurrentSession().createSQLQuery("SELECT * FROM customers");
        int i = 0;
        for (Object o : query.list()) {
            i++;
        }
        System.out.println(i);
    }

}
4

2 に答える 2

1

あなたが得た問題404 - Not Foundは、タグ<context:annotation-config/> のみの使用です。

<context:annotation-config/>アプリケーションコンテキストに既に登録されている Bean のアノテーションのみをアクティブ化し、基本的な自動配線を行います。Bean の自動検出と登録は行いません。

Controllersそのため、リクエストを処理するために利用できるものはありません。

コントローラーを構成するには、とにかく機能しているコントローラーに戻すか (に戻すときに M. Deinum の提案を検討してください) SimpleUrlHanslerMappingなどを介してコントローラーをそれぞれの URL に手動で構成します(詳細が含まれるため、推奨されません) 。context:component-scanHandlerMappings

PS:との違いについて説明しているこの素晴らしい投稿を読んでください。<context:annotation-config><context:component-scan>

于 2015-01-09T07:34:26.017 に答える
1

How can I configure the controller without component scanning in XML?. 注釈ベースの構成を使用して、XML を回避できます。

このEnableWebMvc構成を確認してください。xml 構成なしで spring3.2 プロジェクトを構成しました。それは完全に注釈ベースでした。

Web アプリケーションの起動を上書きするInitializer:

public class Initializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException 
    {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(WebAppConfig.class);
        ctx.setServletContext(servletContext);

        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");

        servletContext.addListener(new ContextLoaderListener(ctx));        
    }
}

アプリケーション コンテキストの構成ファイル

@Configuration
@ComponentScan("com.paul.nkp")     // set your root package, it will scan all sub-package
@EnableWebMvc
@EnableTransactionManagement
@PropertySource("classpath:com/paul/nkp/application.properties")
public class WebAppConfig extends WebMvcConfigurerAdapter {

    /**
     * configured for read property values using @Value attibutes
     *
     * @return
     */
    @Bean
    public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean(name = "multipartResolver")
    public static MultipartResolver multipartResolver() {
        return new CommonsMultipartResolver();
    }
    @Bean
    public LocalSessionFactoryBean sessionFactory() throws PropertyVetoException, IOException {
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
        ......
        sessionFactoryBean.setHibernateProperties(getHibernateProperties());
        System.out.println("Session Factory Init");

        return sessionFactoryBean;
    }
}

これですべてがコードになり、xml 操作は不要になりました。構成ファイルに注釈があり、ComponentScan基本パッケージからすべてのスプリング注釈をスキャンします。

于 2015-01-12T07:27:35.563 に答える