Spring 設定

Posted by Bruce Tsai

要使用 Spring 功能,就需要先配置 Spring 相關的設定,以便在執行時能透過 Spring 來管理元件(Bean)。比較常見的配置都是使用檔案 (XML base) 來進行,也有部份情況會直接使用程式碼 (Code base) 來進行配置,或者兩者混用的情況也有。

XML 檔案配置

以 bean 標籤逐一設定要管理的 bean 內容及其需要注入的依賴關係。

<?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">

    <!--json 序列化服務-->
    <bean id="gsonService" class="com.prhythm.core.generic.service.impl.GsonService"/>
    <!--封裝 json service 為 utility-->
    <bean class="com.prhythm.core.generic.util.Jsons">
        <property name="jsonService" ref="gsonService"/>
    </bean>

    <!-- add more beans here -->

</beans>

程式碼配置

以標註(Annotation)的方式設定 bean。

@Configuration
public class SpringServiceConfig {
    @Bean(name = {"gsonService"})
    public GsonService gsonService() {
        return new GsonService();
    }

    @Bean
    public Jsons jsons() {
        Jsons jsons = new Jsons();
        jsons.setJsonService(gsonService());
        return jsons;
    }
}

標註配置

以 Spring 提供的 @Component / @Service / @Repository 等標註,並在設定檔中設定掃描的方式。當程式愈來愈大,需要設定的 bean 也會愈多,若僅透過設定檔來設定,在維護上將會造成很大困擾,因此通常會搭配程式中的標註來處理,避免過多的設定。

標註為 Service
@Service
public class LocationService {
   ...
}
設定掃描 package
<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="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">

    <!--掃描 com.prhythm 下所有 bean-->
    <context:component-scan base-package="com.prhythm.*">
        <!--濾除特定的標註-->
        <context:exclude-filter type="annotation"
                                expression="com.prhythm.core.generic.annotation.stereotype.GenericComponent"/>
        <!-- 濾除 controller -->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

</beans>

載入配置的設定檔

配置完成後便需要讀取配置的內容,ApplicationContext 為用來載入並應用配置的介面。比較常見的實作有:

直接載入,以 ClassPathXmlApplicationContext 為例

ApplicationContext context = new ClassPathXmlApplicationContext("context-base.xml", "context-service.xml");
//ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:/context-*.xml");
JsonService serivce = (JsonService) context.getBean("gsonService");

搭配 JUnit

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/application-context.xml")
public class ServiceTester {
    @Autowired
    ApplicationContext context;

    @Test
    public void testCall() {
        // test code here
    }
}

results matching ""

    No results matching ""