SpringFramework核心技术一(IOC:类路径扫描和组件管理)

本章中的大多数示例都使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值