SpringBoot微服务框架简单学习

1、Spring boot 简介

1.spring Boot是什么?

  • Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

2.spring Boot能做什么?

  • spirng Boot是对spring的一个封装,所以spring能做的他都能做

3.springBoot理念:

  • 习惯优于配置,基于我们的习惯,他给我们做了很多默认配置

4.核心功能:

  • 1.独立运行的Spring项目:他可以以jar包的形式独立运行
  • 2.内嵌Servlet容器:这样就无须以war包形式运行
  • 3.提供Starter简化Maven配置:相当于基于项目版本,再将我们需要的架包整合
  • 4.自动配置Spring:我们就不需要写Spring和SpringMVC的配置

5.spring配置方式

  • 1.xml配置:spring 1.x时代
  • 2.注解配置:spring 2.x时代。最终选择应用的基本配置(如数据库配置)用xml配置,业务配置用注解配置
  • 3.Java配置:spring 3.x到现在,spring提供了Java配置的能力,spring 4.x和spring boot都推荐使用Java配置
    • @Configuration注解 用在类上, 声明当前类是一个配置类,相当于xml文件。
    • @Bean注解 用在方法上,声明当前方法的返回值为一个bean

1.1 hello world

在介绍spring boot 之前,我们完成一个hello world,然后再来介绍

第一步:pom.xml中配置依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.hqyj</groupId>
  <artifactId>1809_springboot</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <!-- 父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
    </parent>

   <dependencies>
   
   <!-- spring boot 核心依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

<!-- 模板依赖,前端依赖 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

</dependencies>
  <build>
    <plugins>
		<plugin>
			<!-- spring打成war包所需要的插件 -->
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				
			</plugin>
		</plugins>
	</build>
  
  
  
</project>

第二步:创建一个MyMain.java类,代码如下:

//@SpringBootApplication springboot核心注解   搭建了IOC和AOP  
@SpringBootApplication
//@Configuration指的是当前类是一个配置类
@Configuration
//扫描
@ComponentScan(basePackages="com.hqyj.springboot")
public class MyMain {
    public static void main(String[] args) {
        SpringApplication.run(MyMain.class, args);
    }

}

第三步:创建控制器Hello.java 代码如下:

@Controller
public class Hello {
    
    @RequestMapping("hello")
    @ResponseBody
    public String test(){
        return "hello world!";
    }
}

第四步:运行程序,在MyMain.java中,运行RunAs---->java application。

在浏览器输入地址:http://localhost:8080/hello 访问

在这里插入图片描述


1.2 spring boot简介

1.介绍

微服务架构
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。
该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

2.spring boot优缺点

优点:

去除了大量的xml配置文件
简化复杂的依赖管理
快速启动容器
极大的提高了开发、部署效率。

缺点:

在改造以往的ssm和ssh项目起来很麻烦
侧重于做微服务,在做大型项目没有ssm和ssh项目好
全部采用注解配置,对底层实现难以理解

1.3入口类和@SpringBootApplication

Spring Boot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的Java应用程序的入口方法。
1、@SpringBootApplication:Spring Boot项目的核心注解,
主要目的是开启自动配置。

2、@Configuration:这是一个配置Spring的配置类;

1.4 spring boot依赖说明

这是spring boot 核心依赖配置

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
    </parent>
   <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
</dependency>

这是配置访问html页面所依赖的包

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

spring boot编译插件,才可以使用Java -jar命令来启动jar包,并且有了这个插件,
打的包里面才会有maven依赖的jar包和spring boot的启动类,所以打的jar包也就比较大,
而且MANIFEST.MF文件里面也会有启动类的信息。但是如果不加这个插件,则打的包里面就只有class文件,

<build>
    <plugins>
		<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

2、如何访问前端页面

Spingboot官方建议不用jsp作为前端页面,采用的是模板页面或者用html来写,实现前后端分离。
在src/main/resources下面定义文件夹templates,在其下面写一个login.html.如图

注意: templates 是文件名不能更改,这是
Spring boot默认的前端页面访问路径

在这里插入图片描述
当然你也可以在templates下面创建自定义的文件夹,如图:

在这里插入图片描述

下面我们来看下控制层代码,控制层的写法和一起spring mvc写法一样,如果有上一级文件夹,就把文件夹名加上

在这里插入图片描述


3、配置静态资源访问

要访问js,css.图片等等这些资源,springboot默认的路径是static,如图:

在这里插入图片描述

在页面引入的写法,如图:

在这里插入图片描述


4 application.properties文件介绍

这个文件是springboot的全局配置文件
需要注意的是这个文件名是固定,不能更改,所以不要写错文件名,不然,你想要的需求实现不了的哦,比如tomcat的端口号更改等等

下面一些常用的配置,如下:

在这里插入图片描述

#修改内置tomcat的访问端口
server.port=8080
#修改访问路径
server.servlet-path=*.do
#配置日志文件路径
logging.file=D:/mylog/log.log
#配置日志文件级别
logging.level.org.springframework.web=DEBUG
#这是是设置spring mvc编码过滤器的设置,默认是UTF-8。
spring.http.encoding.charset=UTF-8

4.1 读取全局属性配置文件的值

我们在全局属性配置文件里任意设置一个键值对的值:author=wj,然后我们入口类把它读取出来,入口类代码如图下
@SpringBootApplication
//配置扫描
@ComponentScan(basePackages = "com")
//引入数据源类
@Import(MyDataSource.class)
@Controller
public class MyMain {
	@Value("${author}")
	private String author;

    @RequestMapping("/")
    @ResponseBody
    public String wel(){
        return "你好:"+author;
    }
    public static void main(String[] args) {
        SpringApplication.run(MyMain.class, args);
    }

}

4.2 读取自定义properties文件

我们还可以自定义propoteis文件的值,然后读取它,操作如下

定义一个jdbc.properties文件,内容如下

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
username=root
password=1234

修改入口类:如下

@SpringBootApplication
//配置扫描
@ComponentScan(basePackages = "com")
//引入数据源类
@Import(MyDataSource.class)
@PropertySource(value={"classpath:jdbc.properties"})
@Controller
public class MyMain {

    @Value("${url}")
    private String url;

    @Value("${driver}")
    private String driver;

    @Value("${username}")
    private String username;

    @Value("${password}")
    private String password;

	
    @RequestMapping("/")
    @ResponseBody
    public String wel(){
    	String info = "数据库驱动:"+driver
    				 +"数据库地址:"+url
    				 +"用户名:"+username
    				 +"密码:"+password;
        return info;
    }
    public static void main(String[] args) {
        SpringApplication.run(MyMain.class, args);
    }

}

运行下看看吧


5、springboot整合mybatis

第一步:导入依赖:如下

<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.2.2</version>
		</dependency>
			<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.1</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.3.1</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.30</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
		</dependency>

第二步:用generatorConfig.xml文件把pojo类,sql映射文件,dao层接口统统生成,这一点在ssm里讲过
在这里没什么区别。

第三步:把sql映射文件和mybatis.xml放在src/main/resources目录下面,如图

在这里插入图片描述

Sql映射文件不说了,就是generatorConfig生成的文件不需要改动,mybaits.xml文件内容如下;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	
</configuration>

第四步:编写spring boot整合 mybatis的数据配置类,新建一个java类MyDataSource.java,内容如下(就是把以前xml需要引入的bean和需要配置的属性使用Java代码的形式去实现)

package com.hqyj.springboot.cfg;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.tomcat.util.descriptor.web.ResourceBase;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

@Configuration
public class MyBatis {
	   //用来装载mybatis的映射文件
	   private static Resource[] mapperFiles;
	   //用来装载mybatis的主配置文件
	   private static Resource mybatisConfg;

	
	
	/**
	 * 
	 * <p>
	 * 	配置数据源
	 * </p>
	 * @author HC
	 * @Date 2018年12月10日
	 * @return
	 */

	@Bean(name= {"dataSource"})
	public DataSource getDataSource() {
		BasicDataSource df = new BasicDataSource();
		df.setDriverClassName("com.mysql.jdbc.Driver");
		df.setUrl("jdbc:mysql://localhost:3306/1809_email?characterEncoding=utf-8&useSSL=false");
		df.setUsername("root");
		df.setPassword("963521");
		return df;
	}
	
	/**
	 * 
	 * <p>
	 * 	配置SqlSessionFactory
	 * </p>
	 * @author HC
	 * @Date 2018年12月10日
	 * @return
	 */
	@Bean(name= {"sqlSessionFactoryBean"})
	public SqlSessionFactoryBean getSqlSessionFactoryBean(@Qualifier("dataSource") DataSource dataSource) {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(dataSource);
		//加载主配置文件
		bean.setConfigLocation(MyBatis.mybatisConfg);
		//加载mybatis映射文件
		bean.setMapperLocations(MyBatis.mapperFiles);
		
		return bean;
		
		
	}
	
	/**
	 * 
	 * <p>
	 * 	配置数据层扫描
	 * </p>
	 * @author HC
	 * @Date 2018年12月10日
	 * @return
	 */
	@Bean
	public MapperScannerConfigurer getMapperScannerConfigurer() {
		MapperScannerConfigurer msc = new MapperScannerConfigurer();
		msc.setBasePackage("com.hqyj.springboot.dao");
		msc.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");
		return msc;
	}
	
	
	
	 /**
     * 	读取mybatis的配置文件
     */
    static {
    	ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    	MyBatis.mapperFiles = new Resource[] { 
        		resolver.getResource("classpath:mapper/userMapper.xml")
        		};
    	//加载mybatis 主配置文件
    	MyBatis.mybatisConfg = resolver.getResource("classpath:mybatis.xml");
    }

}

第五步: 完成一个crud应用,测试下项目是否可行


6、整合shiro权限框架

1、引入依赖

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.2.2</version>
</dependency>

2、编写shiro配置类

package com.hqyj.springboot.cfg;

import java.util.LinkedHashMap;

import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.hqyj.springboot.shiro.MyRealm;

@Configuration
public class ShiroConfig {

	/**
	 * 
	 * <p>
	 * 	自定义权限登录器
	 * </p>
	 * @author HC
	 * @Date 2018年12月10日
	 * @return
	 */
	@Bean(value= {"MyRealm"})
	public MyRealm getMyRealm() {
		MyRealm myrealm = new MyRealm();
		return myrealm;
	}
	
	/**
	 * 
	 * <p>
	 * 	配置会话管理器
	 * </p>
	 * @author HC
	 * @Date 2018年12月10日
	 * @param myRealm
	 * @return
	 */
	
	@Bean(value= {"SecurityManager"})
	public DefaultWebSecurityManager getSecurityManager(@Qualifier("MyRealm")MyRealm myRealm) {
		DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
		manager.setRealm(getMyRealm());
		return manager;
	}
	
	
	/**
	 * 
	 * <p>
	 * 	设置权限访问
	 * </p>
	 * @author HC
	 * @Date 2018年12月10日
	 * @param securityManager
	 * @return
	 */
	@Bean(value= {"ShiroFilter"})
	public ShiroFilterFactoryBean getShiroFilter(@Qualifier("SecurityManager")DefaultWebSecurityManager securityManager) {
		ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
		shiroFilter.setSecurityManager(securityManager);
		
		//设置访问认证权限,使用map键值对
		LinkedHashMap<String, String> map = new LinkedHashMap<>();
		map.put("/hello", "anon");
		map.put("/**","authc");
		shiroFilter.setFilterChainDefinitionMap(map);
		return shiroFilter;
	}
	
	/**
	 * 
	 * <p>
	 * 	配置shiro声明周期
	 * </p>
	 * @author HC
	 * @Date 2018年12月10日
	 * @return
	 */
	@Bean(value= {"lifecycleBeanPostProcessor"})
	public LifecycleBeanPostProcessor getLifecycleBean() {
		LifecycleBeanPostProcessor lifecycleBean = new LifecycleBeanPostProcessor();
		return lifecycleBean;
	}
	
	
	 //加入注解的使用,不加入这个注解不生效
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("SecurityManager")DefaultWebSecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }
	
	
}


7、设置事务管理

在Spring Boot中推荐使用@Transactional注解来申明事务。

首先需要导入依赖:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

当引入jdbc依赖之后,Spring Boot会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager,所以我们不需要任何额外配置就可以用@Transactional注解进行事务的使用。

在Service中添加@Transactional注解:

在这里插入图片描述

补充(使用springboot时在HTML页面取值)

1. 要进行动态处理的元素将使用“th:”为前缀

2. 通过“@{}”引用静态Web资源

3. 读取数据支持EL表达式的写法:${}

要使用th:标签,那么就要加上th的命名空间

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">

取出String类型或基本数据类型的值

  • 在Controller中装入数据
@RequestMapping("getString")
	//这里的HttpServletRequest request   使用Map也行
public String getString(HttpServletRequest request) {
	request.setAttribute("name", "王二");
	request.setAttribute("age", 31);
	return "data";
}
  • 在data.html中取出值,注意:
    • 1. 这组标签是可以随便取名字的
    • 2.就算标签里面原来有值,也会被th标签的值替换掉,所以第三个数据显示的是“王二”,而不是哈哈哈哈
<body>	
	取出session中的字符串:<span th:text="${name}"></span><br />
	取出session中的基本数据类型:<span th:text="${age}"></span><br/>
	能直接取出么:<lzl th:text="${name}">哈哈哈哈哈</lzl>
</body>

取出javabean中的值

  • 在Controller中装入数据
@RequestMapping("getJavaBean")
public String getJavaBean(HttpServletRequest request) {
	request.setAttribute("stu", new Stu("大王", 37, "男"));
	return "javaBeanData";
}
  • 在javaBeanData.html中取出值
<body>
    取出session中的JavaBean:<span th:text="'姓名:'+${stu.name}"></span><br />
	<span th:text="${stu.age}"></span><br />
	<span th:text="${stu.sex}"></span><br />
	<div th:object="${stu}">
		姓名:<input  type="text" th:value="${stu.name}"/><br />
		年龄:<input type="text" th:value="*{age}" /><br />
		性别:<input type="text" th:value="*{sex}" /><br />
	</div>
</body>

取出List中的值

  • 在Controller中装入数据
@RequestMapping("getListString")
public String getListString(HttpServletRequest request){
	List<String> list = new ArrayList<>();
	list.add("大王");
	list.add("小王");
	request.setAttribute("list", list);
	
	List<Integer> list2 = new ArrayList<>();
	list2.add(37);
	list2.add(31);
	request.setAttribute("list2", list2);
	return "listStringData";
}
  • 在listStringData.html中取出数据,注意这有个新标签 th:each=“元素:集合”
<body>
    取出requset中的List数据:
	<div th:each="str:${list}">
		<span th:text="${str}"></span><br />
	</div>
	<div th:each="num:${list2}">
		<span th:text="${num}"></span><br />
	</div>
</body>

取出List中的数据

  • 在Controller中装入数据
@RequestMapping("getJavaBeanList")
public String getJavaBeanList(HttpServletRequest request){
	List<Stu> list = new ArrayList<>();
	list.add(new Stu("大王", 37, "男"));
	list.add(new Stu("小王", 31, "男"));
	request.setAttribute("list", list);
	return "listJavaBeanData";
}
  • 在listJavaBeanData中取出数据,注意这th:if=""标签的使用
<body>
	<div th:if="${list} != null">
		有数据我就我进来了<br>
		<div th:each="stu:${list}">
			<span th:text="${stu.name}"></span><br />
			<span th:text="${stu.age}"></span><br />
			<span th:text="${stu.sex}"></span><br />
		</div>
	</div>
</body>

取出Map<k, v>中的数据

  • 在Controller中装入数据
@RequestMapping("getStringMap")
public String getStringMap(HttpServletRequest request){
	Map<String, String> strMap = new HashMap<>();
	strMap.put("name", "大王");
	strMap.put("sex", "男");
	request.setAttribute("strMap", strMap);
	return "getStringMapData";
}
  • 在getStringMapData.html中取出数据
<body>
	<div th:each="map:${strMap}">
		<span th:text="${map.key}"></span>:<span th:text="${map.value}"></span><br />
	</div>
</body>

取出Map<k, javabean>中的数据

  • 在Controller中装入数据
@RequestMapping("getJavaBeanMap")
public String getJavaBeanMap(HttpServletRequest request) {
	Map<Integer, Stu> stuMap = new HashMap<>();
	stuMap.put(1, new Stu("大王", 37, "男"));
	stuMap.put(2, new Stu("小王", 31, "男"));
	request.setAttribute("stuMap", stuMap);
	return "getJavaBeanMapData";
}
  • 在getJavaBeanMapData.html中取出数据

<body>
	<div th:each="map:${stuMap}">
		<span th:text="${map.key}"></span>:<span th:text="'  ' + ${map.value.name} + '  ' + ${map.value.age} + '  ' + ${map.value.sex}"></span>
	</div>
</body>

thymeleaf默认是到requset中取值,那如果值是在session和servletContext中呢,其实取的方式都一样,只不过要在前面加上session.或者application.

将数据装入session有2种方式:

  • 1.使用@SeesionAttributes注解
@Controller
@SessionAttributes({"name", "age"})
public class SessionController {
	@RequestMapping("getSessionData1")
	public ModelAndView sessionData1() {
		ModelAndView mView = new ModelAndView();
		mView.addObject("name", "大王");
		mView.addObject("age", 18);
		mView.setViewName("sessionData");
		return mView;
	}
}
  • 2.使用session参数
@RequestMapping("getSessionData2")
public String sessionData2(HttpSession session) {
	session.setAttribute("name", "小王");
	session.setAttribute("age", 20);
	return "sessionData";
}
  • 3.取出数据
<body>
	session中取出的值:<span th:text="${session.name}"></span><br>
	session中取出的值:<span th:text="${session.age}"></span><br>
	能在默认的request中取到值么?<span th:text="${name}"></span><br>
</body>
方式 区别
注解方式 不写session和写了都能取出值
使用session参数 必须写session.才能取出值

将数据装入servletContext中,获得servletContext对象有2种方式:

  • 1.通过request或者session获取
ServletContext servletContext = session.getServletContext();
  • 2.通过注解方式获得
@Autowired
private ServletContext servletContext;
servletContext.setAttribute("sex", "男");
servletContext中取出的值:<span th:text="${application.sex}"></span>

使用Ajax和在jsp中使用Ajax大部分显示一致

  • 只不过在JS中取得对象的值应该用[[${表达式}]]来获取

th标签

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38846837/article/details/84944617