spring boot学习

362 阅读5分钟

@Resource与@Autowired注解的区别

@Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配

常用注解:

@Repository:

用于标注数据访问组件,即DAO组件。

@Service:

用于标注业务层组件。

@RestController:

用于标注控制层组件(如struts中的action),包含@Controller和@ResponseBody。

@Component:

泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

@ComponentScan:

组件扫描。个人理解相当于,如果扫描到有@Component @Controller @Service等这些注解的类,则把这些类注册为bean。

@Configuration:

指出该类是 Bean 配置的信息源,相当于XML中的,一般加在主类上。

@EnableAutoConfiguration:

让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置,一般加在主类上。

@RequestParam,@PathParm,@PathVariable和@@RequestBody区别

这四个注解都是用来传参数的,第一个注解是用在不是rest风格的url上,如user?id=1.

第二和第三用于rest风格,如user/1,最后一个是用于传递对象的

@ControllerAdvice + @ExceptionHandler 全局处理 Controller 层异常


读取配置文件

1.设计一个实体类,对应配置文件中的key

2.在该类的类名上加三个注解:

(1)@component:声明这是一个组件,注意要在启动类上加@componentscan

注解,使spring能扫描到这个包

(2)@ConfigurationProperties(prefix="xxx")

(3)@PropertySource("classpath:自定义配置文件的名称")

3.使用时将该类@autowire即可

面向切面编程之拦截器,过滤器,监听器

(1)拦截器

应用场景:可以做全局日志,记录用户登录时间,处理全局异常

第一步:创建一个类实现HandlerInterceptor接口,重写接口的方法,在该类上加@Component注解

第二步:在入口类的目录或者兄弟目录下创建一个类继承WebMvcConfigurerAdapter类并重写addInterceptors方法;在类上加@SpringBootConfiguration

(2)过滤器

应用场景:编码转换,日志记录,判断用户是否登录和是否有相应的权限,重置session有效期

第一步:新建一个类implements Filter接口,并重写其中的方法。在这个类上加@WebFilter注解,说明过滤器名字和过滤模式。

第二步:在启动类上加@componentsan注解

第三步:通过过滤器注册配置类使用过滤器,配置相关的过滤器(实例化并使用)

(3)监听器

应用场景:获取当前在线人数,在系统初始化时做一些工作(例如删日志,获取绝对路径等)

spring boot实现跨域

在controller类上加@CrossOrigin注解,或者添加过滤器,在header'中加信息

处理全局异常

一:@ControllerAdvice + @ExceptionHandler 全局处理 Controller 层异常,注意只能捕获comtroller层的异常

二:基于Springboot自身的全局异常统一处理,主要是实现ErrorController接口或者继承AbstractErrorController抽象类或者继承BasicErrorController类

三:基于AOP也可以实现异常的全局处理

@validated验证框架的使用

1.引入pom包

2.在bean上添加注解:

      @Min,@NotNull等

      tips:    ID为int类型时,只能判断min,max等,不能判断是否前端传值时,可以让Id= -1,然后@Min(value = 0,message= "id不能为空")方式判断,如果不传则会抛异常

3.写一个处理全局异常的方法,此方法需要捕获MethodArgumentNotValidException 异常,可以在此异常处理类内捕获参数的异常

4.在controller的参数中加入@validated注解,注解写在@ResposenBody后面,然后该controller抛出MethodArgumentNotValidException 异常。

5.分组

需要分组校验时(如ID字段更新时需要,新增时不需要,这时就需要分组),在bean的属性上加的注解中进行分组,例如

@NotNull(groups={Update.class})
String name;
Update.class是一个接口

会出现的问题:如果某个属性没有加分组,这时不会对这个属性进行校验

解决办法:在Update的接口中继承自Default类

例如:

public interface Update extends Default {}

分组以后在controller中将@validated改为@validated(Update.class),网上的办法还需要增加insert.class的接口,这里继承了Default类以后其实是不需要写了

@transactional支持事务

1.在需要事务支持的方法上面加@transactional注解,一般加在service的方法或者service的类上

2.@transactional是基于AOP的动态代理,原理是在执行的mapper上加上代理,如果一个事务执行失败会抛出runtimeException,这时代理类会捕获这个异常并进行回滚

3.可以写一个自定义异常继承自runtimeException,在@transactional的方法中抛出这个异常,在调用此方法的类中捕获自定义异常并处理。

注意:内部类调用不会回滚

如果@transactional标注的方法与调用方法处于同一个类(即内部类调用)时事务是不会起作用的(因为对象不能代理它本身),解决方法就是将他们写在不同的类中

spring Boot 中使用mybatis注解方式

  1. 定义mapper的接口
  2. 在接口上面加两个注解:@Mapper和@Repository
  3. 在接口里面定义sql语句及方法

例如:service层调用时,只需要注入此mapper,调用mapper.updateClass()即可

@Update("update class set title = #{title}, level = #{level}, type = #{type} where id = #{id} ")
int updateClass(XDClass xdClass);