SpringMVC万年不变的的核心:
IOC容器
AOP切面编程
DispatcherServlet 核心处理类 该类中包含springMVC初始化方法,先跳过这里不考虑我们先研究一下IOC容器。
IOC容器底层实际上是一个map,用来装载实例化对象。
我们先看一段简单的代码
@Controller
@ReuqestMapper("/user")
public class UserController {
@AutoWired
private UserService userService;
@ReuqestMapper("/login")
public void login(){
return null;
}
}
被@Controller、@Service、@Component注解标记的类会在springMVC框架初始化时(可以理解为项目服务启动时)通过反射机制创建该类对象并存入iosmap中,
当被@AutoWired注解标记后会springMVC会将实例化的对象get出来。
@ReuqestMapper注解中的参数也会存入map中,我们暂且将它定义为urlMap,springMVC会通过类上的地址和方法上的地址做拼接后存入urlMap中与method建立映射关系。
1、我们可以创建一个iocmap
Map iocMap = new HashMap(); \\ 我们可以把它理解为 springMvc的Ioc容器
2、当UserService类被@Service注解标记后
UserService userService = new UserService(); \\当然对象不是new出来的,而是通过反射 newInstanse()出来的 这里只是方便理解
iocMap.put("userService",userService); \\这里就将实例化对象存入到ioc容器中
3、当我们需要使用UserService这个对象时通过@AutoWired注解
UserService userService = iocMap.get("userService"); \\从容器中取出并注入
4、为login接口建立url映射
urlMap.put("/user/login",login方法); //类路径+方法路径做为key存入urlMap中 value为映射的方法
5、需要请求login接口时
localhost:8080/project/user/login
Method method = urlMap.get("/user/login"); //通过请求地址获取要调用的方法
让我们再来顺一遍springMVC启动时都做了什么
1、创建容器:创建IocMap。
2、扫描 ScanbasePackage配置的包下 @Controller、@Service 注解的类 (配置文件中ScanbasePackage配置了要扫描的包,只有在该包下的类才会被spring扫描)
3、实例化:将扫描到的类通过反射实例化并存入到iocMap容器中。
4、依赖注入:将存在依赖的bean进行注入。
5、http请求路径与method建立映射关系。
回到最开始我们提到的核心类,以上步骤就是在服务启动时通过 DispatcherServlet 核心类 init 方法中初始化
为什么会执行DispatcherServlet中的init方法
再回想下我们使用springMVC框架时 web.xml中的配置
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>