Spring Java配置要点
Spring的核心配置是 @Configuration类,这是我们放置所有Spring上下文属性的地方。通常的元注解如下:@Component | 普通组件类型 |
@Repository | 持久层 |
@Service | 服务层 |
@Component | 表现层 |
组件的扫描
在对我们的类进行元注解以后,我们现在需要将它们加入到Spring上下文,这是使用 @Configuration class by @ComponentScan
@Configuration
@ComponentScan("my.package.containing.beans")
public class SpringConfig {
}
使用字符串文字代表的包名 - 很容易犯错误是很难找到。这是必须注意的,好在可以使用basePackageClasses 参数来替代,如下:
@Configuration
@ComponentScan(basePackageClasses = BeansPackageMarker.class,
includeFilters = @ComponentScan.Filter(ConventionSucks.class))
public class SpringConfig {
}
这里@ComponentScan 拓展了使用我们自己定制的元注解@ConventionSucks
@ComponentScan.Filter是非常泛型的,允许使用各种类型策略参数:
ANNOTATION | 以给定的元注解标注 |
ASSIGNABLE_TYPE | 分配给给定的类型 |
ASPECTJ | AspectJ 类型 |
REGEX | 使用 Pattern |
CUSTOM | 实现 TypeFilter定制的过滤器 |
Wiring beans
现在我们已经配置Spring如何能够识别我们的bean, 下面是如何实现依赖注入,分两种情况:
1. 由我们创建的bean
2.外部的bean
第一种情况使用@Autowired , 能够在构造器 字段 方法等使用。
@Component
public class UserBeanB {
private final UserBeanA userBeanA;
@Autowired
public UserBeanB(UserBeanA userBeanA) {
this.userBeanA = userBeanA;
}
}
当然我们也可以使用@Inject 替代@Autowired
对于外部bean,我们无法控制的类,比如在外部的框架或库包内:
@Configuration
public class SpringConfig {
@Bean
public ExternalObjectA externalObjectA() {
return new ExternalObjectA();
}
@Bean
public ExternalObjectB externalObjectB1() {
return new ExternalObjectB(externalObjectA());
}
@Bean
public ExternalObjectB externalObjectB2() {
return new ExternalObjectB(externalObjectA());
}
}