SpringBoot随手笔记

微信公众号:Java修炼手册
​关注可领取3T编程资料及面试题解。问题或建议,请公众号留言;
希望我的分享对你有所帮助

SpringBoot介绍

Spring Boot的主要优点:
    为所有Spring开发者更快的入门
    开箱即用,提供各种默认配置来简化项目配置
    内嵌式容器简化Web项目
    没有冗余代码生成和XML配置的要求

  SpringBoot访问静态文件

  所有的资源文件都应该在src/main/resources文件夹下面,但在SpringBoot中,系统默认扫描静态文件在static或者public文件夹下,默认扫描的配置文件是application.yml或者application.properties.

  SpringBoot异常捕获

  以前我们全局捕获异常得写切面去捕获,现在不用了,SpringBoot帮你封装好了,我们直接用就好了
  @ExceptionHandler 表示拦截异常
  @ControllerAdvice 是 controller 的一个辅助类,最常用的就是作为全局异常处理的切面类
  @ControllerAdvice 可以指定扫描范围
  @ControllerAdvice 约定了几种可行的返回值,如果是直接返回 model 类的话,使用@ResponseBody进行json转换

 1@ControllerAdvice
2public class GlobalExceptionHandler {
3
4  @ExceptionHandler(RuntimeException.class)
5  @ResponseBody
6  public Map<StringObject> exceptionHandler() {
7    Map<StringObject> map = new HashMap<StringObject>();
8    map.put("errorCode""404");
9    map.put("errorMsg""找不到页面了!");
10    return map;
11      }
12   }
13}
  SpringBoot集成Mybatis
    引入jar包
 1<dependency>
2  <groupId>org.mybatis.spring.boot</groupId>
3  <artifactId>mybatis-spring-boot-starter</artifactId>
4  <version>1.1.1</version>
5</dependency>
6<dependency>
7  <groupId>mysql</groupId>
8  <artifactId>mysql-connector-java</artifactId>
9  <version>5.1.21</version>
10</dependency>
    在application.properties中填写连接数据库相关的配置信息
1spring.datasource.url=jdbc:mysql://localhost:3306/springboot_demo
2spring.datasource.username=root
3spring.datasource.password=root
4#如果是mysql8会有所不同
5spring.datasource.driver-class-name=com.mysql.jdbc.Driver
6#mybatis.mapper-locations=classpath:mapper/*.xml

    如此简单的就可以编写代码访问你的数据库的数据了

  SpringBoot事务管理

  事物的四大特性(ACID):
    原子性:对于其数据修改,要么全都执行,要么全都不执行。
    一致性:事务在完成时,必须使所有的数据都保持一致状态。
    隔离性:由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
    持久性:事务完成之后,它对于系统的影响是永久性的。
    在SPringBoot中处理事务很简单,只需要一个注解,其他的SpringBoot自动帮我们实现,在方法上加上@Transactional注解,当方法执行出现错误,同一请求在他之前执行的对数据库的操作会进行回滚

  SpringBoot集成Shiro安全框架

    Apache Shiro是Java的一个安全框架。目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。对于它俩到底哪个好,这个不必纠结,能更简单的解决项目问题就好了。
Shiro有哪些功能:身份认证/登录,授权,会话管理,加密,Web支持。。。。
    记住这么一点,Shiro不会去维护用户、维护权限;这些需要我们自己去设计/提供;通过Realm让开发人员自己注入。
    引入jar包

 1<dependency>
2  <groupId>org.apache.shiro</groupId>
3  <artifactId>shiro-spring</artifactId>
4  <version>1.4.0</version>
5</dependency>
6<dependency>
7  <groupId>org.apache.shiro</groupId>
8  <artifactId>shiro-ehcache</artifactId>
9  <version>1.4.0</version>
10</dependency>

    然后在src/main/resources下新建一个关于shiro的缓存配置文件ehcache-shiro.xml

 1<?xml version="1.0" encoding="UTF-8"?>
2<ehcache updateCheck="false" name="cacheManagerConfigFile">
3<defaultCache  
4          maxElementsInMemory="10000"  
5          eternal="false"  
6          timeToIdleSeconds="120"  
7          timeToLiveSeconds="120"  
8          overflowToDisk="false"  
9          diskPersistent="false"  
10          diskExpiryThreadIntervalSeconds="120"
11          memoryStoreEvictionPolicy="LRU"/>

12 <cache name="shiro-activeSessionCache" 
13   eternal="false"  
14        maxElementsInMemory="10000"    
15        overflowToDisk="false"  
16        timeToIdleSeconds="0"  
17        timeToLiveSeconds="0"
18        statistics="true"/>
  
19</ehcache>

    然后新建一个Shiro的配置文件ShiroConfig并注解@Configuration,这个配置只不过把最初的spring-shiro.xml形式的配置文件转成了java文件,内容和xml形式完全一致

  1@Configuration
2public class ShiroConfiguration {
3    /**
4       * ShiroFilterFactoryBean 处理拦截资源文件问题。
5       * 注意:单独一个ShiroFilterFactoryBean配置是或报错的,以为在
6       * 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager
7       * Filter Chain定义说明 1、一个URL可以配置多个Filter,使用逗号分隔 2、当 
8         设置多个过滤器时,全部验证通过,才视为通过
9       * 3、部分过滤器可指定参数,如perms,roles
10    */

11    @Bean
12    public ShiroFilterFactoryBean shirFilter(org.apache.shiro.mgt.SecurityManager securityManager) {
13       ShiroFilterFactoryBean shiroFilterFactoryBean = new 
14       ShiroFilterFactoryBean();
15
16       // 必须设置 SecurityManager
17       shiroFilterFactoryBean.setSecurityManager(securityManager);
18
19       // 拦截器.
20       Map<String, String> filterChainDefinitionMap = new 
21       LinkedHashMap<String, String>();
22       //配置静态资源允许访问
23       filterChainDefinitionMap.put("/js/**","anon");
24       filterChainDefinitionMap.put("/css/**","anon");
25       filterChainDefinitionMap.put("/index","anon");
26       // <!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名 访问-->
27       filterChainDefinitionMap.put("/**""authc");
28       // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
29       shiroFilterFactoryBean.setLoginUrl("/login");
30       // 未授权界面;
31       shiroFilterFactoryBean.setUnauthorizedUrl("/403");
32       Map<String, Filter> filters=new HashMap<String,Filter>();
33       shiroFilterFactoryBean.setFilters(filters);
34 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefiniti 
35       onMap);
36       return shiroFilterFactoryBean;
37     }
38
39      @Bean
40      public EhCacheManager getEhCacheManager() {
41        EhCacheManager em = new EhCacheManager();
42        em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
43        return em;
44   }
45           // 开启Controller中的shiro注解
46      @Bean
47      public DefaultAdvisorAutoProxyCreator 
48          getDefaultAdvisorAutoProxyCreator() 
{
49        DefaultAdvisorAutoProxyCreator daap = new 
50        DefaultAdvisorAutoProxyCreator();
51        daap.setProxyTargetClass(true);
52        return daap;
53     }
54    /**
55       * 配置org.apache.shiro.web.session.mgt.DefaultWebSessionManager
56       * @return
57    */

58    @Bean
59    public DefaultWebSessionManager getDefaultWebSessionManager(){
60        DefaultWebSessionManager defaultWebSessionManager=new 
61        DefaultWebSessionManager();
62        defaultWebSessionManager.setSessionDAO(getMemorySessionDAO());
63        defaultWebSessionManager.setGlobalSessionTimeout(4200000);
64
65 defaultWebSessionManager.setSessionValidationSchedulerEnabled(true);
66       defaultWebSessionManager.setSessionIdCookieEnabled(true);
67       defaultWebSessionManager.setSessionIdCookie(getSimpleCookie());
68       return defaultWebSessionManager;
69     }
70    /**
71      * 配置org.apache.shiro.session.mgt.eis.MemorySessionDAO
72      * @return
73    */

74    @Bean
75      public MemorySessionDAO getMemorySessionDAO(){
76        MemorySessionDAO memorySessionDAO=new MemorySessionDAO();
77  memorySessionDAO.setSessionIdGenerator(javaUuidSessionIdGenerator());
78        return memorySessionDAO;
79    }
80    @Bean
81    public JavaUuidSessionIdGenerator javaUuidSessionIdGenerator(){
82        return new JavaUuidSessionIdGenerator();
83   }
84    /**
85      * session自定义cookie名 
86      * @return
87    */

88   @Bean
89     public SimpleCookie getSimpleCookie(){
90     SimpleCookie simpleCookie=new SimpleCookie();
91     simpleCookie.setName("security.session.id");
92     simpleCookie.setPath("/");
93      return simpleCookie;
94    }
95    @Bean
96    public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor(){
97    return new LifecycleBeanPostProcessor();
98  }
99  @Bean(name = "securityManager")
100  public DefaultWebSecurityManager getDefaultWebSecurityManager(UserRealm userRealm) {
101      DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
102      dwsm.setRealm(userRealm);
103      //  <!-- 用户授权/认证信息Cache, 采用EhCache 缓存 --> 
104      dwsm.setCacheManager(getEhCacheManager());
105      m.setSessionManager(getDefaultWebSessionManager());
106      return dwsm;
107    }
108    @Bean
109    public UserRealm userRealm(EhCacheManager cacheManager) {
110    UserRealm userRealm = new UserRealm();
111    userRealm.setCacheManager(cacheManager);
112    return userRealm;
113  }
114  /**
115    * 开启shrio注解支持
116    * @param userRealm
117    * @return
118  */

119  @Bean
120  public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(UserRealm userRealm){
121    AuthorizationAttributeSourceAdvisor aasa=new 
122    AuthorizationAttributeSourceAdvisor();
123    aasa.setSecurityManager(getDefaultWebSecurityManager(userRealm));
124    return aasa;
125  }
126}

    然后写一个UserRealm做登录权限控制:

 1public class UserRealm extends AuthorizingRealm {
2   @Override
3   protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
4   // 这里做权限控制
5   return null;
6   }
7    @Override
8    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws 
9    AuthenticationException 
{
10    // 这里做登录控制
11    return null;
12   }
13}

    基本上shiro的集成使用就到这里了,着重的要集成shiro到SpringBooot里面去。完全不会shiro的请自行查看资料学习基础

  SpringBoot使用AOP统一处理请求日志

    这里就提到了Spring当中的AOP,也就是面向切面编程,使用AOP对所有请求进行一个统一处理。首先在pom.xml中引入aop的jar包

1<dependency>
2   <groupId>org.springframework.boot</groupId>
3   <artifactId>spring-boot-starter-aop</artifactId>
4</dependency>

    然后新建一个Aspect去对所有Controller进行一个日志拦截。在SPringBoot中使用AOP也是很简单的,只需要在类上加上一个@Aspect的注解就好了,然后通过@Component注入到Spring容器中去。
新建一个包com.test.log专门用来放日志记录,代码如下:

 1@Aspect
2@Component
3@Slf4j
4public class MjxyLogAspect {
5    @Pointcut("execution(public * com.test.controller..*.*(..))")
6    public void webLog() {
7  }
8    @Before("webLog()")
9    public void doBefore(JoinPoint joinPoint) throws Throwable {
10      // 接收到请求,记录请求内容
11      ServletRequestAttributes attributes = (ServletRequestAttributes) 
12      RequestContextHolder.getRequestAttributes();
13      HttpServletRequest request = attributes.getRequest();
14      // 记录下请求内容
15      log.info("URL : " + request.getRequestURL().toString());
16      log.info("HTTP_METHOD : " + request.getMethod());
17      log.info("IP : " + request.getRemoteAddr());
18      Enumeration<String> enu = request.getParameterNames();
19      while (enu.hasMoreElements()) {
20        String name = (String) enu.nextElement();
21        log.info("name:{},value:{}", name, request.getParameter(name));
22     }
23   }
24     @AfterReturning(returning = "ret", pointcut = "webLog()")
25     public void doAfterReturning(Object ret) throws Throwable {
26         // 处理完请求,返回内容
27         log.info("RESPONSE : " + ret);
28   }
29}
  SpringBoot定时任务@Scheduled

  在方法上使用此注解即可
  在启动器上使用@EnableScheduling开启定时器,非常简单
这里就不一一介绍了,可以领取资料完成学习。

=================================================== 包括但不限于:分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货面试题集,简历模板等三千多G资料包,关注回复DD无套路免费领取,助您从0到1 ![在这里插入图片描述](https://img-blog.csdnimg.cn/202004111250121.png#pic_center)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值