# 拉勾作业
**Repository Path**: swg209/lagou-homework
## Basic Information
- **Project Name**: 拉勾作业
- **Description**: 1. 拉勾Java高薪课作业
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2022-01-14
- **Last Updated**: 2022-01-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# lagou-homework
拉勾Java高薪课作业
## 阶段一 开源框架源码剖析
### 模块一 持久层框架设计实现及MyBatis源码分析
请完善自定义持久层框架IPersistence,在现有代码基础上添加、修改及删除功能
完成日期:2021.11.16(二)
### 模块二 IoC容器设计实现及Spring源码分析
学员自定义@Service、@Autowired、@Transactional注解类,完成基于注解的IOC容器(Bean对象创建及依赖注入维护)和声明式事务控制,写到转账工程中,并且可以实现转账成功和转账异常时事务回滚
完成日期:2021.12.05(日)
### 模块三 MVC框架设计实现及SpringMVC源码分析、通用数据操作接口设计、SpringData高级应用
1)定义注解@Security(有value属性,接收String数组),该注解用于添加在Controller类或者Handler方法上,表明哪些用户拥有访问该Handler方法的权限(注解配置用户名)
完成日期:2021.12.17(五)
### 模块四 约定优于配置设计范式及Spring Boot源码剖析
**1.作业要求:**
自定义简易版SpringBoot,实现SpringBoot MVC及内嵌Tomcat启动、DispatcherServlet注册和组件扫描功能。
- 程序通过main方法启动,可以自动启动tomcat服务器
- 可以自动创建和加载DispatcherServlet组件到ServletContext中
- 可以自动通过@ComponentScan扫描Controller等组件
- Controller组件可以处理浏览器请求,返回响应结果
**2.作业提示:**
当实现了Servlet3.0规范的容器(比如Tomcat7及以上版本)启动时,会通过SPI扩展机制自动扫描所有jar包里`META-INF/services/javax.servlet.ServletContainerInitializer`文件中指定的全路径类(该类需实现`ServletContainerInitializer`接口),并实例化该类,并回调类中的onStartup方法。
传统SpringMVC框架web.xml的配置内容:
```xml
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
/WEB-INF/app-context.xml
app
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
1
app
/app/*
```
Spring官方文档中给出了基于Servlet3.0规范如何使用Java代码实现web.xml配置的example
```java
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletCxt) {
// Load Spring web application configuration
//通过注解的方式初始化Spring的上下文
AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
//注册spring的配置类(替代传统项目中xml的configuration)
ac.register(AppConfig.class);
ac.refresh();
// Create and register the DispatcherServlet
//基于java代码的方式初始化DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(ac);
ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
registration.setLoadOnStartup(1);
registration.addMapping("/app/*");
}
}
```
以上知识点为作业实现基础,以此为基础,完成简易版SpringBoot,并创建Controller,能够完成方法访问。
**3.作业实现过程:**
(1)创建maven工程,导入以下依赖:
```xml
1.8
org.apache.tomcat.embed
tomcat-embed-core
8.5.32
org.springframework
spring-context
5.0.8.RELEASE
org.springframework
spring-webmvc
5.0.8.RELEASE
org.springframework.boot
spring-boot-maven-plugin
```
(2)创建`SpringApplication`类,编写`run`方法(方法中要求完成tomcat的创建及启动)
(3)创建spring的配置类`AppConfig`该类上要通过`@ComponentScan`来进行包扫描
(4)创建`MyWebApplicationInitializer`实现`WebApplicationInitializer`接口,重写`onstartup`方法(`WebApplicationInitializer`实现`web.xml`的配置)
> 提示:仿写上面Spring官方给出的例子,完成AppConfig的注册,并基于java代码的方式初始化DispatcherServlet
(5)创建`MySpringServletContainerInitializer`,实现`ServletContainerInitializer`接口,重写`onstartup`方法,方法中调用第4步中`MyWebApplicationInitializer`的`onstartup`方法
> 提示:Servlet 3.0+容器启动时将自动扫描类路径以查找实现Spring的`Webapplicationinitializer`接口的所有实现,将其放进一个Set集合中,提供给`ServletContainerInitializer`中`onStartup`方法的第一个参数。
(6)创建文件:`META-INF/services/javax.servlet.ServletContainerInitializer`,在该文件中配置`ServletContainerInitializer`的实现类`MySpringServletContainerInitializer`
(7)编写一个`Controller`测试类及目标方法,响应输出“hello”即可
(8)编写一个启动类`MyRunBoot`,通过执行`main`方法启动服务
> 提示:main方法调用第2步中SpringApplication的run方法启动
(9)通过浏览器对目标方法进行方法

完成时间:2022-01-12(三)