0


面向注解编程—Spring 注解看这一篇就够了

面向注解编程—Spring 注解大全之IOC篇

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@Componentpublic@interfaceController{Stringvalue()default"";}

Controller层:

@RestController//@RestController = @Controller + @ResponseBodypublicclassEmpController{@Autowired//运行时,从IOC容器中获取该类型对象,赋值给该变量privateEmpService empService ;@RequestMapping("/listEmp")publicResultlist(){//1. 调用service, 获取数据List<Emp> empList = empService.listEmp();//3. 响应数据returnResult.success(empList);}}

Service层:

@ServicepublicclassEmpServiceAimplementsEmpService{@Autowired//运行时,从IOC容器中获取该类型对象,赋值给该变量privateEmpDao empDao ;@OverridepublicList<Emp>listEmp(){//具体实现}

Dao层:

@RepositorypublicclassEmpDaoAimplementsEmpDao{@OverridepublicList<Emp>listEmp(){List<Emp> empList = empDao.listEmp();//具体实现}}

同时要使用四大注解声明的bean,还需要被组件扫描注解**@ComponentScan**扫描,@ComponentScan注解虽然没有显式配置,但是实际上已经包含在了引导类声明注解 @SpringBootApplication 中, 默认扫描的范围是SpringBoot启动类所在包及其子包 。

@Bean:导入第三方包里面的注解,通常会单独定义一个配置类

Bean保持一个原则:

  • 如果是在项目当中我们自己定义的类,想将这些类交给IOC容器管理,直接使用@Component 以及它的衍生注解来声明就可以。
  • 如果这个类它不是我们自己定义的,而是引入的第三方依赖当中提供的类,而且我们还想将这个类 交给IOC容器管理。此时我们就需要在配置类中定义一个方法,在方法上加上一个@Bean注解,通 过这种方式来声明第三方的bean对象。

@Import:@Import(要导入到容器中的组件) ,通常使用第三方依赖提供的 @EnableXxxxx注解

@Import(HeaderConfig.class)//导入配置类@SpringBootApplicationpublicclassSpringbootWebConfig2Application{publicstaticvoidmain(String[] args){SpringApplication.run(SpringbootWebConfig2Application.class,args);}}

实现Bean的注入

@Autowired:实现程序运行时IOC容器自动注入需要的依赖对 象
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@Resource:是按照名称匹配的

@ServicepublicclassDemoService{@Bean(name ="userDemo"){
        实现
    }}@RestControllerpublicclassUserController{@Resource(name ="userDemo")User user;}

@Primary:让spring进行自动装配的时候,默认使用首选的bean,和@Qualifier一个效果。

Spring Web模块注解

@RestController:(常用)加在Controller类上边 相当于-> @RestController = @Controller + @ResponseBody

@RequestMapping : 这个注解用于将url映射到整个处理类或者特定的处理请求的方法。可以只用通配符!

@ResponseBody:将方法返回值直接响应给浏览器

@RestController//@RestController = @Controller + @ResponseBody@RequestMapping("/emp")publicclassEmpController{@Autowired//运行时,从IOC容器中获取该类型对象,赋值给该变量privateEmpService empService ;@RequestMapping("/listEmp")publicResultlist(){//1. 调用service, 获取数据List<Emp> empList = empService.listEmp();//3. 响应数据returnResult.success(empList);}}

@RequestBody:将JSON数据映射到形参的实体类对象中(JSON中的key和实体类中的属性 名保持一致)

在这里插入图片描述

@PathVariable:获取路径参数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@RequestParam(defaultValue=“默认值”) :设置请求参数默认值

在这里插入图片描述

@GetMappingpublicResultpage(@RequestParam(defaultValue ="1")Integer page,@RequestParam(defaultValue ="10")Integer pageSize){//记录日志
    log.info("分页查询,参数:{},{}", page, pageSize);//调用业务层分页查询功能PageBean pageBean = empService.page(page, pageSize);//响应returnResult.success(pageBean);}

通常面对不同的请求方式 Controller要有相对应的Mapping

@GetMapping(“/url”) :前端请求方式:GET 等同于@RequestMapping(value = “/url” , method = RequestMethod.GET)

@DeleteMapping(“/url”) :前端请求方式:DELETE

**@PostMapping(“/url”)**:前端请求方式:POST

@PutMapping:前端请求方式:PUT

@Slf4j@RestControllerpublicclassDeptController{@AutowiredprivateDeptService deptService;@PostMapping("/depts")publicResultadd(@RequestBodyDept dept){//记录日志
        log.info("新增部门:{}",dept);//调用service层添加功能
        deptService.add(dept);//响应returnResult.success();}//省略...}

过滤器Filter

@WebFilter:指定属性urlPatterns,通过这个属性指 定过滤器要拦截哪些请求

@WebFilter(urlPatterns ="/*")//配置过滤器要拦截的请求路径( /* 表示拦
截浏览器的所有请求 )
publicclassDemoFilterimplementsFilter{@Override//初始化方法, 只调用一次publicvoidinit(FilterConfig filterConfig)throwsServletException{System.out.println("init 初始化方法执行了");}@Override//拦截到请求之后调用, 调用多次publicvoiddoFilter(ServletRequest request,ServletResponse response,FilterChain chain)throwsIOException,ServletException{System.out.println("Demo 拦截到了请求...放行前逻辑");//放行
        chain.doFilter(request,response);}@Override//销毁方法, 只调用一次publicvoiddestroy(){System.out.println("destroy 销毁方法执行了");}}

@ServletComponentScan:开启SpringBoot项目对于 Servlet组件的支持。当存在@WebFilter时需要在启动类上面加上

Lombok

Lombok是一个实用的Java类库,可以通过简单的注解来简化和消除一些必须有但显得很臃肿的Java代 码。

介绍最常见的三个:

@Data 提供了更综合的生成代码功能(@Getter + @Setter + @ToString + @EqualsAndHashCode)

@NoArgsConstructor 为实体类生成无参的构造器方法

@AllArgsConstructor 为实体类生成除了static修饰的字段之外带有各参数的构造器方 法。

importlombok.Data;@Data//getter方法、setter方法、toString方法、hashCode方法、equals方法@NoArgsConstructor//无参构造@AllArgsConstructor//全参构造publicclassUser{privateInteger id;privateString name;privateShort age;privateShort gender;privateString phone;}

Mabatis

@Mapper:表示是mybatis中的Mapper接口

@Select:代表的就是select查询,用于书写select查询语句

@Delete:用于编写delete操作的SQL语句

@Insert:编写insert更新操作的SQL语句

@Update:编写update更新操作的SQL语句

@MapperpublicinterfaceEmpMapper{@Select("select * from emp "+"where name like concat('%',#{name},'%') "+"and gender = #{gender} "+"and entrydate between #{begin} and #{end} "+"order by update_time desc")publicList<Emp>list(String name,Short gender,LocalDate begin,LocalDate end);}

Mybatis的XML配置文件

?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper">
<!--查询操作-->
    <select id="list" resultType="com.itheima.pojo.Emp">
         select * from emp
         where name like concat('%',#{name},'%')
         and gender = #{gender}
         and entrydate between #{begin} and #{end}
         order by update_time desc
    </select>
</mapper>

动态SQL-if

<select id="list" resultType="com.itheima.pojo.Emp">
         select * from emp
        <where>
                <!-- if做为where标签的子元素 -->
                <if test="name != null">
                     and name like concat('%',#{name},'%')
                </if>
                <if test="gender != null">
                     and gender = #{gender}
                </if>
                <if test="begin != null and end != null">
                     and entrydate between #{begin} and #{end}
                </if>
        </where>
         order by update_time desc
</select>

动态SQL-foreach

<mapper namespace="com.itheima.mapper.EmpMapper"><!--删除操作--><delete id="deleteByIds">
         delete from emp where id in
        <foreach collection="ids" item="id" separator=","open="(", close=")">
             #{id}</foreach></delete></mapper>

动态SQL-sql&include

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其他

@Slf4j:控制台输出 log.info(“”)

@Value:注解通常用于外部配置(.yml文件)的属性注入,具体用法为: @Value(“${配置文件中的key}”)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@ConfigurationProperties :当配置过多 简化上面代码,可以批量的将外部的属性配置注入到bean对象的属性中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@RestControllerAdvice :表示当前类为全局异常处理器

@ExceptionHandler :指定可以捕获哪种类型的异常进行处理

@RestControllerAdvicepublicclassGlobalExceptionHandler{//处理异常@ExceptionHandler(Exception.class)//指定能够处理的异常类型publicResultex(Exception e){
        e.printStackTrace();//打印堆栈中的异常信息//捕获到异常之后,响应一个标准的ResultreturnResult.error("对不起,操作失败,请联系管理员");}}

@Transactional:在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在方法执行的过程当中出现了异常,就会进行事务的回滚操作。

@Slf4j@ServicepublicclassDeptServiceImplimplementsDeptService{@AutowiredprivateDeptMapper deptMapper;@AutowiredprivateEmpMapper empMapper;@Override@Transactional//当前方法添加了事务管理publicvoiddelete(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)
标签: spring java 后端

本文转载自: https://blog.csdn.net/weixin_43786143/article/details/134804772
版权归原作者 _苏沐 所有, 如有侵权,请联系我们删除。

“面向注解编程—Spring 注解看这一篇就够了”的评论:

还没有评论