本章中的大多数示例都使用XML来指定BeanDefinition在Spring容器中生成每个配置的元数据。上一节(基于注释的容器配置)演示了如何通过源代码级注释提供大量配置元数据。但是,即使在这些示例中,“基本”bean定义在XML文件中显式定义,而注释仅驱动依赖注入。
本节介绍用于隐式检测候选组件的选项通过扫描类路径。候选组件是与过滤条件相匹配的类,并具有在容器中注册的相应的bean定义。这消除了使用XML来执行bean注册的需要; 相反,您可以使用注释(例如@Component),AspectJ类型表达式或您自己的自定义过滤条件来选择哪些类将具有注册到容器的bean定义。
从Spring 3.0开始,Spring JavaConfig项目提供的许多功能都是核心Spring框架的一部分。这使您可以使用Java定义bean,而不是使用传统的XML文件。看看的@Configuration,@Bean, @Import,和@DependsOn注释有关如何使用这些新功能的例子。
一、@Component和更多的典型注解
@Repository
注释是用于满足所述角色或任何类的标记 构造型的存储库(也被称为数据访问对象或DAO)的。
Spring提供进一步典型化注解:@Component
,@Service
,和 @Controller
。@Component
是任何Spring管理组件的通用原型。
@Repository
,@Service
、@Controller
和@Component
更具体的用例的专门化,例如,分别在持久性,服务和表示层中。
因此,你可以用你的注解组件类 @Component
,但如果用注解它们@Repository
,@Service
或者@Controller
,你的类能更好地被工具处理,或与切面进行关联。
例如,这些刻板印象注解是切入点的理想目标。这也有可能是@Repository
,@Service
和@Controller
可能会在Spring Framework的未来版本中增加额外的语义。因此,如果您选择使用@Component
或@Service
为您的服务层,@Service
显然是更好的选择。同样,如上所述,@Repository
已经被支持作为持久层中自动异常转换的标记。
二、Meta-annotations(元注释)
Spring提供的许多注释可以在您自己的代码中用作元注释。元注释只是一个可以应用于其他注释的注释。例如,@Service上面提到的注释用@Component以下元注释 :
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component // Spring will see this and treat @Service in the same way as @Component
public @interface Service {
// ....
}
元注释也可以组合起来创建组合注释。例如,@RestController从Spring MVC的注解@Controller和 @ResponseBody两个注释组合成的。
另外,组合的注释可以可选地重新声明来自元注释的属性以允许用户定制。当您只想暴露元注释属性的子集时,这可能特别有用。例如,Spring的 @SessionScope注解将范围名称硬编码,session但仍允许自定义proxyMode。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Scope(WebApplicationContext.SCOPE_SESSION)
public @interface SessionScope {
/**
* Alias for {@link Scope#proxyMode}.
* <p>Defaults to {@link ScopedProxyMode#TARGET_CLASS}.
*/
@AliasFor(annotation = Scope.class)
ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;
}
@SessionScope可以在没有声明的情况下使用proxyMode,如下所示:
@Service
@SessionScope
public class SessionScopedService {
// ...
}
或者proxyMode如下所示的重写值:
@Service
@SessionScope(proxyMode = ScopedProxyMode.INTERFACES)
public class SessionScopedUserService implements UserService {
// ...
}
三、自动检测类并注册bean定义
Spring可以自动检测刻板类,并使用它注册相应的 BeanDefinitions ApplicationContext。例如,以下两个类有资格进行这种自动检测:
@Service
public class SimpleMovieLister {
private MovieFinder movieFinder;
//构造器注入
@Autowired
public SimpleMovieLister(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
@Repository