本文主要記錄Spring零配置的方法,包括相關類以及註解的使用方法。
Servlet配置
傳統的servlet都是在web.xml
中配置,從Servlet 3.0
開始提供了ServletContainerInitializer
介面,允許使用程式碼去配置servlets
、filters
、listeners
。
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=...
...