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 {
...
}
为了简洁,上面可能使用注解的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>
使用<context:component-scan> 隐式地启用<context:annotation-config> 的功能。 当使用<context:component-scan> 时,通常不需要包含<context:annotation-config> . |
类路径扫描的包必须保证这些包出现在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配置。
通过设置annotation-config 属性值为false 即禁用AutowiredAnnotationBeanPostProcessor 和CommonAnnotationBeanPostProcessor 的注册。 |