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
- FileSystemXmlApplicationContext
- XmlPortletApplicationContext
- XmlWebApplicationContext
- AnnotationConfigApplicationContext
- AnnotationConfigWebApplicationContext
直接載入,以 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
}
}