springCloud 使用注解整理
文章目录
- springCloud 使用注解整理
- @Autowried
- @Column
- @Component
- @ComponentScan
- @Conditional
- @Configuration
- @controller 注入服务层
- @ControllerAdvice
- @EnableConfigServer
- @EnableDiscoveryclient
- @Entity
- @ExcludeComponent
- @GeneratedValue
- @Import
- @ImportResource
- @Ingect
- @JSONField
- @JsonIgnore
- @MappedSuperClass
- @NoRepositorybean
- @Order
- @PathVariable
- @Qualifier
- @repository
- @Resource
- @RestController
- @RestControllerAdvice
- @service 注入dao
- @SpringBootApplication
- @Table
- @Transient
- lombok
- @Value
- 使用CommandLineRuuner接口
@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 中定义了以下几种方式:
- IDENTITY:采用数据库自增长的方式来自增主键字段,oracle不支持.
- AUTO:JPA自动选择合适的策略.
- SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,mysql不支持.
- 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()方法里使用任何依赖,已经初始化结束.