3.10.3 自动检测类并注册bean定义

Spring可以自动检测各代码层的被注解的类,并使用ApplicationContext内注册相应的BeanDefinition。 例如,以下两个类就可以被自动探测:

@Service
public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Autowired
    public SimpleMovieLister(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

}
@Repository
public class JpaMovieFinder implements MovieFinder {
    // implementation elided for clarity
}

要自动检测这些类并注册相应的bean,需要在@Configuration配置中添加@ComponentScan,其中basePackages属性是两个类的常用父包。 (或者,你可以指定包含每个类的父包的逗号/分号/空格分隔列表。)

@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig  {
       ...
}
[Note]
为了简洁,上面可能使用注解的value属性,即@ComponentScan("org.example")

也可以使用XML形式的配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="org.example"/>

</beans>
[Tip]
使用<context:component-scan>隐式地启用<context:annotation-config>的功能。 当使用<context:component-scan>时,通常不需要包含<context:annotation-config>.
[Note]
类路径扫描的包必须保证这些包出现在classpath中。 当使用Ant构建JAR时,请确保你没有激活JAR任务的纯文件开关。 此外在某些环境装因为安全策略,classpath目录也许不能访问。比如, JDK 1.7.0_45及更高版本的独立应用程序(需要在你的manifests中设置信任类库“Trusted-Library”;请参见 http://stackoverflow.com/questions/19394570/java-jre-7u45-breaks-classloader-getresources )

此外,当使用component-scan元素时,“AutowiredAnnotationBeanPostProcessor”和“CommonAnnotationBeanPostProcessor”都会隐式包含。 意味着这两个组件也是自动探测和注入的--所有这些都不需要XML配置。

[Note]
通过设置annotation-config属性值为false即禁用AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor的注册。

results matching ""

    No results matching ""