복붙노트

[SPRING] Spring 빈에 파일 자원 주입

SPRING

Spring 빈에 파일 자원 주입

스프링 빈에 파일 리소스를 주입하는 좋은 방법은 무엇입니까? 이제 ServletContext를 autowire하고 아래와 같이 사용합니다. 스프링 MVC에서 더 우아한 방법이 있나요?

@Controller
public class SomeController {

    @Autowired
    private ServletContext servletContext;

    @RequestMapping("/texts")
    public ModelAndView texts() {
        InputStream in = servletContext.getResourceAsStream("/WEB-INF/file.txt");
        // ...
    }
}

해결법

  1. ==============================

    1.이 같은:

    이 같은:

    @Controller
    public class SomeController {
    
        private Resource resource;
    
        public void setResource(Resource resource) {
            this.resource = resource;
        }
    
        @RequestMapping("/texts")
        public ModelAndView texts() {
            InputStream in = resource.getInputStream();
            // ...
            in.close();
        }
    }
    

    당신의 bean 정의에서 :

    <bean id="..." class="x.y.SomeController">
       <property name="resource" value="/WEB-INF/file.txt"/>
    </bean>
    

    이렇게하면 /WEB-INF/file.txt 경로를 사용하여 ServletContextResource가 생성되어 컨트롤러에 삽입됩니다.

    이 기술을 사용하여 구성 요소 검색을 사용하여 컨트롤러를 검색 할 수는 없으므로 명시 적 bean 정의가 필요합니다.

  2. ==============================

    2.무엇을 위해 자원을 사용 하시겠습니까? 당신의 예에서 당신은 아무 것도하지 않습니다.

    무엇을 위해 자원을 사용 하시겠습니까? 당신의 예에서 당신은 아무 것도하지 않습니다.

    그러나 그것의 이름에서 당신은 당신이 당신이 MessageSource가 될 수있는 국제화 / 로컬라이제이션 메시지를로드하려고 시도하는 것처럼 보입니다.

    다음과 같이 일부 beans (별도의 messages-context.xml에 있음)를 정의하는 경우

    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>WEB-INF/messages/messages</value>
            </list>
        </property>
    </bean>
    
    <bean id="localeChangeInterceptor"
        class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang" />
    </bean>
    
    <bean id="localeResolver"
        class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
        <property name="defaultLocale" value="en_GB" />
    </bean>
    

    Spring은 애플리케이션이 시작될 때 리소스 번들을로드 할 것이다. 그런 다음 MessageSource를 컨트롤러에 자동으로 가져 와서 지역화 된 메시지를 가져올 수 있습니다.

    @Controller
    public class SomeController {
    
        @Autowired
        private MessageSource messageSource;
    
        @RequestMapping("/texts")
        public ModelAndView texts(Locale locale) {
            String localisedMessage = messageSource.getMessage("my.message.key", new Object[]{}, locale)
            /* do something with localised message here */
            return new ModelAndView("texts");
        }
    }
    

    NB. 로케일을 컨트롤러 메소드에 매개 변수로 추가하면 스프링이 마술처럼 연결됩니다.

    또한 다음을 사용하여 JSP에서 자원 번들의 메시지에 액세스 할 수 있습니다.

    <spring:message code="my.message.key" />
    

    내가 선호하는 방법은 무엇입니까 - 그냥 깨끗하게 보입니다.

  3. ==============================

    3.또는 @Value 주석을 사용하십시오.

    또는 @Value 주석을 사용하십시오.

    단일 파일의 경우 :

    @Value("classpath:conf/about.xml")
    private Resource about;
    

    여러 파일의 경우 :

    @Value("classpath*:conf/about.*")
    private Resource[] abouts;
    
  4. from https://stackoverflow.com/questions/7280115/inject-a-file-resource-into-spring-bean by cc-by-sa and MIT license