Java配置
Java配置(JavaConfig)是Spring 3.0引入,Spring 4.x后成为推荐的配置方式,用纯Java代码替代XML配置。
核心注解
@Configuration
标识配置类,相当于XML配置文件。
Java
@Configuration
public class AppConfig {
// Bean定义方法
}
@Bean
定义Bean,相当于XML的标签。
Java
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
@Bean
public OrderService orderService() {
return new OrderService(userService()); // 引用其他Bean
}
}
完整配置示例
定义配置类
Java
@Configuration
@ComponentScan("com.example")
@Import(DataSourceConfig.class)
public class AppConfig {
@Bean
@Primary
public UserService userService() {
UserService service = new UserService();
service.setTimeout(30);
return service;
}
@Bean
@Scope("prototype")
public PrototypeBean prototypeBean() {
return new PrototypeBean();
}
@Bean(initMethod = "init", destroyMethod = "destroy")
public LifecycleBean lifecycleBean() {
return new LifecycleBean();
}
}
导入其他配置
Java
@Configuration
@Import({DatabaseConfig.class, WebConfig.class})
public class MainConfig {
}
// 或在导入的配置中引用其他配置的Bean
@Configuration
public class DatabaseConfig {
@Bean
public DataSource dataSource() {
return new HikariDataSource();
}
}
@Configuration
public class ServiceConfig {
@Autowired
private DataSource dataSource; // 引用DatabaseConfig的Bean
@Bean
public UserService userService() {
UserService service = new UserService();
service.setDataSource(dataSource);
return service;
}
}
Bean属性配置
作用域
Java
@Bean
@Scope("prototype")
public PrototypeBean prototypeBean() {
return new PrototypeBean();
}
@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public RequestBean requestBean() {
return new RequestBean();
}
懒加载
Java
@Bean
@Lazy
public LazyBean lazyBean() {
return new LazyBean();
}
优先注入
Java
@Bean
@Primary
public UserService primaryUserService() {
return new UserService();
}
@Bean
public UserService backupUserService() {
return new BackupUserService();
}
条件注册
Java
@Bean
@ConditionalOnProperty(name = "cache.enabled", havingValue = "true")
public CacheService cacheService() {
return new CacheService();
}
@Bean
@ConditionalOnMissingBean(CacheService.class)
public NoCacheService noCacheService() {
return new NoCacheService();
}
外部属性注入
@Value注入
Java
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
@Value("${database.url}")
private String dbUrl;
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(dbUrl);
return ds;
}
}
@ConfigurationProperties
Java
@ConfigurationProperties(prefix = "database")
public class DatabaseProperties {
private String url;
private String username;
private String password;
// getters and setters
}
@Configuration
@EnableConfigurationProperties(DatabaseProperties.class)
public class DatabaseConfig {
@Bean
public DataSource dataSource(DatabaseProperties props) {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(props.getUrl());
ds.setUsername(props.getUsername());
ds.setPassword(props.getPassword());
return ds;
}
}
启动Java配置
Java
public class Main {
public static void main(String[] args) {
// 使用AnnotationConfigApplicationContext
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
}
}
// 或通过Spring Boot
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Java配置 vs XML配置
| 特性 | Java配置 | XML配置 |
|---|---|---|
| 类型安全 | ✅ | ❌ |
| IDE支持 | ✅ 重构友好 | 一般 |
| 配置位置 | 代码中 | 外部文件 |
| 修改影响 | 需重新编译 | 无需编译 |
| 表达力 | 强(可编程) | 有限 |
要点总结
- @Configuration标识配置类,@Bean定义Bean
- Java配置类型安全,IDE支持好,便于重构
- @Import可导入其他配置类
- @Scope/@Lazy/@Primary等注解配置Bean属性
- @ConfigurationProperties支持类型安全的属性绑定
📝 发现内容有误?点击此处直接编辑