常规spring项目中,会采用纯xml或者xml和注解配合使用的配置方式。在spring 3.0版本以后就引入 @Configuration和AnnotationConfigApplicationContext 等实现,可以支持纯java方式配置的spring 容器,不需要任何xml配置。本文介绍如何搭建一个零配置的spring 容器项目。
我们定义一个java类后,使用@Configuration注解表示这个一个配置类,等同于xml配置中xml文件。
在配置类中使用,等同于xml配置的
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
有了配置类后,需要构建spring容器。在xml配置作为入口的项目中,会用ClassPathXmlApplicationContext 来构建容器,而在纯java类配置的场景中,AnnotationConfigApplicationContext承担了同样地构建容器实例的角色。下面代码就演示了如何基于AppConfig.java构建容器以及访问其中的bean实例。
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = ctx.getBean(MyService.class);
}
类似xml配置中的component-scan,我们可以配置针对特别package的扫描配置,自动将包内@Component、@Service 等注解的bean类给扫描出来,注入到容器中。用法如下:
@Configuration
@ComponentScan(basePackages = "com.acme")
public class AppConfig {
...
}
name属性可以自定义bean的名字;initMethod指定了bean的初始化方法;destroyMethod指定实例销毁时的清理方法。
@Bean(name = "myFoo",initMethod = "init",destroyMethod = "cleanup")
默认的@Bean定义的实例都是单例,可以通过@Scope定义不同生命周期的bean
@Bean
@Scope("prototype")
public Encryptor encryptor() {
// ...
}
大型项目中,我们可能会配置多个xml组合使用。纯Java配置中可以创建多个Config配置类后,在其中一个主配置类,通过@import引入其他配置类,最后构建容器时,提供这个主配置类即可。样例代码如下:
@Configuration
public class ConfigA {
@Bean
public A a() {
return new A();
}
}
@Configuration
@Import(ConfigA.class)
public class ConfigB {
@Bean
public B b() {
return new B();
}
}
在配置类,我们可以直接通过@EnableScheduling和@PropertySource("classpath:my.properties")等方式支持调度以及引入属性文件。注意使用@PropertySource引入属性文件时,需要同时定义一个PropertySourcesPlaceholderConfigurer的bean。 样例代码如下:
@Configuration
@ComponentScan(basePackages = "com.test")
@EnableScheduling
@PropertySource("classpath:my.properties")
public class AppConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}
}
@Component
public class SheduledTask {
@Value("${api.hosts}")
private String hosts;
@Value("${api.port}")
private String port;
@Scheduled(cron = "0 0/10 * * * *")
public void doStuff() {
}
}
AnnotationConfigWebApplicationContext可以用来构建支持web mvc容器的配置。 如下配置web.xml的子配置即可引入零配置的web spring mvc应用。
contextClass
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
contextConfigLocation
com.acme.AppConfig
org.springframework.web.context.ContextLoaderListener
dispatcher
org.springframework.web.servlet.DispatcherServlet
contextClass
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
contextConfigLocation
com.acme.web.MvcConfig
dispatcher
/app/*
如上所述,基于@Configuration 和AnnotationConfigApplicationContext等实现可以零配置构建spring容器应用以及spring mvn web应用,常见的注解使用方式都可以组合使用。基于纯java类配置的详细文档可以参考官方文档。spring基于纯java类的配置官方文档链接