[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包了。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)