Spring5新特性

1、通过实现接口配置StringMVC的web.xml

第一步:导入包

  • commons-logging-1.2.jar
  • spring-aop-5.2.13.RELEASE.jar
  • spring-aspects-5.2.13.RELEASE.jar
  • spring-beans-5.2.13.RELEASE.jar
  • spring-context-5.2.13.RELEASE.jar
  • spring-context-support-5.2.13.RELEASE.jar
  • spring-core-5.2.13.RELEASE.jar
  • spring-expression-5.2.13.RELEASE.jar
  • spring-jdbc-5.2.13.RELEASE.jar
  • spring-tx-5.2.13.RELEASE.jar
  • spring-web-5.2.13.RELEASE.jar
  • spring-webmvc-5.2.13.RELEASE.jar

第二步:实现接口WebApplicationInitializer

重写onStartup方法

第三步:写入代码

1
2
3
4
5
6
7
8
9
10
//注册配置文件
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
//将注册好的配置文件加载入DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(context);
//将配置文件加载入tomcat
ServletRegistration.Dynamic registration = servletContext.addServlet("springmvc", servlet);
//设置优先级
registration.setLoadOnStartup(1);
registration.addMapping("/");

第四步:配置springMVC配置文件

这是一个普通的配置springMVC,后面会有一个详细的零配置整合SSM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
例:AppConfig.java
@Configuration //标志为配置类
@ComponentScan("web") //扫描web包下的注解
public class AppConfig {
// 设置一个bean往里面注入值 类似于
@Bean
public ViewResolver internalResourceViewResolver() {
//配置视图解析
InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}

2、通过实现接口配置web.xml原理

1、分析

1、tomcat在启动的时候会扫描所有jar下的*.jar\MATE-INF\services\javax.servlet.ServletContainerInitializer文件

2、进入javax.servlet.ServletContainerInitializer文件中的类

3、然后那个文件里面的类又实现了ServletContainerInitializer

3、根据servlet3.0的新特性,tomcat在启动的时候会获取@HandlesTypes(WebApplicationInitializer.class)注解值的所有实现类,注入onStartup方法中的Set集合中

4、然后调用onStartup方法,循环Set集合,判断实现类不能是接口,不能是抽象类

5、通过实现接口配置web.xml也实现了WebAPPlicationInitializer接口,所以就会在toncat启动就完成了

2、通过自己写一个架包看结果

1、创建java项目

2、在src下面创建META-INF目录

3、在META-INF目录下创建services目录

4、在services目录下创建file文件,文件名为javax.servlet.ServletContainerInitializer

5、创建一个包 servlet.newfeature(包名随意)

6、在包下创建一个接口 MyWebApplicationInitializer(接口名随意)

1
2
3
public interface MyWebApplicationInitializer {
void onStartup();
}

7、需要导入架包 servlet-api.jar

8、在包下创建一个类,实现接口,继承方法,并且在方法内随便输入语句,证明进来了

1
2
3
4
5
6
7
8
public class MyWebApplicationInitializerImpl implements MyWebApplicationInitializer{

@Override
public void onStartup() {
System.out.println("进入了MyWebApplicationInitializerImpl.onStartup");
}

}

9、在包下创建一个类myServlet(类名随便),实现ServletContainerInitializer,继承方法,并且加上注解 @HandlesTypes(MyWebApplicationInitializer.class) 注解内是你的接口.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@HandlesTypes(MyWebApplicationInitializer.class)
public class myServlet implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> arg0, ServletContext arg1) throws ServletException {
for (Class<?> class1 : arg0) {
//输出当前是哪个实体类
System.out.println("class1------"+class1);
//调用实体类中的onStartup方法
Object newInstanse = class1.newInstance();
Method method = class1.getMethod("onStartup", ServletContext.class);
method.invoke(newInstanse,servletContext);
}
}

}

10、在javax.servlet.ServletContainerInitializer文件类输入第8步类的完整路径

1
servlet.newfeature.myServlet

11、导出架包

eclipse:导出形成jar架包 右击项目选择Export,选择JAR file,进入后点击Browse…选择导入后的地址,命名,然后Finish结束

12、测试

将架包随便导入一个web项目,然后启动服务器则可以看到您输出的输出语句了

3、通过注解配置SpringMVC

1、@Configuration注解的作用

  • 从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件
  • @Configuration注解的配置类有如下要求:
    1. @Configuration不可以是final类型;
    2. @Configuration不可以是匿名类;
    3. 嵌套的configuration必须是静态类。

2、@ComponentScan注解的作用

  • 用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类自动装配到bean容器里。会被自动装配的注解包括@Controller、@Service、@Component、@Repository等
  • 扫描单个包@ComponentScan(“web”)
  • 扫多个包@ComponentScan({“web”,”text”})
  • 等价于利用xml配置中的<context:component-scan base-package=”controller” />

3、@EnableWebMvc

  • 暂时不了解
  • 类似于<mvc:annotation-driven />

4、实现接口 WebMvcConfigurer中的方法

重写里面的方法

1、addViewControllers 视图跳转控制器

1
2
3
4
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("add").setViewName("text");
}

等价于在springmvc.xml中配置<mvc:view-controller path=”/add” view-name=”text”/>

2、addInterceptors 拦截器

1
2
3
4
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TestInterceptor()).addPathPatterns("/*").excludePathPatterns("/text");
}

等价于

1
2
3
4
5
6
7
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*" />
<mvc:exclude-mapping path="/text" />
<bean class="interceptor.TestInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>

3、addResourceHandlers 静态资源

1
2
3
4
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}

5、@RestController

标识这是一个返回数据的控制器类,等于每个方法上都添加了个@ResponseBody注解

你点进这个注解则可以看到,这个注解上面添加了@Controller注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
例:
@RestController
@Controller
public class TestController222 {
@RequestMapping("/text1111")
public String text222() {
return "test22";
}


@RequestMapping("/json")
public Map<String, Object> json() {

Map<String,Object> map=new HashMap<String, Object>();
map.put("id", 1001);
return map;
}
}

6、@RequestHeaer注解

可以获取浏览器内Request Headers中的内容,通过键值对获取

Snipaste_2021-05-14_15-48-43

1
2
3
4
5
6
例:
@RequestMapping("/text1111")
public String text222(@RequestHeader("Sec-Fetch-Mode") String s) {
System.out.println(s);
return "test22";
}

4、零配置整合SSM

1、导入需要的架包

架包

2、通过实现接口配置web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
结果
例:MyWebApplicationInitializer.java
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
//注册配置文件
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
//将注册好的配置文件加载入DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(context);
//将配置文件加载入tomcat
ServletRegistration.Dynamic registration = servletContext.addServlet("springmvc", servlet);
//设置优先级
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}

3、通过实现接口WebMvcConfigurer配置springMVC.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Configuration    //标识这个是一个配置类
@ComponentScan({"config"}) //扫描架包
@EnableWebMvc //类似于<mvc:annotation-driven />
@Import(JdbcConfig.class) //类似于<import resource="" />
public class AppConfig implements WebMvcConfigurer{
//配置视图解析器
@Bean
public ViewResolver internalResourceViewResolver() {
InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}

//视图跳转控制器
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//输入add的时候,跳转到text.jsp
registry.addViewController("add").setViewName("text");
}

//
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截一级,除了请求text,其他的全部进TestInterceptor方法
//http://localhost/Spirng5-validator/ 这个为最基本的根目录
//则该拦截器只能拦截User/userListJson/User 这个层次,然后在后面继续/则不进行拦截
//如果要拦截多级,则/**
registry.addInterceptor(new TestInterceptor()).addPathPatterns("/*").excludePathPatterns("/text");
}
}

这个为最基本的springMVC配置,如果需要了解更多,请访问官网,本人在以后有时间了,则继续更新

4、配置Spring核心配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@Configuration	//标识这个是一个配置类
@ComponentScan({"modules","config","text"}) // 扫描包
public class JdbcConfig {
@Bean //配置数据源
public DataSource dataSource(JdbcConfigProperties jdbcConfigProperties) {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/user");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}

//扫描xml,配置SqlSessionFactoryBean
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {
SqlSessionFactoryBean sessionFactoryBean=new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
try {
Resource[] s= new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*.xml");
sessionFactoryBean.setMapperLocations(s);
} catch (IOException e) {
e.printStackTrace();
}
return sessionFactoryBean;
}


/*类似于xml中的这个配置,本人不太辽解,不好解释
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描dao层 -->
<property name="basePackage" value="modules"></property>
<!-- 识别dao层接口的Repository注解 -->
<property name="annotationClass" value="org.springframework.stereotype.Repository"></property>
<!-- 注入SqlSessionFactoryBean -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
*/
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer configurer=new MapperScannerConfigurer();
configurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");
configurer.setBasePackage("modules");
configurer.setAnnotationClass(Repository.class);
return configurer;
}
}

5、其他配置则跟通过xml配置的一样,如果报错,请仔细检查包是否导入正确