微服务学习:注解作用整理

springCloud 使用注解整理


@Autowried

作用:自动导入依赖的bean.
把配置好的Bean拿来用,完成属性,方法的组装,它可以对类成员变量,方法及构造函数进行标注,完成自动装配的工作.加上(required = false)时,找不到Bean也不会报错.


@Column

@Column :
作用:用来标识实体类和数据库的对应关系.一共包含十个属性.解释如下:

属性 作用
name name属性定义了被标注字段在数据库表中所对应字段的名称
unique unique属性表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。
nullable nullable属性表示该字段是否可以为null值,默认为true。
insertable insertable属性表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。
updatable updatable属性表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable和updatable属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。
columnDefinition columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。)
table table属性定义了包含当前字段的表名。
length length属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。
precision和scale precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。

@Component

**@Component:**把普通的pojo实例化到spring容器中,相当于配置 文件中的

< bean id ="" class = “”/>

注意:@component 可以通过实现CommandLineRunner接口来在程序执行后紧跟着实现一些基础功能.

@ComponentScan

@ComponentScna:
组件可以发现和装配一些Bean.主要就是定义扫描路径从中找出标识了需要装配的类自动装配到spring 的容器中.

总结如下:

  • 自定义扫描路径下边带有@Controller,@Service,@Repository,@Component 注解加入spring容器.
  • 通过 includeFilters加入扫描路径下没有以上注解的类加入spring容器.
  • 通过excluderFilters过滤出不用加入spring容器的类.
  • 自定义增加了@Component注解的注解方式.

@Conditional

这是Spring4.0添加的新注解,用来标识一个Spring Bean 或者Configuration配置文件,当满足指定条件才开启配置.
首先定义自己的判断类实现接口Condition


public class MyCondition implements Condition{

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        Environment env = conditionContext.getEnvironment();
        String property = env.getProperty("os.name");
        System.out.println("系统为>>>>>>"+property);
        if(property.contains("Linux")){
            return true;
        }else {
            return false;
        }
    }
}

使用

@Component
public class GetUser {

    @Conditional(MyCondition.class)
    @Bean(value = "user")
    public User getuserrrrr(){
        System.out.println("这里创建了用户>>>>>:");
        return new User("lxq",22);
    }
}

测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

	@Autowired
	ApplicationContext context;

	@Test
	public void contextLoads() {
		Arrays.stream(context.getBeanDefinitionNames()).forEach(System.out::println);

	}

}

结果:

只有在LInux系统下运行才会在spring 容器中创建user类.在windows系统下不会创建user类.

相关注解:

  • @ConditionalOnBean:组合@Conditional 注解,当容器中有指定的Bean才开启配置.
  • @ConditionalOnMissingBean:组合@Conditional注解,和@ConditionalOnBean注解相反,当容器中没有指定的Bean才开启配置.
  • @ConditionalOnClass:组合@Conditional注解,当容器中有指定Class才开启配置.
  • @ConditionalOnMisssingClass:组合@Conditional注解,和@ConditionalOnMissingClass注解相反,当容器中没有指定的Class才开启配置.
  • @ConditionalOnWebApplication:组合@Conditional 注解,当前项目类型是WEB项目才开启注解.
  • @ConditionalOnNotWebApplication;组合@Conditional注解,和@ConditionalOnWebApplication注解相反,当前项目不是web项目才开启配置.
  • @ConditionalOnProperty:组合@Conditional注解,当指定的属相有指定的值才开启配置,否则不会开启配置.
  • @ConditionalOnExpression:组合@Conditional 注解,当Spel表达式为true才开始配置.
  • @ConditionalOnJava:组合@Conditional注解,当运行的JavaJVM指定的版本范围之内才开启配置.
  • @ConditionalOnResource:组合@Conditional 注解,当类路径下有指定资源才开启配置.
  • @ConditionalOnCloudPlatform:组合@Conditional 注解,当指定的云平台激活才开启配置.
  • @ConditionalOnSingleCanditate:组合@Conditional注解,当指定的class在容器中只有一个Bean,或者同时有多个但为首选时才开启配置.

点此链接


@Configuration

@Configuration:
可以理解为使用spring时候的 标签.

@Bean
可以理解为使用spring时候的标签.
注意:
@Component 和@Configuration都可以作为配置类,不同点是使用@Configuration会在spring容器中创建一个对象,使用的时候一样,但是@Component使用时是不同的对象.


@controller 注入服务层


@ControllerAdvice

作用:通过@ControllerAdvice 注解可以将对于控制器的全局配置放在同一个位置

注解了 @Controller 的类的方法 可以使用@ExceptionHandler @InitBInder @ModelAtribute注解到方法上.

@ControllerAdvice 注解将作用在所有注解了@RequestMapping的控制器的方法上.

@ExceptionHandler:用于全局处理控制器的异常.
例如:

@ControllerAdvice
@ResponseBody
public class BusinessExceptionHandler {
    @ExceptionHandler(value = Exception.class)
    public JsonBackData exceptionHandler(HttpServletRequest request, Exception e) {
        e.printStackTrace();
        JsonBackData back = new JsonBackData();
        if (e instanceof BusinessException) {
            BusinessException ex = (BusinessException) e;
            back.setSuccess(false);
            back.setBackMsg(ex.getMessage());
        }
        return back;
    }

增加了上边这个全局配置的Bean后,以前代码是:

    @RequestMapping(value = "queryDetail")
    @ResponseBody
    public JsonBackData queryDetail(@RequestParam String id) {
        JsonBackData back = new JsonBackData();
        try {
            OpenSourceThrottleAdjustVO vo = openSourceThrottlePlanQueryService.findById(id);
            back.setBackData(vo);
            back.setSuccess(true);
            back.setBackMsg("查询详细信息成功");
        } catch (BusinessException e) {
            back.setSuccess(false);
            back.setBackMsg("查询详细信息失败:" + e.getMessage());
        }
        return back;
    }

有许多无关信息,几乎每个类都要进行 try catch 代码冗余.

增加全局处理控制器之后.代码中异常会自己捕获并进行处理.

@RequestMapping(value = "queryDetail")
@ResponseBody
public JsonBackData queryDetail(@RequestParam String id) {
    JsonBackData back = new JsonBackData();
    OpenSourceThrottleAdjustVO vo = openSourceThrottlePlanQueryService.findById(id);
    back.setBackData(vo);
    back.setSuccess(true);
    back.setBackMsg("查询详细信息成功");
    return back;
}

另一个例子

@ControllerAdvice
public class MyControllerAdvice {

    /**
     * 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器
     * @param binder
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {}

    /**
     * 把值绑定到Model中,使全局@RequestMapping可以获取到该值
     * @param model
     */
    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("author", "Magical Sam");
    }

    /**
     * 全局异常捕捉处理
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Map errorHandler(Exception ex) {
        Map map = new HashMap();
        map.put("code", 100);
        map.put("msg", ex.getMessage());
        return map;
    }

}

@ModelAttribute: 在model 上设置的值,对于所有被@RequestMapping 注解的方法,都可以通过ModelMap获取,如下:

@RequestMapping("/home")
public String home(ModelMap modelMap) {
    System.out.println(modelMap.get("author"));
}

//或者 通过@ModelAttribute获取

@RequestMapping("/home")
public String home(@ModelAttribute("author") String author) {
    System.out.println(author);
}

编写自定义异常类

public class MyException extends RuntimeException {

    public MyException(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    private String code;
    private String msg;

    // getter & setter
}

注:spring 对于 RuntimeException 异常才会进行事务回滚。
创建MyControllerAdvice.java

@ControllerAdvice
public class MyControllerAdvice {

    /**
     * 全局异常捕捉处理
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Map errorHandler(Exception ex) {
        Map map = new HashMap();
        map.put("code", 100);
        map.put("msg", ex.getMessage());
        return map;
    }
    
    /**
     * 拦截捕捉自定义异常 MyException.class
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = MyException.class)
    public Map myErrorHandler(MyException ex) {
        Map map = new HashMap();
        map.put("code", ex.getCode());
        map.put("msg", ex.getMsg());
        return map;
    }

}

抛出异常进行测试

@RequestMapping("/home")
public String home() throws Exception {

//        throw new Exception("Sam 错误");
    throw new MyException("101", "错误lalala");
}

访问http://localhost:8080/home 正常显示以下json

{"msg":"错误lalala","code":"101"}

不想返回json,需要渲染页面给浏览器,如下

@ExceptionHandler(value = MyException.class)
public ModelAndView myErrorHandler(MyException ex) {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("error");
    modelAndView.addObject("code", ex.getCode());
    modelAndView.addObject("msg", ex.getMsg());
    return modelAndView;
}

补充:如果全部异常处理返回json,那么可以使用 @RestControllerAdvice 代替 @ControllerAdvice ,这样在方法上就可以不需要添加 @ResponseBody。


@EnableConfigServer

@EnableConfigServer:表明这是一个Config server端.


@EnableDiscoveryclient

@EnableDiscoveryclient:

作用:
@EnableDiscoveryClient 注解是基于spring-cloud-commons依赖,并且在classpath中实现:
@EnableEurekaClient注解是基于spring-cloud-netflix依赖,只能为eureka作用.

如果注册中心是eureka,那么推荐使用@EnableEurekaClient,如果是其他注册中心,那么推荐使用@EnableDiscoveryClient

@Entity

@Entity : 表明该类是一个实体类.


@ExcludeComponent

作用:@ExcludeComponent,被此注解注解的类不会被@ComponentScan扫描到.


@GeneratedValue

@Generatedvalue:
作用:用于标注主键的生成策略,通过strategy属性指定.默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略:SqlServer 对应的identity,mysql对应的auto increment.
在javax.persistence.GenerationType 中定义了以下几种方式:

  1. IDENTITY:采用数据库自增长的方式来自增主键字段,oracle不支持.
  2. AUTO:JPA自动选择合适的策略.
  3. SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,mysql不支持.
  4. TABLE: 通过表产生主键,框架借由表模拟序列产生主键,该策略可以使应用更易于数据库移植.

@Import

作用:用来导入其他配置类.


@ImportResource

作用:用来加载xml配置文件.


@Ingect

作用:等价与默认的@Autowired,只是没有required属性;


@JSONField

@JSONField :
作用:

  • 可以用在方法(method),属性(field)以及参数(parameter)上.
    JSONField中的那么属性用来指定JSON中key的名称.
@JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称。
public class Person {
    @JSONField(name = "name") // 注意观察生成的JSON串中name和age的区别
    private String name;
    @JSONField(name = "AGE")
    private String age;

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

@JSONField也可以直接作用在get或set方法上
@JSONField(name = "name")
public String getName() {
    return name;
}

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

@JSONField(name = "AGE")
public String getAge() {
    return age;
}

@JSONField(name = "AGE")
public void setAge(String age) {
    this.age = age;
}
PS:FastJson在进行操作时,是根据getter和setter的方法进行的,并不是依据Field进行。
public class PersonTest {
    private Person person;

    /**
    * 初始化对象
    */
    @Before
    public void setUp() {
        person = new Person();
        person.setName("gyl");
        person.setAge("20");
    }

    @Test
    public void test() {
        String jsonStr = JSONObject.toJSONString(person);
        System.out.println("bean to json:" + jsonStr);
        person = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Person.class);
        System.out.println("json to bean:" + person.getName());
    }
}

Output:
bean to json:{"AGE":"20","name":"gyl"}
json to bean:gyl

@JsonIgnore

@JsonIgnore:
作用:在接送序列化时将Javabean的一些属相忽略掉,序列化和反序列化都受影响.
使用方法:一般标记在属性或者方法上,返回的json数据不包含该属性.

@Data
@Log4j
public class user {

    private String name;
    private int age;
    @JsonIgnore
    private String password; //不序列化
    public user(String name, int age) {
        this.name = name;
        this.age = age;
    }
  • @JSONField 支持默认值
public @interface JSONField {
    int ordinal() default 0;

    String name() default "";

    String format() default "";

    boolean serialize() default true;

    boolean deserialize() default true;

    SerializerFeature[] serialzeFeatures() default {};

    Feature[] parseFeatures() default {};

    String label() default "";

    boolean jsonDirect() default false;

    Class<?> serializeUsing() default Void.class;

    Class<?> deserializeUsing() default Void.class;

    String[] alternateNames() default {};

    boolean unwrapped() default false;
}

  • format 规定日期格式
    @JSONField(format="yyyy-MM-dd HH:mm:ss")
    @Column(columnDefinition="timestamp default current_timestamp comment '创建时间'")
    private Date createTime;
  • ordinal规定字段顺序
@JSONField(ordinal = 3)
private int f0;

@JSONField(ordinal = 2)
private int f1;

@JSONField(ordinal = 1)
private int f2;
fastjson序列化⼀个java bean,是根据fieldName的字母序进⾏序列的你可以通过ordinal指定字段的顺序。
  • 指定字段不序列化
@JSONField(serialize=false)
public Date date;

@MappedSuperClass

作用:

  • 标注为@MappedSuperClass的类将不会是一个完整的实体类,它将不会映射到数据库表,但是他的属性都将映射到其子类的数据库表字段中.
  • 标注为@MappedSuperClass的类不能再标注@Entity 和@Table注解,也无需实现序列化接口.

@NoRepositorybean

作用:一般用作父类的repository,有这个注解,spring不会去实例化该repository。


@Order

该注解规定了类在spring容器中的加载顺序.


@PathVariable

作用:获取参数.

 @RequestMapping(value = "/hello/{pageSize}", method = RequestMethod.GET)
    public String say(@PathVariable("pageSize") String pageSize) {
        return pageSize;
    }

@Qualifier

作用:当有多个同一类型的Bean时,可以使用@Qualifier(“name”)来指定,


@repository

用于标注数据访问层,也可以用于标注数据访问组件.


@Resource

作用:和@Autowired类似.

@Autowired() @Qualifier("baseDao")     
private BaseDao baseDao;
@Resource(name="baseDao")     
private BaseDao baseDao; 

@RestController

作用:该注解是@Controller 和 @ResponseBody 的集合,表示这是个控制器bean,并且将函数的返回值直接填入http响应体中.


@RestControllerAdvice


@service 注入dao


@SpringBootApplication

@SpringBootApplication :

该注解是一个复合注解,包括@ComponentScan,@SprongBootConfiguration,@EnableAutoConfiguration.

  • @ComponentScan 集成自@Configuration,两者功能也一致,标注当前类是配置类.并会将当前类内声明的一个或者多个@Bean 注解标记的方法的实例纳入到spring容器中,并且实例名称就是方法名称.
  • @EnableAutoConfiguration 作用是启动自动的配置,就是Springboot根据你添加的jar包来配置你项目的默认配置. 比如根据spring-boot-starter-web来判断你的项目是否添加了webmvc和tomcat,就会自动的帮你配置web项目中所需要的默认配置.
  • @ComponentScan扫描当前包以及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到Spring容器中进行管理. 相当于xml中的<context: component-scan>.

@Table

@Table : 通常用于jpa映射,如果类名字和表名称一样可以省略.


@Transient

作用:该属相并非一个到数据库表的字段的映射,ORM将忽略该属性,如果一个属性并非数据库表的字段映射.
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
  2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口

3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。


lombok

常用注解:

  • @Data :注解在类上,提供所有属性的getting和settings方法,此外还提供了 equals(),canEquals(),hashCode(),toString()方法.
  • @Setter :注解在属性上,为属性提供setting方法.
  • @Getter :注解在属相上,为属性提供getting方法.
  • @Log4j :注解在类上,为类提供一个属性名为log的日志对象.
  • @Slf4j :注解在类上,为类提供一个属性名为log的log4j日志对象.
  • @NoArgsConstructor : 注解在类上,为类提供无参构造方法.
  • @AllArgsConstructor : 注解在类上,为类提供全参构造方法.
  • @Accessors(chain = true): 支持链式调用.
  • @Builder 建造者模式.
  • 具体使用参考 :lombok使用

@Value

作用:注入application.properties 配置的属性值

@Value(value= "${message}")
private String message;

使用CommandLineRuuner接口

作用:

  • 实现在应用启动后,去执行相关代码逻辑,且只会执行一次;
  • spring batch 批量处理框架依赖这些执行器去触发执行任务.
  • 可以在run()方法里使用任何依赖,已经初始化结束.

猜你喜欢

转载自blog.csdn.net/weixin_42911069/article/details/88645716