springboot

1、自定义配置

     A、单一属性配置  @Value("${username}") 

                  private String username;

   B、实体类封装

      @ConfigurationProperties(prefix = "stu")

     @Component  ----以上为实体类。 可能pom种需要加入配置处理器依赖
      @Autowired
      private Student student;
2、JSP支持
springboot默认不支持JSP。
如使用,需要在Pom中引入 JSP依赖。
<!--引入Spring Boot内嵌的Tomcat对JSP的解析包,不加解析不了jsp页面-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
        <!-- servlet依赖的jar包start ,可选-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
        <!-- servlet依赖的jar包start -->

        <!-- jsp依赖jar包start ,可选-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <!-- jsp依赖jar包end -->

        <!--jstl标签依赖的jar包start ,可选-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <!--jstl标签依赖的jar包end -->
View Code

      并添加Bulid得resource

3、Mybtais

      MySql默认驱动包版本为8.0.20.正常情况下使用得版本为5...建议<version>5.1.46</version>

    

<!--SpringBoot 2.3.0 默认的MySQL驱动包版本是8.0.20这个版本对应的是MySQL8
             而我们使用MySQL版本是5.7.18,所以建议修改驱动包版本问5.1.46
             否则对时间类型操作时会出现时区的错误,需要连接数据时指定时区
         -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>5.1.46</version>
        </dependency>
View Code

     逆向工程插件及mapperxml编译。

  

<!--添加MyBatis逆向工程插件,这个插件会自动帮我们生成表所对应的实体,以及对应的SQL映射文件
                 以及SQL映射接口
             -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <!--配置文件的位置-->
                    <configurationFile>GeneratorMapper.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>
        </plugins>

        <resources>
            <!--通知Maven将SQL映射文件进行编译,否则SQL映射文件是不会被编译打包的 -->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
View Code

 

  JSP编译支持

 <!--通知Maven将某个目录下的文件进行编译,否则我们的jsp是不会被编译的 -->
            <resource>
                <!--源文件位置-->
                <directory>src/main/webapp</directory>
                <!--编译到META-INF/resources,该目录不能随便写-->
                <targetPath>META-INF/resources</targetPath>
                <includes>
                    <!--要把哪些文件编译过去,**表示webapp目录及子目录,*.*表示所有-->
                    <include>**/*.*</include>
                </includes>
            </resource>
View Code

    mybatis配置信息

#配置数据库的链接信息
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#指定MySQL的链接地址 ?表示连接时的参数,我们的这个参数用于指定编码格式否则链接Linux中的MySQL时容易导致中文乱码
spring.datasource.url=jdbc:mysql://192.168.188.128:3306/springboot?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
View Code

 可在主函数上添加包扫描 @MapperScan("com.bjpowernode.springboot.mapper") 或者直接在mapper文件上使用注解@Mapper

事务:主函数激活事务支持  @EnableTransactionManagement         方法上使用事务 @Transactional

4、Restful风格

@RestController
public class TestController {
    /**
     *请求路径中的{name}和{age}表示占位符,用于表示这2个位置中的地址路径为请求的参数
     * 控制器方法需要通过@PathVariable("name") 注解将占位符中的数据获取出来并设置到形参中
     * 注意:
     *   1、如果形参的名字与占位符中的名字相同那么@PathVariable可以不指定参数,否则必须指定参数,这个参数
     *     的内容必须与占位符中的名字完全相同
     *   2、Restful风格可以隐藏参数的含义,地址路径中的任何一个位置都可以作为请求的参数进行传递
     *   3、Restful风格不能将请求的数据设置到某个对象里面例如不能将数据写入User对象,因此不建议传递过多的参数
     *   4、由于请求路径中携带了占位符因此,很容易出现请求冲突的问题,例如test请求和test03就是冲突的
     */
    @RequestMapping("/test/{name}/{age}")
    public Object test(@PathVariable("name") String name,@PathVariable("age") Integer age){
        return "name="+name+"  -----  age="+age;
    }

    @RequestMapping("/{name}/test/{age}")
    public Object test02(@PathVariable("name") String name,@PathVariable("age") Integer age){
        return "test02 ----  name="+name+"  -----  age="+age;
    }
    @RequestMapping("/test/{age}/{name}")
    public Object test03(@PathVariable("name") String name,@PathVariable("age") Integer age){
        return "test03 ----  name="+name+"  -----  age="+age;
    }
}
View Code

5、Redis

     A、redis配置   (启动 ./redis-server ../redis.conf & 

   

进入Redis的安装目录执行
vim redis.conf 
修改2个位置
1.将bind 127.0.0.1 修改成 #bind 127.0.0.1
 设置Redis的绑定IP默认是只允许再本机访问注释以后表示可以在任何IP中访问

2将protected-mode  yes 修改成 protected-mode no 
设置关闭Redis的保护模式
然后使用指定配置文件的方式重新启动Redis
View Code

   B、程序配置文件

#spring.redis.host=192.168.88.131
#spring.redis.port=6379
#spring.redis.password=123456

spring.redis.sentinel.nodes=192.168.88.131:26380,192.168.88.131:26382,192.168.88.131:26384
spring.redis.sentinel.master=mymaster
spring.redis.password=123456
View Code
@RequestMapping("/add")
    public @ResponseBody Object add(String name){
        redisTemplate.setKeySerializer(stringRedisSerializer);
        List<String> names = (List<String>) redisTemplate.opsForValue().get("names");
        if(names == null) {
            names = new ArrayList<>();
        }
        names.add(name);
        redisTemplate.opsForValue().set("names", names);

        return "数据添加成功!";
    }

    @RequestMapping("/get")
    public @ResponseBody Object get( ){
        redisTemplate.setKeySerializer(stringRedisSerializer);
        List<String> names = (List<String>) redisTemplate.opsForValue().get("names");
        return names;
    }
View Code

   C、缓存穿透

     2个并发线程模拟

    

 @Autowired
    private UserService userService;
    @RequestMapping("/showUser")
    public @ResponseBody  Object showUser(){
        //List<User> list = userService.showUser();

        ExecutorService service = Executors.newFixedThreadPool(2);
        for(int i=0;i<10;i++){
            service.submit(new Runnable() {
                public void run() {
                    userService.showUser();
                }
            });
        }
        return "";
    }
View Code

   redis代码处理

 

@Autowired
    private RedisTemplate redisTemplate ;
    private StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    @Override
    //防止缓存穿透
    public List<User> showUser() {
        redisTemplate.setKeySerializer(stringRedisSerializer);
        List<User> userList = (List<User>) redisTemplate.opsForValue().get("userList");
        if(userList==null) {
            synchronized (this) {
                userList = (List<User>) redisTemplate.opsForValue().get("userList");
                if (userList == null) {
                    userList = getData();
                    redisTemplate.opsForValue().set("userList", userList);
                    System.out.println("从数据库获取数据");
                }
            }
        }else{
            System.out.println("从redis中获取数据");
        }
        return userList;
    }

   C、Redis集群  配置文件

     

#配置Redis的链接信息,链接到哨兵服务器中,然后哨兵服务器会返回当前Redis集群中的主服务器的IP以及端口
spring.redis.sentinel.nodes=192.168.188.128:26380,192.168.188.128:26382,192.168.188.128:26384
spring.redis.sentinel.master=mymaster
spring.redis.password=123456
View Code

 

6、springboot热部署插件

7、springboot拦截器

   A、自定义拦截器

  

public class TestInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入了自定义拦截器");
        Object username = request.getSession().getAttribute("username");
        if(username == null){
            response.sendRedirect("/toLogin");
            return false;
        }
        return true;
    }
}
View Code

  B、配置类

  

@Configuration
public class TestInterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration registration = registry.addInterceptor(new TestInterceptor());
        registration.addPathPatterns("/admin/**");
        registration.excludePathPatterns("/admin/test02");

    }
}
View Code

 

8、打包 war jar 及部署

    war包放置到webapps下,tomcat启动时自动解压并启动项目;

   jar包需要手动执行: java -jar xxx.jar

posted on 2020-05-28 11:27  daysafter  阅读(110)  评论(0编辑  收藏  举报

导航