Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在spring中进行组件扫描?是将所有对象初始化为singleton还是延迟初始化?_Java_Spring - Fatal编程技术网

Java 如何在spring中进行组件扫描?是将所有对象初始化为singleton还是延迟初始化?

Java 如何在spring中进行组件扫描?是将所有对象初始化为singleton还是延迟初始化?,java,spring,Java,Spring,我想知道SpringServlet组件扫描是如何工作的?它扫描@Service、@Component等,但我不清楚它是如何工作的?这背后的流程是什么?当您对开源项目中的实现方式感到好奇时,最好的做法是查看源代码。我会这样做的。这些步骤特定于我的特定配置(使用Eclipse编写的基于XML的Spring上下文),但一般理论适用于任何环境 1) 通过查看源代码,我知道解析特定XML配置元素的类的名称通常以“BeanDefinitionParser”结尾。因此,看看如何: <context:co

我想知道SpringServlet组件扫描是如何工作的?它扫描@Service、@Component等,但我不清楚它是如何工作的?这背后的流程是什么?

当您对开源项目中的实现方式感到好奇时,最好的做法是查看源代码。我会这样做的。这些步骤特定于我的特定配置(使用Eclipse编写的基于XML的Spring上下文),但一般理论适用于任何环境

1) 通过查看源代码,我知道解析特定XML配置元素的类的名称通常以“BeanDefinitionParser”结尾。因此,看看如何:

<context:component-scan base-package="com.yourproject" />
5) 在ClassPathScanningCandidateComponentProvider中,我可以看到在包中的所有内容上循环的for循环

public Set<BeanDefinition> findCandidateComponents(String basePackage) {
    Set<BeanDefinition> candidates = new LinkedHashSet<BeanDefinition>();

    try {
        String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
        resolveBasePackage(basePackage) + "/" + this.resourcePattern;

        Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);

        boolean traceEnabled = logger.isTraceEnabled();
        boolean debugEnabled = logger.isDebugEnabled();

        for (int i = 0; i < resources.length; i++) {
7) 在PathMatchingResourcePatternResolver中,您可以看到实际搜索类路径的代码。

它归结为使用类装入器和资源路径匹配进行一些练习,并使用
ClassLoader.getResources(String name)
方法,该方法返回一个
枚举
,其中包含表示类路径资源的URL。然后检查这些资源(Java类),看它们是否包含@Component注释(或其专门化),如果是,则被视为“候选”组件。可以进行其他筛选,但默认情况下,这些组件将以编程方式定义为Springbean。当启用注释配置时,组件的自动连接也会发生,因此我可以让Spring扫描所有web控制器的类路径,然后自动注入依赖项,如服务或数据访问对象

执行此魔术的实际类是
ClassPathScanningCandidateComponentProvider
,默认情况下,它使用PathMatchingResourcesPatternResolver使用
ClassLoader.getResources()
查找匹配的类路径资源


根据Spring,默认情况下bean是单例的

与Spring管理的组件一样,默认组件 最常见的作用域是“singleton”。然而,有时也会出现其他情况 需要范围。因此,Spring2.5引入了一个新的@Scope 还有注释。只需在 注释

不同的Bean作用域是可访问的

public class ClassPathBeanDefinitionScanner extends ClassPathScanningCandidateComponentProvider {  
public Set<BeanDefinition> findCandidateComponents(String basePackage) {
    Set<BeanDefinition> candidates = new LinkedHashSet<BeanDefinition>();

    try {
        String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
        resolveBasePackage(basePackage) + "/" + this.resourcePattern;

        Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);

        boolean traceEnabled = logger.isTraceEnabled();
        boolean debugEnabled = logger.isDebugEnabled();

        for (int i = 0; i < resources.length; i++) {
private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
@Scope(StandardScopes.PROTOTYPE)
@Repository
public class MovieFinderImpl implements MovieFinder {
    // ...
}