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 -->
并添加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>
逆向工程插件及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>
JSP编译支持
<!--通知Maven将某个目录下的文件进行编译,否则我们的jsp是不会被编译的 --> <resource> <!--源文件位置--> <directory>src/main/webapp</directory> <!--编译到META-INF/resources,该目录不能随便写--> <targetPath>META-INF/resources</targetPath> <includes> <!--要把哪些文件编译过去,**表示webapp目录及子目录,*.*表示所有--> <include>**/*.*</include> </includes> </resource>
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
可在主函数上添加包扫描 @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; } }
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
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
@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; }
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 ""; }
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
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; } }
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"); } }
8、打包 war jar 及部署
war包放置到webapps下,tomcat启动时自动解压并启动项目;
jar包需要手动执行: java -jar xxx.jar