首先抛出一个疑问,Spring怎么样找到开发者自定义的Controller把对应的请求分发到对应的方法上呢?
1.首先,要在Spring配置文件的头文件中引入spring-context
2.使用<context:component-scan>
元素启动“包扫描”功能,例如<context:component-scan base-package="com.myz.controller"/其中base-package是值是包的路径。意思就是,启动了包扫描功能,将com.myz.controller这个包下以及子包下的所有类扫描一遍,将标记有@Controller、@Service、@repository、@Component等注解的类注入到IOC(
Inversion of Control,即“控制反转”)容器中(
beanFactory),作为Spring的Bean来管理。
这样,Spring就能找到Controller类,通过@RequestMapping注解处理对应的请求。
spring注解是通过反射机制完成的,这些所有的注解都会被component注解接口注解,所有“继承”了component注解接口的注解修饰用户的类会被spring中的注解处理器获取(getAnonations()),判定存在component注解后,注解处理器会在spring容器框架中根据用户类的全限定名通过java的反射机制创建这个用户类的对象,并放到spring容器框架中进行管理。
注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池
逻辑思路整理
1.触发加载配置文件
2.初始化所有相关联的类,扫描用户指定包下面的类
3.拿到扫描到的类,通过反射技术实例化,并且放到IOC容器中
4.实现注入,主要针对service注入到controller
5.初始化handleMapping(将URL和method对应上)