【框架学习】springboot实践 - hippowc/hippowc.github.io GitHub Wiki
划分成多个功能模块。以当前实践项目为例:一个主pom,然后另外包含一个service模块和一个start模块。
主pom的作用:1 使用modules标签引入这两个模块 2 管理所有dependency; 3 build标签中对插件进行管理以及使用
使用到了这几个plugin:spring-boot-maven-plugin(生成fat jar,可以用来修改jvm参数进行debug),autoconfig-maven-plugin(对fat jar做autoconfig),maven-antrun-plugin(插件解压fat jar到target/${appName}目录)。其中在start模块中会进行打包,autoconfig等
service模块的作用:提供各种服务,包括数据库,hsf,tair,消息等服务,会使用到hsf,tair,tddl等中间件的starter。
start模块的作用:简单来说是一个总入口,一般将rest接口放在这边,以及一些页面资源和模版,antx.properties,application.properties,这个模块会引入其他子模块
diamond与springboot集成
首先在pom中引用pandora-diamond-spring-boot-starter;
不同环境的配置问题:1 spring boot自身提供了profiles机制来应对不同的环境配置问题
diamond配置方式:1 直接在application.properties里配置diamond dataID/groupId;2 @DiamondPropertySource,@DiamondPropertySource配置在 main class上才会生效
方案:大部分配置仍然沿用antx,新的方式是这样:antx.properties在start模块下,这个就是配置项,在autoconfig的时候,会将这些配置项注入到start模块的application.properties中,以供内部使用。
对于其他模块,也都可以使用该application.properties,因为在打包的时候start模块会引用其他模块,做autoconfig也会为其他模块做,其他模块也可以直接使用start模块中的application.properties,因为最终在一个包内部,启动的是start这个jar。
spring本身的配置方式
spring本身支持读取多个地方的参数,优先级顺序如下:
1 命令行参数:java -jar app.jar --server.port=9090,即通过--xxx=xxx传递的这种 2 java系统属性:java -jar app.jar -Dname=xxx,即通过-D传递的 3 操作系统环境变量 4 RandomValuePropertySource,系统中用到随机数的地方? 5 应用配置文件,application.properties。其中包外的配置优先包内配置,带profile配置优先不带profile配置。
使用是可以有这样几种方式 1 SpringApplication.setDefaultProperties,使用这个方法将配置设置到一个map中 2 @Value(“${xxx}”),直接将值注入到属性中 3 @ConfigurationProperties 配置在类上面,根据前缀注入属性,支持list以及复杂对象(流弊)。还可以作用在@bean配置之上
velocity的使用
一些基本配置:spring.velocity.resource-loader-path表示模版的路径;spring.velocity.toolbox-config-location表示可以使用的toolbox spring.velocity.layout-url表示默认的layout页面;spring.velocity.tools-base-packages自定义的tool的路径;
常用方法: controller中直接return模版名称。返回值为普通变量 @VelocityLayout使用这个注解返回某个layout
虽然最终采用了freemarker,不过使用方法类似
spring-boot-starter其中包含了默认的logging-start spring-boot-starter-logging,Spring Boot应用将自动使用logback作为应用日志框架
监听器要实现ServletContextListener接口
过滤器要实现Filter接口;
监听器要实现HandlerInterceptor接口;实现Interceptor之后要在WebMvcConfigurerAdapter(使用Configuration注解)中注册使用,在添加到注册时还可以设置拦截路径。
一些调用顺序:先执行Listener -- Filter -- interceptor; interceptor的三个方法分别在:调用controller方法之前,调用controller方法之后--渲染模板之前,请求结束之后被调用。
interceptor在注册器中,要使用@Bean的方式声明出来,这样在interceptor中自动注入的服务才可以使用。
多个interceptor方法的调用顺序:都放行的情况下 ,preHandle按拦截器顺序执行,postHandle和afterCompletion按拦截器逆序执行
@Component、@Repository、@Service、@Controller
Component是一个通用的Spring容器管理的单例bean组件。而@Repository, @Service, @Controller就是针对不同的使用场景所采取的特定功能化的注解组件。当你的一个类被@Component所注解,那么就意味着同样可以用@Repository, @Service, @Controller来替代。似乎没有什么功能上的区别,只是语意上的区别。 譬如:@Service,默认生成的bean名称是实现接口的servcie
@RequestMapping, GetMapping, PostMapping,PutMapping等 可以用在类上,也可以使用在方法上,都是用来匹配请求,RequestMapping可以制定http方法,其他都是在RequestMapping上的变种。
如何获取请求中的参数: 1、直接把表单参数,写在contrller的方法形参中,名称保持一致即可。不过只适用于get请求,post不行 2、直接在controller方法的参数中注入HttpServletRequest,使用request的getParameter方法 3、还可以直接在contoller的方法参数中使用对象来接受,spring都可以进行转换,这种直接写就可以,并且get和post都支持 4、@PathVariable使用这个注解在参数前,可以获取url路径中的变量 5、@RequestParam在参数前使用这个注解,可以获得参数,这个会默认校验是否存在 6、@ModelAttribute("kkk") user user, 这种用在页面会用到变量时比较方便 其中:使用对象获取参数,该对象还可以使用valid注解进行校验 public String createUser2(@Valid UserInfo userInfo, BindingResult bindingResult) 在bindingResult中可以获取错误信息
1、通过静态方法获取,你也可以封装一个静态方法出来
@GetMapping(value = "")
public String center() {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
HttpServletResponse response = servletRequestAttributes.getResponse();
//...
}
2、通过参数直接获取,只要在你的方法上加上参数,Springboot就会帮你绑定,你可以直接使用。如果你的方法有其他参数,把这两个加到后面即可。
@GetMapping(value = "")
public String center(HttpServletRequest request,HttpServletResponse response) {
//...
}
3、注入到类,这样就不用每个方法都写了
@Autowired
private HttpServletRequest request;
@Autowired
private HttpServletResponse response;
@GetMapping(value = "")
public String center() {
//...
}
ApplicationContextAware, InitializingBean的使用 TODO