1springboot主启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MySpringbootApplication
{
public static void main(String[] args)
{
//spring项目默认主启动类
SpringApplication.run(MySpringbootApplication.class, args);
}
}
@SpringBootApplication 是一个复合注解,把 @SpringBootApplication 看作是 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合。根据 SpringBoot 官网,这三个注解的作用分别是:
1@SpringBootConfiguration
Spring配置类,标注在某个类上,表示这是一个SpringBoot的配置类
@Configuration : 说明这是一个配置类 ,配置类就是对应Spring的xml 配置文件,比如beans.xml,application.xml文件
2@ComponentScan
: 这个注解在Spring中很重要 ,它对应XML配置中的元素,扫码当前主启动类同级的包,自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到ioc容器中
我们介绍了2种注册bean的方式:1xml中配置bean 2使用注解方式配置bean,比如
Service,@Controller,@Repostory
为了更加简化bean的配置,springboot提出了@ComponentScan的方法
value:指定需要扫描的包,如:com.example.org
basePackages:作用同value;value和basePackages不能同时存在设置,可二选一
basePackageClasses:指定一些类,spring容器会扫描这些类所在的包及其子包中的类
nameGenerator:自定义bean名称生成器
resourcePattern:需要扫描包中的那些资源,默认是:**/*.class,即会扫描指定包中所有的class文件
useDefaultFilters:对扫描的类是否启用默认过滤器,默认为true
includeFilters:过滤器:用来配置被扫描出来的那些类会被作为组件注册到容器中
excludeFilters:过滤器,和includeFilters作用刚好相反,用来对扫描的类进行排除的,被排除的类不会被注册到容器中
lazyInit:是否延迟初始化被注册的bean
3@EnableAutoConfiguration
开启自动配置功能
注解没有实际作用,但他导入了AutoConfigurationImportSelector.class
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered
AutoConfigurationImportSelector实现了DeferredImportSelector
public interface DeferredImportSelector extends ImportSelector
DeferredImportSelector继承了ImportSelector,
可以看出,AutoConfigurationImportSelector 类实现了 ImportSelector 接口,也就实现了这个接口中的 selectImports 方法,该方法主要用于获取所有符合条件的类的全限定类名,需要为这些类创建对象并加载到 IoC 容器中。这个类就会读取SpringBoot提前写好的所有配置类,读取的关键是通过读取MEAT-INF/spring.factories文件写好的所有配置类。
@Import 注解介绍
从上面 @EnableAutoConfiguration 注解的源码可知,@Import(AutoConfigurationImportSelector.class) 也是@EnableAutoConfiguration 注解的组成部分,这也是自动配置功能的核心实现者。
@Import 注解位于 spring-context 项目内,主要提供导入配置类的功能
2热部署
1定义:
热部署(Hot Deployment)指的是在应用程序正在运行的情况下,对其进行更新或修改并将这些变更应用到正在运行的应用程序中的过程。通常情况下,传统的部署方式需要停止应用程序、部署更新,然后重新启动应用程序才能使更新生效。而热部署则允许在无需停止应用程序的情况下,即时地更新代码、配置文件或资源,从而提高了开发和部署的效率
用途:我们希望在我们更改代码后,不需要进行重启tomcat就可以实现更改后的代码效果.
2使用
1在pom.xml中添加依赖,刷新maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
2勾选自动构建项目,允许自动make启动
3SpringDataJPA
1定义:
JPA(Java Persistence API, Java 持久化API)是SUN公司提出的Java持久化规范,它提供了一种对象/关系映射的管理工具来管理Java中的关系型数据库。JPA的主要目的是简化现有的持久化开发工作并且整合ORM框架,JPA本身并不是ORM框架,它是一种规范,这种规范可以私下通过注解或者XML描述“对象-关系表”之间的映射关系,并将实体对象持久化到数据库中,从而极大地简化现有的持久化开发工作。
2使用
1导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2配置数据源
server:
port: 8080
servlet:
context-path: /
spring:
datasource:com.mysql.jdbc.Driver
url:jdbc:mysql://localhost:3306/mybatis
username: root
password: xuyinuo666
jpa:
database: MySQL
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
show-sql: true
hibernate:
ddl-auto: update
3创建实体类
@Entity//告诉程序是实体类
@Table(name = "user")//实体类对应的表名
public class User
{
@Id//主键标识
@GeneratedValue(generator = GenerationType.IDENTITY)//主键生成策略
private String id;
@Column(name = "username", unique = true, nullable = false, length = 255)
//name:被标注字段在数据库中所对应字段名称,unique:是否为唯一标识,nullable:是否可以为空
//length:字段长度
private String username;
@Column(name = "password", nullable = false, length = 255)
private String password;
}
4编写持久层接口
要求JpaRepository,JpaRepository中定义了CRUD方法
这是JpaRepository源码
定义一个接口继承JpaRepository
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
}
1查询操作
根据id查询单个信息
@Test
public void testFindById()
{
User user = userRepository.findById(2).get();//根据id进行查询
System.out.println(user.getusername());
}
查询所有信息
@Test
public void testFindAll()
{
List<User> users = userRepository.findAll();
for(User user :users)
{
System.out.println(user.getusername());
}
}
2增加操作
@Test
public void testSave()
{
User user = new User(1, "laoda", 1654596);
userRepository.save(user);
}
3更改操作
@Test
public void testUpdate()
{
User user = userRepository.findById(1).get();
user.setusername("lisi");
userRepository.save(user);
}
4删除操作
@Test
public void testDeleteById()
{
userRepository.deleteById(1);//根据id删除一个
}
4Sa-token
1定义:
Sa-token是一个 Java 权限认证框架,主要解决:登录认证
、权限认证
、Session会话
、单点登录
、OAuth2.0
、微服务网关鉴权
等一系列权限相关问题。
2satoken使用
1导入依赖
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.28.0</version>
</dependency>
2配置文件
server:
port: 8001
sa-token:
token-name: xc_satoken
timeout: 2592000
activity-timeout: -1
#是否允许同一账号并发登录
is-concurrent: true
#多人登录是否共用一个token
is-share: false
token-style: uuid
is-log: false
3编写Controller
package com.xc.satoken.controller;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@PostMapping("/login")
public String login(String username,String password)
{
//模拟登录校验
if(username.equals("zhangsan") && password.equals("666"))
{
StpUtil.login(1001);//使用satoken进行登录
return "登陆成功";
}
return "登陆失败";
}
@GetMapping("/islogin")
public String test()
{
return "当前会话是否登录:" + StpUtil.isLogin();//使用satoken判断是否登录
}
}
3常用功能
1登录与注销
StpUtil.login(Object id); //登录
StpUtil.logout();//注销
StpUtil.isLogin();//判断是否登录
2权限认证
只需要创建一个实现StpInterface接口的类,重写getPermissionList
和getRoleList
两个方法,返回权限列表以及角色列表就可以,sa-token内部会自动判断接口所需的权限字符串或者角色字符串是否在返回的List中
@Component
public class StpInterfaceImpl implements StpInterface {
//获取用户的权限集合
@Override
public List<String> getPermissionList(Object loginId, String loginType)
{
List<String> list = new ArrayList<String>();
list.add("user.add");
list.add("user.delete");
list.add("user.update");
list.add("user.select");
return list;
}
//获取用户的角色集合
@Override
public List<String> getRoleList(Object loginId, String loginType)
{
List<String> list = new ArrayList<String>();
list.add("custom");
list.add("business");
return list;
}
}
StpUtil.hasPermission("user-update"); //判断是否有指定权限
StpUtil.checkPermission("user-update");
StpUtil.checkPermissionAnd("user-update", "user-delete");//判断是否具有所有权限
StpUtil.checkPermissionOr("user-update", "user-delete");
StpUtil.hasRole("business"); //判断是否有指定角色
StpUtil.checkRole("businessn");
StpUtil.checkRoleAnd("business", "custom"); //判断是否有多个指定角色
StpUtil.checkRoleOr("business", "custom");
3注销
StpUtil.logout(666); // 强制指定账号注销下线
StpUtil.logout(666, "PC"); // 强制指定账号指定端注销下线
StpUtil.logoutByTokenValue("token1"); // 强制指定 Token 注销下线