0


Java的一些常用注解及其作用

1、Spring Bean类的注解

1.1 @Component

通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。

1.2 @Repository

对应持久层即 Dao 层,主要用于数据库相关操作。

1.3 @Service

对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。

1.4 @Controller

对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。

1.5@RestController

@RestController = @Controller + @ResponseBody

写这一个注解就相当于写了后面的两个注解,在返回值是json串的非常方便,但同时也会有一个问题,加了这个注解就不能返回jsp或者html页面,这时可以通过返回视图数据的方式来返回页面。

ModelAndView mv = new ModelAndView("index"); 
return mv;

1.6 @Configuration

一般用来声明配置类。

指示一个类声明一个或多个@Bean方法,并且可以由Spring容器处理,以便在运行时为这些bean生成BeanDefinition和服务请求。

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        // instantiate, configure and return bean ...
    }
}

注意:

1.@Configuration不可以是final类型;

2.@Configuration不可以是匿名类;

3.嵌套的configuration必须是静态类。

2、注入数据注解

2.1 @Autowired

自动按照类型注入,只要容器中有唯一一个 bean 对象类型和要注入的变量类型匹配,就可以注入成功。

如果有多个类型匹配,先匹配类型,然后根据变量名称去对应,如果变量名称和 bean 名称相同,就注入。

2.2 @Resource

byName就是变量名去匹配bean的id属性,而byType则是变量类型去匹配bean的class属性。

<bean id="userService" class="com.test.UserServiceImpl">
</bean> 

@Autowired和@Resource的区别:

  1. @Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的;
  2. @Autowird注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入;
  3. @Autowired注解注入的对象需要在IOC容器中存在,否则需要加上属性required=false,表示忽略当 前要注入的bean,如果有直接注入,没有跳过,不会报错。

2.3 @Value

用于注入基本类型和 String 类型的数据。

3、请求常用注解

3.1 @RequestMapping

它用于映射客户端的访问地址,可以被应用于类和方法上面。

可以指定请求的类型get,post,put,delete

@Controller
@RequestMapping("/index")
public class HelloWorldController {
  @RequestMapping(value = "/hello", method = RequestMethod.GET)
  public String hello() {
    return "/WEB-INF/views/success.jsp";
  }
  @RequestMapping(value = "/world", method = RequestMethod.POST)
  public String world() {
    return "/WEB-INF/views/success.jsp";
  }
}

@RequestMapping 还可以将多个请求映射到一个方法上,只需要给 value 来指定一个包含多个路径的列表。

@Controller
@RequestMapping("/index")
public class HelloWorldController {
  @RequestMapping(value = {"/hello", "/world", "/helloworld"})
  public String hello() {
    return "/WEB-INF/views/success.jsp";
  }
}

3.2 @GetMapping

等价于

@RequestMapping(value="",method=RequestMethod.GET)

3.3 @PostMapping

等价于

@RequestMapping(value="",method=RequestMethod.POST)

3.4 @PutMapping(value="/users/{userId}")

等价于

@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)

3.5 @DeleteMapping("/users/{userId}")

等价于

@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)

4、前后端传值

4.1 @PathVariable

用于获取路径参数,通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中。

RequestMapping("user/get/mac/{macAddress}")
public String getByMacAddress(@PathVariable String macAddress){
//can do something;
}

4.2 @RequestParam

用于controller层,是Spring的注解,用于获取查询参数,解决前台参数名称与后台接收参数变量名称不一致的问题。

public String login(@RequestParam(value = "username") final String username,
                    @RequestParam(value = "password",required = false) final String password,
                    @RequestParam(value = "valcode",required = false) final String valcode) {
                    }  
  1. value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的name为username的参数的值将传入;
  2. required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;
  3. defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#{systemProperties['java.vm.version']}”。

4.3 @Param

用于dao层,是mybatis中的注解。

使得mapper.xml中的参数与后台的参数对应上,也增强了可读性。

如果两者参数名一致得话,spring会自动进行封装,不一致的时候就需要手动去使其对应上。 即:用注解来简化xml配置的时候,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中 。

List<Employee> getAllEmployeeByPage(@Param("page") Integer page, 
                                    @Param("size") Integer size);

5、表相关注解

5.1 @Entity

声明一个类对应一个数据库实体。

@Entity说明这个class是实体类,并且使用默认的orm规则,即class名就是数据库表中表明,class字段名即表中字段名。@Entity注解指明这是一个实体Bean。在项目启动时会根据该类自动生成一张表,表的名称即@Entity注解中name的值,如果不配置name,默认表明为类名所有的实体类都要有主键,@Id注解表示该属性是一个主键,@GeneratedValue注解表示注解自动生成,strategy则表示主键的生成策略。

@Data
@Entity(name = "t_book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "book_name")
    private String name;
    @Column(name = "book_author")
    private String author;
    private Float price;
    @Transient
    private String description;
}

5.2 @Table

@Table注解默认情况下只会完成表和实体之间的映射,声明才对象映射到数据库的数据表,通过它可以为实体指定表(table)。

常用属性:name 指定表 @Table(name = "book")

@Data
@Table(name="book")
public class Book{
    @Id
    private Integer id;
    @Column(name="book_name")
    private String name;
    ...
}

5.3 @Id

声明一个字段为主键。所有的实体类都要有主键,@Id注解表示该属性是一个主键。

5.4 @Column

声明字段,可以设置字段的属性,字段名、是否为空。

生成的表中字段的名称就是实体类中属性的名称,通过@Column注解可以定制生成的字段属性,name表示该属性对应的数据表中字段的名称,nullable表示该字段非空。

5.5 @Transient

声明不需要与数据库映射的字段,在保存的时候不需要保存进数据库。

@Transient注解表示在生成数据库中的表时,该属性被忽略,即不生成对应的字段。

6、事务注解@Transactional

@Transactional(rollbackFor = Exception.class)  //这里回滚进行定义
public int update(Prdtv prdtv) throws RuntimeException{
    //注意在这里处理业务时,不要使用Try ...异常捕获,否则不回滚
    return prdtvMapper.update(prdtv);
}

@Transactional:事务注解,注解一般用在可以作用在类或者方法上

1.类上,表明类中所有 public 方法都启用事务 2.方法上,最常用的一种 3.接口上,不推荐使用

@Transactional注解只能在抛出RuntimeException或者Error时才会触发事务的回滚,常见的非RuntimeException是不会触发事务的回滚的。但是我们平时做业务处理时,需要捕获异常,所以可以手动抛出RuntimeException异常或者添加rollbackFor = Exception.class(也可以指定相应异常)

事务的隔离级别:是指若干个并发的事务之间的隔离程度

1. @Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读,
 不可重复读) 基本不使用
 
2. @Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读)
 
3. @Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读)
 
4. @Transactional(isolation = Isolation.SERIALIZABLE):串行化

7、AOP注解

7.1 @After 在方法执行之后执行(方法上)

@After("pt()")
public void after(){
}

7.2 @Before 在方法执行之前执行(方法上)

@Before("pt()")
public void before(){
}

7.3 @Around 在方法执行之前与之后执行(方法上)

@Around("pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
    Object ret = pjp.proceed();
    return ret;
}

7.4 @AfterReturning当前方法作为返回后通知

@AfterReturning(value="pt()",returning = "ret")
public void afterReturning(Object ret) {
}

7.5 @AfterThrowing当前方法作为异常后通知

@AfterThrowing(value="pt()",throwing = "t")
public void afterThrowing(Throwable t){
}

@Aspect:声明一个切面

@PointCut:声明切点

@EnableAspectJAutoProxy:开启Spring对AspectJ代理的支持

8、Lombok

8.1 @Setter

注解在属性上。为属性提供 setting 方法。

8.2 @Getter

注解在属性上。为属性[欢迎转载听雨的人博客]提供 getting 方法。

8.3 @Data

注解在类上。等同于添加如下注解: @Getter/@Setter生成get,set方法 @ToString 生成toString方法 @EqualsAndHashCode 生成equals和hashcode方法 @RequiredArgsConstructor 生成一个指定名称的静态方法

public class Programmer{
    @Getter
    @Setter
    private String name;

    @Setter(AccessLevel.PROTECTED)
    private int age;

    @Getter(AccessLevel.PUBLIC)
    private String language;
}

相当于:

public class Programmer{
    private String name;
    private int age;
    private String language;

    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    protected void setAge(int age){
        this.age = age;
    }

    public String getLanguage(){
        return language;
    }
}

9、MyBatis中常用注解

9.1 @Insert(sql语句):实现新增

public interface UserDAO{
  @Options(useGeneratedKeys = true,keyColumn = "uid", keyProperty = "id")
  @Insert("insert into t_user(username,password,gender,birth) values(#{username},#{password},#{gender},#{birth})")
  public void insertUser(User user);
}
  • 设置@Options属性userGeneratedKeys的值为true,并指定实例对象中主键的属性名keyProperty=“id”,以及在数据库中的字段名keyColumn=“uid”。这样在user插入数据后,userId属性会被自动赋值

9.2 @Update(sql语句):实现更新

public interface UserDAO{
  @Update("update t_user set username=#{usernmae},password=#{password}")
  public void updateUser(User user);
}

9.3 @Delete(sql语句):实现删除

public interface UserDAO{
  @Delete("delete from t_user where id = #{id}")
  public void deleteUserById(@Param("id") int id);
}

9.4 @Select(sql语句):实现查询

public interface UserDAO{
  @Select("select * from t_user where id = #{id} and username = {#username}")
  public User queryUserbyId(@Param("id") int id,@Param("username") String username);
}

其他MyBatis注解:

@Result(property="实体类属性的名称",jdbcType=数据库字段类型):实现结果集封装

@Results(column="数据库字段名",porperty="实体类属性名",jdbcType="数据库字段数据类型"):封装多个结果集(当数据库字段名与实体类对应的属性名不一致时,可以使用@Results映射来将其对应起来)

@ResultMap(@Results的id值):实现引用@Results 定义的封装

@One:实现一对一结果集封装

@Many:实现一对多结果集封装

@CacheNamespace:实现注解二级缓存的使用

10、其他

1.@Scope注解默认的singleton单例模式。

@Scope注解是springIoc容器中的一个作用域,在 Spring IoC 容器中具有以下几种作用域:基本作用域singleton(单例)、prototype(多例),Web 作用域(reqeust、session、globalsession),自定义作用域。

2.Enable注解说明*

@EnableAsync: 开启异步方法的支持。

@EnableScheduling: 开启计划任务的支持。

@EnableAspectAutoProxy:开启对AspectJ自动代理的支持

@EnableAsync:开启异步方法的支持

@EnableScheduling:开启计划任务的支持

@EnableWebMvc:开启web MVC的配置支持

@EnableConfigurationProperties:开启对@ConfigurationProperties注解配置Bean的支持

@EnableJpaRepositories:开启对SpringData JPA Repository的支持

@EnableTransactionManagement:开启注解式事务的支持

@EnableCaching:开启注解式的缓存支持

标签: spring java mybatis

本文转载自: https://blog.csdn.net/weixin_47261870/article/details/128735003
版权归原作者 头不秃代码不止 所有, 如有侵权,请联系我们删除。

“Java的一些常用注解及其作用”的评论:

还没有评论