Spring零配置檔案專案搭建

ironsmile發表於2016-11-29

本文主要記錄Spring零配置的方法,包括相關類以及註解的使用方法。

Servlet配置

傳統的servlet都是在web.xml中配置,從Servlet 3.0開始提供了ServletContainerInitializer介面,允許使用程式碼去配置servletsfilterslisteners

Spring為我們提供了一個該介面的實現類SpringServletContainerInitializer,檢視原始碼可以知道該類通過@HandlesTypes()註解指定了onStartup()方法的第一個引數接收WebApplicationInitializer實現類的集合。所以如果我們要使用這種方式配置servlet,只需要實現WebApplicationInitializer介面即可。

具體實現程式碼:

public class WebInitializer implements WebApplicationInitializer {

    private static final Logger logger = LoggerFactory.getLogger(WebInitializer.class);

    @Override
    public void onStartup(javax.servlet.ServletContext servletContext) throws ServletException {
        logger.info("begin init web application.");

        //配置Spring
        AnnotationConfigWebApplicationContext springContext = new AnnotationConfigWebApplicationContext();
        springContext.register(SpringConfig.class);
        
        //新增linstener
        servletContext.addListener(new ContextLoaderListener(springContext));

        //新增servlet
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet(
                "dispatcher", new DispatcherServlet(springContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");

        //新增filter
        LoggerFilter loggerFilter = new LoggerFilter();
        FilterRegistration.Dynamic logFilterRegistration=container.addFilter("requestResponseLogFilter", loggerFilter);
        logFilterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC), false, "/*");

        logger.info("init web application success.");
    }
}

Spring配置

Spring的配置主要就是配置各種Bean,主要是要了解幾種註解的使用方法。

@Configuration

使用@Configuration註解的類相當於傳統配置檔案中的Beans,該類中的方法可以通過@Bean標註成為Bean。

@Configuration
public class SpringConfig {
    @Bean(name = "exampleBean")
    public ExampleBean getExampleBean() {
        return new ExampleBean();
    }
}
@ComponentScan

使用@ComponentScan用來標明要掃描註解的包,相當於配置檔案中的context:component-scan,Spring會自動掃描註冊指定包中使用註解指定的Bean。

@ComponentScan(basePackages = {"com.example.service","com.example.dao"})
@PropertySource

使用@PropertySource註解可以引入properties配置檔案,通過注入Environment物件可以很方便的拿到配置檔案中的內容。

@Configuration
@PropertySource("classpath:config.properties")
@ComponentScan(basePackages = {"com.example.service","com.example.dao"})
public class SpringConfig {

    @Autowired
    private Environment env;

    @Bean(name = "mysqlDataSource")
    public DataSource mysqlDataSource() {
        ProxoolDataSource dataSource = new ProxoolDataSource();
        dataSource.setDriver(env.getProperty("ds.driver.classname"));
        dataSource.setDriverUrl(env.getProperty("ds.url"));
        dataSource.setUser(env.getProperty("ds.username"));
        dataSource.setPassword(env.getProperty("ds.password"));
        dataSource.setPrototypeCount(env.getProperty("proxool.prototype", Integer.class));
        dataSource.setMinimumConnectionCount(env.getProperty("proxool.minimum", Integer.class));
        dataSource.setMaximumConnectionCount(env.getProperty("proxool.maximum", Integer.class));
        dataSource.setSimultaneousBuildThrottle(env.getProperty("proxool.simultaneous", Integer.class));
        dataSource.setTestBeforeUse(true);
        dataSource.setHouseKeepingTestSql(env.getProperty("proxool.testSql"));
        return dataSource;
    }

}

config.properties檔案內容:

ds.driver.classname=com.mysql.jdbc.Driver
ds.url=jdbc:mysql://...
ds.username=...
ds.password=...
...

相關文章