作用:自动导入依赖的bean.
把配置好的Bean拿来用,完成属性,方法的组装,它可以对类成员变量,方法及构造函数进行标注,完成自动装配的工作.加上(required = false)时,找不到Bean也不会报错.
@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:**把普通的pojo实例化到spring容器中,相当于配置 文件中的
< bean id ="" class = “”/>
注意:@component 可以通过实现CommandLineRunner接口来在程序执行后紧跟着实现一些基础功能.
@ComponentScna:
组件可以发现和装配一些Bean.主要就是定义扫描路径从中找出标识了需要装配的类自动装配到spring 的容器中.
总结如下:
这是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类.
相关注解:
点此链接
@Configuration:
可以理解为使用spring时候的 标签.
@Bean
可以理解为使用spring时候的标签.
注意:
@Component 和@Configuration都可以作为配置类,不同点是使用@Configuration会在spring容器中创建一个对象,使用的时候一样,但是@Component使用时是不同的对象.
作用:通过@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:表明这是一个Config server端.
@EnableDiscoveryclient:
作用:
@EnableDiscoveryClient 注解是基于spring-cloud-commons依赖,并且在classpath中实现:
@EnableEurekaClient注解是基于spring-cloud-netflix依赖,只能为eureka作用.
如果注册中心是eureka,那么推荐使用@EnableEurekaClient,如果是其他注册中心,那么推荐使用@EnableDiscoveryClient
@Entity : 表明该类是一个实体类.
作用:@ExcludeComponent,被此注解注解的类不会被@ComponentScan扫描到.
@Generatedvalue:
作用:用于标注主键的生成策略,通过strategy属性指定.默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略:SqlServer 对应的identity,mysql对应的auto increment.
在javax.persistence.GenerationType 中定义了以下几种方式:
作用:用来导入其他配置类.
作用:用来加载xml配置文件.
作用:等价与默认的@Autowired,只是没有required属性;
@JSONField :
作用:
@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:
作用:在接送序列化时将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;
}
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;
}
@JSONField(format="yyyy-MM-dd HH:mm:ss")
@Column(columnDefinition="timestamp default current_timestamp comment '创建时间'")
private Date createTime;
@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;
作用:
作用:一般用作父类的repository,有这个注解,spring不会去实例化该repository。
该注解规定了类在spring容器中的加载顺序.
作用:获取参数.
@RequestMapping(value = "/hello/{pageSize}", method = RequestMethod.GET)
public String say(@PathVariable("pageSize") String pageSize) {
return pageSize;
}
作用:当有多个同一类型的Bean时,可以使用@Qualifier(“name”)来指定,
用于标注数据访问层,也可以用于标注数据访问组件.
作用:和@Autowired类似.
@Autowired() @Qualifier("baseDao")
private BaseDao baseDao;
@Resource(name="baseDao")
private BaseDao baseDao;
作用:该注解是@Controller 和 @ResponseBody 的集合,表示这是个控制器bean,并且将函数的返回值直接填入http响应体中.
@SpringBootApplication :
该注解是一个复合注解,包括@ComponentScan,@SprongBootConfiguration,@EnableAutoConfiguration.
@Table : 通常用于jpa映射,如果类名字和表名称一样可以省略.
作用:该属相并非一个到数据库表的字段的映射,ORM将忽略该属性,如果一个属性并非数据库表的字段映射.
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
常用注解:
作用:注入application.properties 配置的属性值
@Value(value= "${message}")
private String message;
作用:@WlshlyConfiguration 是@Configuration 和 @ComponentScan的组合注解,可以替代这两个注解。
作用: