@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})Update.class是一个接口
String name;
会出现的问题:如果某个属性没有加分组,这时不会对这个属性进行校验
解决办法:在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注解方式
- 定义mapper的接口
- 在接口上面加两个注解:@Mapper和@Repository
- 在接口里面定义sql语句及方法
例如:service层调用时,只需要注入此mapper,调用mapper.updateClass()即可
@Update("update class set title = #{title}, level = #{level}, type = #{type} where id = #{id} ")
int updateClass(XDClass xdClass);