spring中怎样实现自动扫描

spring中怎样实现自动扫描,第1张

我们都知道在Spring中单独给一个类装配,

[html] view plain copy

<bean id="customerDAO" class="com.yiibai.customer.dao.CustomerDAO" />

只需要在xml中配置bean即可,但是如果我们有一大推类要配置,那么一个一个配置就太麻烦了。

这个时候用Spring中的自动扫描组件就很方便了

共有4种类型的自动扫描:@Component(任意组件)、@Repository(DAO层组件)、@Service(业务层组件)和@Controller(控制层组件)

举个例子

java类

[java] view plain copy

package cn.belle.test

import org.springframework.stereotype.Component

@Component

public class Student {

private String name

private Job job

public String getName() {

return name

}

public void setName(String name) {

this.name = name

}

public Job getJob() {

return job

}

public void setJob(Job job) {

this.job = job

}

}

[java] view plain copy

package cn.belle.test

import org.springframework.stereotype.Component

@Component

public class Job {

private String Jobname

public String getJobname() {

return Jobname

}

public void setJobname(String jobname) {

Jobname = jobname

}

}

xml配置

[html] view plain copy

<context:component-scan base-package="com.belle.test" />

PS:我们可以用自动扫描的注解来定义bean的id 如:

[java] view plain copy

package cn.belle.test

import org.springframework.stereotype.Component

@Component("student")

public class Student {

private String name

private Job job

public String getName() {

return name

}

public void setName(String name) {

this.name = name

}

public Job getJob() {

return job

}

public void setJob(Job job) {

this.job = job

}

}

从SpringApplication#refreshContext方法开始追踪,找到

AbstractApplicationContext#invokeBeanFactoryPostProcessors方法,继续深入找到ConfigurationClassParser#doProcessConfigurationClass方法,就是从这里开始,根据ComponentScan配置的路径去加载需要spring管理的类。下面详细讲讲加载过程:

第一步,根据ComponentScan配置的路径去查找所有class文件,具体的方法在PathMatchingResourcePatternResolver#doRetrieveMatchingFiles,目的是扫描路径下每一个目录里的class文件。

第二步,过滤出使用了@Component注解的类,具体的方法在ClassPathScanningCandidateComponentProvider#scanCandidateComponents。

第三步,将第二步筛选出来的注册到bean工厂的注册表缓存中,具体的方法在ClassPathBeanDefinitionScanner#doScan

第四步,加载类里面的@Bean注解信息,并存放在配置缓存configurationClasses中,具体的方法在ConfigurationClassParser#processConfigurationClass

第五步,将第四步加载的@Bean信息注册到bean工厂的注册表缓存里,具体方法在

ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForBeanMethod

第六步,在refreshContext方法里有个finishBeanFactoryInitialization方法,在里面找到DefaultListableBeanFactory#preInstantiateSingletons方法,这里bean工厂将所有注册的bean都生成了实例。

bean工厂生成bean实例的步骤可以参考下面的文章

Spring Bean的生命周期: https://www.cnblogs.com/zrtqsk/p/3735273.html

那我想只有可能是你包结构的问题了!

第一,你的二个类是不是package com.test了

第二,你的applicationContext.xml是不是放在src根包下面了。

第三,最后的可能就是你的spring少jar包了。。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11556496.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存