由于Spring1.0时代都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,相当的繁琐。随着JDK1.5带来的注解支持,Spring2.0可以使用注解对Bean进行申明和注入,大大减少了xml配置文件,同时也大大简化了项目开发。
那么问题来了,是应该使用xml还是注解呢?
1.应用的基本配置使用xml,如数据库,资源文件等
2.业务开发用注解,如Service中注入Bean
1 Spring4.0基于注解形式开发配置
1.1 声明Bean注解
@Repository 在数据访问层(dao 层) 类级别声明
@Service 在业务逻辑层(Service 层)类级别进行声明
@Controller 在展现层(MVC) 使用 标注当前类为一个控制器
@Compoment组件 没有明确规定其角色,作用在类级别上声明当前类为一个业务组件,被 Spring Ioc 容器维护
1.2 注入Bean注解
@AutoWired Spring 官方提供注解
@Inject JSR-330 提供注解(标准制定方)
@Resource JSR-250 提供注解
1.3 Spring4.0中配置与获取Bean注解
@Configuration 作用在类上,将当前类声明为一个配置类,相当于一个xml配置文件
@ComponentScan 自动扫描指定包下标注有@Repositor,@Service,@Controller@Component 注解的类并由 Ioc 容器进行实例化和维护
@Bean 作用于方法上,相当于xml文件中声明当前方法返回值为一个bean
1.4 组合注解与元注解
Spring 从 2.x 版本开始引入注解支持(目的是 jdk1.5 中推出注解功能),通过引入注解来消除大量 xml 配置,Spring 引入注解主要用来注入 bean以及 aop 切面相关配置,但由于注解大量使用,就会造成大量重复注解代码出现,代码出现了重复, Spring 为了消除重复注解,在元注解上引入了组合注解,其实可以理解为对代码的重构,相当于注解的注解,拥有元注解的原始功能,比如在定义配置类时用到的@Configuration 注解就是组合注解,拥有Component 注解功能,即配置类本身也是一个被 Ioc 维护的单例 Bean.
2 Spring MVC零配置创建与部署
2.1 pom.xml坐标环境添加
<!-- spring web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<!-- spring mvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<!-- web servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<build>
<finalName>springmvc</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
2.2 控制器添加
@Controller
public class HelloController {
@RequestMapping("/index")
public String index(){
return "index";
}
}
2.3视图添加
在 WEB-INF/views 目录下创建 index.jsp(这里以 jsp 为模板)
<html>
<body>
<h2>test web mvc</h2>
</body>
</html>
2.4 MVC环境配置信息添加
Spring Mvc 配置信息 MvcConfig 文件添加,作为 Mvc 框架环境,原来是通过xml 来进行配置(视图解析器, Json 转换器,文件上传解析器等),这里基于注解通过继承 WebMvcConfigurerAdapter 类 并重写相关方法来进行配置(注意通过@EnableWebMvc 注解来启动 mvc 环境)
/**
* mvc 基本配置
*/
@Configuration
@EnableWebMvc
@ComponentScan("com.shsxt")
public class MvcConfig extends WebMvcConfigurerAdapter{
// 视图解析器 bean 配置
@Bean
public InternalResourceViewResolver viewResolver(){
InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
MvcConfig 类定义好了,那么问题来了,怎么加载 MvcConfig 类呢,原来在构建 Mvc 应用时是通过容器启动应用时加载 web.xml 文件 实现配置文件加载,现在的环境 web.xml 文件不存在,此时基于注解方式构建的 Mvc 应用,定义WebInitializer 实现 WebApplicationInitializer 接口(该接口用来配置Servlet3.0+配置的接口,用于替代 web.xml 配置),当 servlet 容器启动 Mvc应用时会通过 SpringServletContainerInitializer 接口进行加载 从而加载Mvc 应用信息配置。 实现该接口 onStartup 方法 ,加载应用信息配置 。
2.5 应用配置加载接口实现
public class WebInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
// 注册 Mvc 配置信息
ctx.register(MvcConfig.class);
// 设置 ServletContext 上下文信息
ctx.setServletContext(servletContext);
// 配置转发器 Dispatcher
ServletRegistration.Dynamic
servlet=servletContext.addServlet("dispatcher",new DispatcherServlet(ctx));
servlet.addMapping("/");
// 启动时即实例化 Bean
servlet.setLoadOnStartup(1);
}
}
测试
3 Spring Boot概念介绍以及优缺点
3.1 概念
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式, Spring Boot 致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者.
随着动态语言流行(Ruby,Scala,NodeJs 等), Java 开发变得相对笨重,配置繁琐,开发效率低下,部署流程复杂,以及第三方集成难度也相对较大,针对该环境, Spring Boot 被开发出来,其使用“习惯大于配置目标” ,借助 Spring Boot 能够让项目快速运行起来,同时借助 Spring Boot 可以快速创建 web 应用并独立进行部署(jar 包 war 包方式,内嵌 servlet 容器),同时借助 SpringBoot 在开发应用时可以不用或很少去进行相关 xml 环境配置,简化了开发,大大提高项目开发效率。
3.2 Spring Boot 特点
创建独立 Spring 应用程序、 嵌入式 Tomcat, Jetty 容器、 无需部署 WAR 包、简化 Maven 及 Gradle 配置、 尽可能的自动化配置 Spring、 直接植入产品环境下的实用功能,比如度量指标、健康检查及扩展配置、 无需代码生成及 XML 配置等Spring Boot 不止对 web 应用程序做了简化,还提供一系列的依赖包来把其它一些工作做成开箱即用。
3.3Spring Boot快速上手
环境:JDK1.8,Spring Boot1.5.x, idea ,maven
1) 设置Spring Boot的parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
说明: Spring boot 的项目必须要将 parent 设置为 spring boot 的 parent,该 parent 包含了大量默认的配置, 简化程序的开发。
2)导入Spring Boot的web支持
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3)添加Spring Boot的插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
4)添加Controller
@Controller
public class HelloController {
@RequestMapping("hello")
@ResponseBody
public String hello(){
return "hello Spring Boot";
}
}
5)启动程序
在Controller层所在包下创建StarterApplication.java
@SpringBootApplication
public class StarterApplication{
public static void main(String[] args) {
SpringApplication.run(Starter.class);
}
}
启动测试,直接运行 main 方法即可 通过浏览器访问资源
4 Spring Boot核心
4.1 入口类与@SpringBootApplication注解
@SpringBootApplication 注解是 Spring Boot 的核心注解,它其实是一个组合注解 从源码定义来看, SpringBootApplication 注解组合了@SpringBootConfiguration 、 @EnableAutoConfiguration 、 @ComponentScan注解
@SpringBootConfiguratio也是一个组合注解,组合了@Configuration 注解,对于 SpringBoot 应用, @SpringBootConfiguration 注解属于 Boot 项目的配置注解也是属于一个组合注解, Spring Boot 项目中推荐使用@SpringBootConfiguration 注解,因为其包含了@Configuration 注解!!!
@EnableAutoConfiguration注解组合了@AutoConfigurationPackage、 @Import注解,使用该注解,代表 Spring Boot 应用在启动后默认启用自动配置,比如项目中引入了 SpringMvc 环境,需要加入 @EnableMvc 注解,如果声明该@EnableAutoConfiguration,启用过程由应用程序自动配置,我们仅需要引入相关依赖即可达到目的。
@ComponentScan 组件扫描注解, 如果没有进行配置,默认扫描@SpringBootApplication 所在类的同级目录以
及所在子目录!
4.2Spring Boot配置文件
Spring Boot 默认会读取全局配置文件,文件名为 application.properties或 application.yml 文件,放置在 src/main/resources 目录或类路径 config下, 由于开发中以 properties 配置文件为主, 这里配置以 proerties 文件为主
讲解,yml 文件属于 spring boot 引入的一种新的配置文件,具有面向对象特性。
在 resources 资源目录下添加 application.properties 文件配置信息如下:
## 项目启动端口号配置
server.port=8989
## 项目访问上下文路径
server.servlet-path=/mvc
## 日志信息打印配置
logging.pattern.level=debug
logging.pattern.console=%d [%t] %-5p [%c] - %m%n
## jdbc 连接数据库 基本配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/hr?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
4.3 Starter pom
通过使用 Spring Boot ,简化了企业级开发大部分场景的 start pom 只要使用的相应场景的start pom ,对于相关配置就可以消除 ,通过 Spring Boot 就可以得到自动配置的 Bean,相关 start pom 如下
https://blog.csdn.net/csdnluolei/article/details/83409535
4.4 xml配置
Spring Boot 中项目提倡零配置, 但在实际项目中,可能有一些特殊要求需要提供相关xml 配置文件来简化项目开发,此时可以通过 Spring 中提供的@ImportResource 注解来加载配置文件。
@SpringBootApplication
@ImportResource({"classpath:test01.xml","classpath:test02.xml"})
5 项目打包部署
打包命令
clean compile package -Dmaven.test.skip=true
6 Spring Boot 中拦截器、消息转换器、文件上传的配置
6.1拦截器配置
在 SpringMvc 应用中通过定义拦截器,可以实现对应用中指定资源进行访问控 制 目 的 ( 用 户 非 法 资 源 请 求 拦 截 等 操 作 ) , 实 现 方 式 可 以 通 过 继 承HandlerInterceptorAdptor 或者实现 HandlerInterceptor 接口 并在 xml 中进行配置来生效拦截器。 同样道理,在 Spring Boot 应用中拦截器实现同样也是继承 HandlerInterceptorAdptor 或实现 HandlerInterceptor 接口方式,生效时将对应 Bean 加入配置项中即可!
LoginInterceptor 代码准备
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse
response, Object handler) throws Exception {
System.out.println("拦截器方法被执行。 。。 ");
return true;
}
}
配置拦截器生效
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter{
// 配置登录拦截器 bean
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
// 重写拦截器添加方法 将登录拦截器加入 mvc 环境
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 指定拦截资源 与放行资源
registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePa
thPatterns("/login","/exit");
}
}
6.2 消息转换器配置
设置消息编码格式为 utf-8
@Bean
public StringHttpMessageConverter stringHttpMessageConverter(){
return new StringHttpMessageConverter(Charset.forName("utf-8"));
}
6.3 文件上传配置
文件上传 UploadController 代码添加
@Controller
public class UploadController {
@RequestMapping("uploadFile")
public ModelAndView uploadFile(HttpServletRequest request){
ModelAndView mv=new ModelAndView("result");
MultipartHttpServletRequest mhsr=(MultipartHttpServletRequest)request;
MultipartFile mf= mhsr.getFile("file");
try {
if(null!=mf&&!mf.isEmpty()){
Stringpath=request.getSession().getServletContext().getRealPath("/WEBINF/upload");
String fileName= mf.getOriginalFilename();
File file=new File(path,fileName);
mf.transferTo(file);
mv.addObject("msg", "文件上传成功!");
}
} catch (Exception e) {
e.printStackTrace();
mv.addObject("msg", "文件上传失败!");
}
return mv;
}
}
文件上传全局配置
## 文件上传配置
spring.http.multipart.maxFileSize=10Mb