@SpringBootApplication //标注这个类是一个springboot的应用
@Configuration //spring配置类
@Component //说明这也是一个spring的组件
@EnableAutoConfiguration //自动配置
@AutoConfigurationPackage //自动配置包
@Import(AutoConfigurationPackages.Registrar.class) //自动配置“包注册”
@Import(AutoConfigrationImportSelector.class) //自动配置导入选择
//获取所有的配置
List(String) configurations = getCandidateConfigurations(annotationMetadata, attributes);
META-INF/spring.factories:自动配置的核心文件
@Controller: controller控制器层(注入服务)
@Service : service服务层(注入dao)
@Repository : dao持久层(实现dao访问)
@Component //标注一个类为Spring容器的Bean,(把普通pojo实例化到spring容器中,相当于配置文件中的
public class Dog {}
@Value(“啊黄”) //对它的值进行注入
private String name;
@Autowired它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
<property name="属性名" value=" 属性值"/>
private User user;
https://www.w3cschool.cn/wkspring/rw2h1mmj.html
@ConfigurationProperties(prefix = “user”)// 获取到配置文件数据
public class User {
private String name;
private Integer age;
}
Application.yaml
user:
name: 张三
age: 12
//加载指定的配置文件
@PropertySource(value = "classpath:jiutou.properties")
public class User {
@Value("${name}") //注解从配置文件读取值的用法
private String name;
private Integer age;
}
@Validated //数据校验
public class User {
@Email(message="你的邮箱错误")//验证name是否是电子邮箱格式,想要验证必须有@Validated
private String name;
private Integer age;
@Email注解报红 是因为新版本需要validation启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
JSR303校验
@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;@Email(message="邮箱格式错误")
private String email;
空检查@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY. Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false 长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) string is between min and max included.
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
.......等等除此以外,我们还可以自定义一些数据校验规则
@override有什么用,以及加不加@override有什么区别
1.简单来说@override注解是告诉编译器,下面的方法是重写父类的方法
2.如果不写@override注解去直接重写方法,编译器是不会判断你是不是正确重写了父类中的方法的。如重写方法时参数与父类不同,程序是不会提示报错的。这会留下一个潜在的bug。当你写了@override注解时,程序会判断你是否正确的重写了父类的对应方法。而且加上此注解后,程序会自动屏蔽父类的方法。
//部门表
@Data //在类上时,简化java代码编写,为该类提供读写属性。简单来说使用这个注解,就不用再去手写getter,setter,equals, canequence,hasCode,toString等方法了,注解后在编译时会自动加进去.
@AllArgsConstructor //使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数
@NoArgsConstructor 使用后创建—个无参构造函数
public class Department {
private Integer id;
private String departmentName;
}
@Builder
关于Builder较为复杂一些,Builder的作用之一是为了解决在某个类有很多构造函数的情况,也省去写很多构造函数的麻烦,在设计模式中的思想是:用一个内部类去实例化一个对象,避免一个类出现过多构造函数
@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,
但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面。
如果是用@RestController ,请求之后返回的结果如下。
如果使用 @Controller,返回结果 如下;
@ResponseBody的作用其实是将java对象转为json格式的数据。
@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
这个注解表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用【也就是AJAX】。
在使用@RequestMapping后,返回值通常解析为跳转路径。加上@responsebody后,返回结果直接写入HTTP response body中,不会被解析为跳转路径。比如异步请求,希望响应的结果是json数据,那么加上@responsebody后,就会直接返回json数据。
@RequestParam
主要用于将请求参数区域的数据映射到控制层方法的参数上 首先我们需要知道@RequestParam注解主要有哪些参数 value:请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。比如上图中第一个参数如果不设置value=“page”,则前端传入的参数名必须为pageNum,否则在后台接口中pageNum将接收不到对应的数据 required:该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。 defaultValue:参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。注意默认值可以使用SpEL表达式,如"#{systemProperties[‘java.vm.version’]}" 如果在请求中传入多个同名参数,比如:url?userName=zhl&userName=holley时怎么办? 其实此时传入的数据格式是:“zhl,holley”,即多个数据之间使用逗号分隔开,在后台接口中可以使用数组或者list类型的变量来接收:
public Stringrequestparam8(@RequestParam(value=“userName”) String [] userNames)或者public Stringrequestparam8(@RequestParam(value=“list”) List list)
@PathVariable 映射 URL 绑定的占位符
• 带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义
• 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。
实例:
SpringMVCTest.java
1. //@PathVariable可以用来映射URL中的占位符到目标方法的参数中
2. @RequestMapping("/testPathVariable/{id}")
3. public String testPathVariable(@PathVariable("id") Integer id)
4. {
5. System.out.println("testPathVariable:"+id);
6. return SUCCESS;
7. }
index.jsp
<a href="springmvc/testPathVariable/1">testPathVariable</a>
@Transactional注解详细使用
一、@Transactional 注解使用注意事项
@Tranasctional注解是Spring 框架提供的声明式注解事务解决方案,我们在开发中使用事务保证方法对数据库操作的原子性,要么全部成功,要么全部失败,在使用@Transactional注解时需要注意以下问题:
1. @Transactional 注解只能用在public 方法上,如果用在protected或者private的方法上,不会报错,但是该注解不会生效。
2. @Transactional注解只能回滚非检查型异常,具体为RuntimeException及其子类和Error子类,可以从Spring源码的DefaultTransactionAttribute类里找到判断方法rollbackOn。
@Override
public boolean rollbackOn(Throwable ex) {
return (ex instanceof RuntimeException || ex instanceof Error);
}
3. 使用rollbackFor 属性来定义回滚的异常类型,使用 propagation 属性定义事务的传播行为。如: 回滚Exception类的异常,事务的传播行为支持当前事务,当前如果没有事务,那么会创建一个事务。
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
4. @Transactional注解不能回滚被try{}catch() 捕获的异常。
5. @Transactional注解只能对在被Spring 容器扫描到的类下的方法生效。
其实Spring事务的创建也是有一定的规则,对于一个方法里已经存在的事务,Spring 也提供了解决方案去进一步处理存在事务,通过设置@Tranasctional的propagation 属性定义Spring 事务的传播规则。