Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,调用的时候直接注入即可,使用注解可以大大提高了开发效率!。
Bean英文意为 豆子 理解起来就是豆荚里的豌豆,豆荚就是Spring 容器。
以如下开发结构为例:
@Component :标准一个普通的spring Bean类,可以自己写的😎。
@Repository:标注一个DAO组件类,即对数据操作的组件。
@Service:标注一个业务逻辑组件类。
@Controller:标注一个控制器组件类。
@Repository,@Service,@Controller 分别对应Spring 框架的 mapper包、service包和controller包,同时这三个注解也可以被@Component替代,因为这三个的源码都是被@Component标注的。如下:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Controller { String value() default ""; }
Controller层:
@RestController //@RestController = @Controller + @ResponseBody public class EmpController { @Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量 private EmpService empService ; @RequestMapping("/listEmp") public Result list(){ //1. 调用service, 获取数据 ListempList = empService.listEmp(); //3. 响应数据 return Result.success(empList); } }
Service层:
@Service public class EmpServiceA implements EmpService { @Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量 private EmpDao empDao ; @Override public ListlistEmp() { //具体实现 }
Dao层:
@Repository public class EmpDaoA implements EmpDao { @Override public ListlistEmp() { List empList = empDao.listEmp(); //具体实现 } }
同时要使用四大注解声明的bean,还需要被组件扫描注解**@ComponentScan**扫描,@ComponentScan注解虽然没有显式配置,但是实际上已经包含在了引导类声明注解 @SpringBootApplication 中, 默认扫描的范围是SpringBoot启动类所在包及其子包 。
@Bean:导入第三方包里面的注解,通常会单独定义一个配置类
Bean保持一个原则:
@Import:@Import(要导入到容器中的组件) ,通常使用第三方依赖提供的 @EnableXxxxx注解
@Import(HeaderConfig.class) //导入配置类 @SpringBootApplication public class SpringbootWebConfig2Application { public static void main(String[] args) { SpringApplication.run(SpringbootWebConfig2Application.class,args); } }
@Autowired:实现程序运行时IOC容器自动注入需要的依赖对 象
@Resource:是按照名称匹配的
@Service public class DemoService { @Bean(name = "userDemo"){ 实现 } } @RestController public class UserController { @Resource(name = "userDemo") User user; }
@Primary:让spring进行自动装配的时候,默认使用首选的bean,和@Qualifier一个效果。
@RestController:(常用)加在Controller类上边 相当于-> @RestController = @Controller + @ResponseBody
@RequestMapping : 这个注解用于将url映射到整个处理类或者特定的处理请求的方法。可以只用通配符!
@ResponseBody:将方法返回值直接响应给浏览器
@RestController //@RestController = @Controller + @ResponseBody @RequestMapping("/emp") public class EmpController { @Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量 private EmpService empService ; @RequestMapping("/listEmp") public Result list(){ //1. 调用service, 获取数据 ListempList = empService.listEmp(); //3. 响应数据 return Result.success(empList); } }
@RequestBody:将JSON数据映射到形参的实体类对象中(JSON中的key和实体类中的属性 名保持一致)
@PathVariable:获取路径参数
@RequestParam(defaultValue=“默认值”) :设置请求参数默认值
@GetMapping public Result page(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer pageSize) { //记录日志 log.info("分页查询,参数:{},{}", page, pageSize); //调用业务层分页查询功能 PageBean pageBean = empService.page(page, pageSize); //响应 return Result.success(pageBean); }
通常面对不同的请求方式 Controller要有相对应的Mapping
@GetMapping(“/url”) :前端请求方式:GET 等同于@RequestMapping(value = “/url” , method = RequestMethod.GET)
@DeleteMapping(“/url”) :前端请求方式:DELETE
@PostMapping(“/url”):前端请求方式:POST
@PutMapping:前端请求方式:PUT
@Slf4j @RestController public class DeptController { @Autowired private DeptService deptService; @PostMapping("/depts") public Result add(@RequestBody Dept dept){ //记录日志 log.info("新增部门:{}",dept); //调用service层添加功能 deptService.add(dept); //响应 return Result.success(); } //省略... }
@WebFilter:指定属性urlPatterns,通过这个属性指 定过滤器要拦截哪些请求
@WebFilter(urlPatterns = "/*") //配置过滤器要拦截的请求路径( /* 表示拦 截浏览器的所有请求 ) public class DemoFilter implements Filter { @Override //初始化方法, 只调用一次 public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init 初始化方法执行了"); } @Override //拦截到请求之后调用, 调用多次 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Demo 拦截到了请求...放行前逻辑"); //放行 chain.doFilter(request,response); } @Override //销毁方法, 只调用一次 public void destroy() { System.out.println("destroy 销毁方法执行了"); } }
@ServletComponentScan:开启SpringBoot项目对于 Servlet组件的支持。当存在@WebFilter时需要在启动类上面加上
Lombok是一个实用的Java类库,可以通过简单的注解来简化和消除一些必须有但显得很臃肿的Java代 码。
介绍最常见的三个:
@Data 提供了更综合的生成代码功能(@Getter + @Setter + @ToString + @EqualsAndHashCode)
@NoArgsConstructor 为实体类生成无参的构造器方法
@AllArgsConstructor 为实体类生成除了static修饰的字段之外带有各参数的构造器方 法。
import lombok.Data; @Data //getter方法、setter方法、toString方法、hashCode方法、equals方法 @NoArgsConstructor //无参构造 @AllArgsConstructor//全参构造 public class User { private Integer id; private String name; private Short age; private Short gender; private String phone; }
@Mapper:表示是mybatis中的Mapper接口
@Select:代表的就是select查询,用于书写select查询语句
@Delete:用于编写delete操作的SQL语句
@Insert:编写insert更新操作的SQL语句
@Update:编写update更新操作的SQL语句
@Mapper public interface EmpMapper { @Select("select * from emp " + "where name like concat('%',#{name},'%') " + "and gender = #{gender} " + "and entrydate between #{begin} and #{end} " + "order by update_time desc") public Listlist(String name, Short gender, LocalDate begin, LocalDate end); }
?xml version="1.0" encoding="UTF-8" ?>
动态SQL-if
动态SQL-foreach
delete from emp where id in #{id}
动态SQL-sql&include
@Slf4j:控制台输出 log.info(“”)
@Value:注解通常用于外部配置(.yml文件)的属性注入,具体用法为: @Value(“${配置文件中的key}”)
@ConfigurationProperties :当配置过多 简化上面代码,可以批量的将外部的属性配置注入到bean对象的属性中
@RestControllerAdvice :表示当前类为全局异常处理器
@ExceptionHandler :指定可以捕获哪种类型的异常进行处理
@RestControllerAdvice public class GlobalExceptionHandler { //处理异常 @ExceptionHandler(Exception.class) //指定能够处理的异常类型 public Result ex(Exception e){ e.printStackTrace();//打印堆栈中的异常信息 //捕获到异常之后,响应一个标准的Result return Result.error("对不起,操作失败,请联系管理员"); } }
@Transactional:在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在方法执行的过程当中出现了异常,就会进行事务的回滚操作。
@Slf4j @Service public class DeptServiceImpl implements DeptService { @Autowired private DeptMapper deptMapper; @Autowired private EmpMapper empMapper; @Override @Transactional //当前方法添加了事务管理 public void delete(Integer id){ //根据部门id删除部门信息 deptMapper.deleteById(id); //模拟:异常发生 int i = 1/0; //删除部门下的所有员工信息 empMapper.deleteByDeptId(id); } }
@Transactional包含:rollbackFor属性 和 propagation属性,如下:
//在Spring的事务管理中,默认只有运行时异常 RuntimeException才会回滚。 //如果还需要回滚指定类型的异常,可以通过rollbackFor属性来指定 @Transactional(rollbackFor=Exception.class) //propagation 属性来指定传播行为。REQUIRES_NEW:不论是否有事务,都创建新事务 ,运行在一个独立的事务中。 @Transactional(propagation = Propagation.REQUIRES_NEW) //模拟:异常发生 int i = 1/0; //删除部门下的所有员工信息 empMapper.deleteByDeptId(id); } }
@Transactional包含:rollbackFor属性 和 propagation属性,如下:
//在Spring的事务管理中,默认只有运行时异常 RuntimeException才会回滚。 //如果还需要回滚指定类型的异常,可以通过rollbackFor属性来指定 @Transactional(rollbackFor=Exception.class) //propagation 属性来指定传播行为。REQUIRES_NEW:不论是否有事务,都创建新事务 ,运行在一个独立的事务中。 @Transactional(propagation = Propagation.REQUIRES_NEW)