@Controller
@RestController == @Controller+@ResponseBody
@Service @Service(value="goodClubService")
@Repository
@Component
---------------
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
String value() default "";
}
@Autowired
用于为类的属性、构造器、方法进行注值
如果要允许null值 @Autowired(required=false)
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD,
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}
@Autowired(required = false) 改变默认方式
@Qualifier("goodClubService")
@Resource
@Resource(name = "HappyClient")
private HappyClient happyClient;
@Resource(type = HappyPlayAno.class)
private HappyPlayAno happyPlayAno;
@Autowired只按照Type 注入;@Resource默认按Name自动注入,也提供按照Type 注入
@Inject:等价于默认的@Autowired,只是没有required属性;
@Qualifier
@Scope
默认值是单例
1、singleton:单例模式,全局有且仅有一个实例
2、prototype:原型模式,每次获取Bean的时候会有一个新的实例
3、request:request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
4、session:session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
5、global session:只在portal应用中有用,给每一个 global http session 新建一个Bean实例。
@RequestMapping
@RequestParam
@PathVariable获取参数。
@RequestMapping(value="/happy/{dayid}",method=RequestMethod.GET)
public String findPet(@PathVariable String dayid, Model mode) {
}
@RequestBody是指方法参数应该被绑定到HTTP请求Body上。
@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body,@RequestBody User user){
}
@Transactional
<!-- 开启注解方式声明事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
@Service
public class CompanyServiceImpl implements CompanyService {
@Autowired
private CompanyDAO companyDAO;
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
public int deleteByName(String name) {
int result = companyDAO.deleteByName(name);
return result;
}
...
}
事务传播行为类型 说明
propagation_required 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
propagation_supports 支持当前事务,如果当前没有事务,就以非事务方式执行。
propagation_requires_new 新建事务,如果当前存在事务,把当前事务挂起。
propagation_not_supported 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
propagation_mandatory 使用当前的事务,如果当前没有事务,就抛出异常。
propagation_never 以非事务方式执行,如果当前存在事务,则抛出异常
propagation_nested 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类 似的操作
readOnly : 事务的读写属性,取true或者false,true为只读、默认为false
rollbackFor : 回滚策略,当遇到指定异常时回滚。譬如上例遇到异常就回滚
timeout (补充的) : 设置超时时间,单位为秒
isolation : 设置事务隔离级别,枚举类型,一共五种
default 采用数据库默认隔离级别
read_uncommitted 读未提交的数据(会出现脏读取)
read_committed 读已提交的数据(会出现幻读,即前后两次读的不一样)
repeatable_read 可重复读,会出现幻读
serializable 串行化 (对资源消耗较大,一般不使用)
@ModelAttribute
1、标记在方法上。
标记在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中。
(1) 在有返回的方法上:
当ModelAttribute设置了value,方法返回的值会以这个value为key,以参数接受到的值作为value,存入到Model中,
如下面的方法执行之后,最终相当于 model.addAttribute("user_name", name);假如 @ModelAttribute没有自定义value,则相当于
model.addAttribute("name", name);
(2) 在没返回的方法上:
2、标记在方法的参数上。
标记在方法的参数上,会将客户端传递过来的参数按名称注入到指定对象中,
并且会将这个对象自动加入ModelMap中,便于View层使用.
@Cacheable
用来标记缓存查询。可用用于方法或者类中,
当标记在一个方法上时表示该方法是支持缓存的,
当标记在一个类上时则表示该类所有的方法都是支持缓存的。
如@Cacheable(value="UserCache") 标识的是当调用了标记了这个注解的方法时,逻辑默认加上从缓存中获取结果的逻辑,
如果缓存中没有数据,则执行用户编写查询逻辑,查询成功之后,同时将结果放入缓存中。
但凡说到缓存,都是key-value的形式的,因此key就是方法中的参数(id),value就是查询的结果,而命名空间UserCache是在spring*.xml中定义.
@CacheEvict
用来标记要清空缓存的方法,当这个方法被调用后,即会清空缓存。@CacheEvict(value=”UserCache”)
@SessionAttributes
默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中
参数:
1、names:这是一个字符串数组。里面应写需要存储到session中数据的名称。
2、types:根据指定参数的类型,将模型中对应类型的参数存储到session中
3、value:和names是一样的。
@Required
@PostConstruct
@PreDestroy
@ComponentScan
value(basePackages) 属性指定要扫描的包路径,多个用逗号分割。
basePackageClasses 属性指定class做扫描。
nameGenerator 属性指定beanName命名策略。
scopeResolver 属性指定从definition中解析出scope元信息的方式。
scopedProxy 指定缺省的scopedProxy,决定不同scope之间的连接方式。
resourcePattern 模糊匹配scan的文件。
useDefaultFilters 是否使用默认的探测注解 ( 默认探测注解含@Component和被@Component修饰的注解 )
@ComponentScan(basePackages = "com.concretepage",
includeFilters = @Filter(type = FilterType.REGEX, pattern="com.concretepage..Util"),
excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = IUserService.class))
excludeFilters排除的Filter。
@PropertySource
作用在类上,加载指定路径资源到Environment,从而实现注入。
name属性指定propertySource资源名称,缺省是空,会自动生成。
value属性指定资源路径,必填,可以是"classpath:/com/myco/app.properties" or "file:/path/to/file"
@Conditional
作用在类和方法上,决定@Component(含子注解)和@Bean是否需要被加载。@Confitional的value属性是一
组实现Condition接口的类,
@Profile
修饰类或方法,用于分类偏好(如区分环境),应用启动时决定启用哪些profile。
@Lazy
Lazy注解作用于很广,能和很多注解配合使用,用于标记是否延迟加载
@DependsOn
标记是否依赖加载。
@Order
定义顺序,值越小优先级越高,支持负数。
@Value
<context:property-placeholder location="classpath:test.properties" />
@Value(“${wx_appid}”)
publicString appid;
@PostConstruct 和 @PreDestory
实现初始化和销毁bean之前进行的操作,只能有一个方法可以用此注释进行注释,
方法不能有参数,返回值必需是void,方法需要是非静态的。
public class TestService {
@PostConstruct
public void init(){
System.out.println("初始化");
}
@PreDestroy
public void dostory(){
System.out.println("销毁");
}
}
Constructor > @PostConstruct >InitializingBean > init-method
@Primary
自动装配时当出现多个Bean候选者时,
被注解为@Primary的Bean将作为首选者,否则将抛出异常。
@Component
public class Apple implements Fruit{
@Override
public String hello() {
return "我是苹果";
}
}
@Component
@Primary
public class Pear implements Fruit{
@Override
public String hello(String lyrics) {
return "梨子";
}
}
public class FruitService {
@Autowired
private Fruit fruit;
public String hello(){
return fruit.hello();
}
}
全部参数校验如下:
空检查
@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=)验证注解的元素值长度在min和max区间内
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
@Min(value=””) 验证 Number 和 String 对象是否大等于指定的值
@Max(value=””) 验证 Number 和 String 对象是否小等于指定的值
@DecimalMax(value=值) 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin(value=值) 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits 验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=)验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range(min=, max=) 检查数字是否介于min和max之间.
@Range(min=10000,max=50000,message=”range.bean.wage”)
private BigDecimal wage;
@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,
如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber信用卡验证
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert(lang=,script=, alias=)
@URL(protocol=,host=,port=,regexp=, flags=)
@Validated
@Valid是对javabean的校验,如果想对使用@RequestParam方式接收参数方式校验使用@Validated
使用@Validated的步骤:
第一步:定义全局异常,让该全局异常处理器能处理所以验证失败的情况,并返回给前台失败提示数据。如下,该类不用在任何xml里配置。
import javax.validation.ValidationException;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
@ControllerAdvice
@Component
public class GlobalExceptionHandler {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
@ExceptionHandler
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handle(ValidationException exception) {
System.out.println("bad request, " + exception.getMessage());
return "bad request, " + exception.getMessage();
}
}
第二步。在XXController.java头上添加@Validated,然后在@RequestParam后台使用上面介绍的验证注解,比如@NotBlank,@Rank.
@Controller
@RequestMapping("/test")
@Validated
public class TestController extends BaseController {
@RequestMapping(value = "testValidated", method = RequestMethod.GET)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Object testValidated(@RequestParam(value = "pk", required = true) @Size(min = 1, max = 3) String pk,
@RequestParam(value = "age", required = false) @Range(min = 1, max = 3) String age) {
try {
return "pk:" + pk + ",age=" + age;
} catch (Throwable t) {
return buildFailure("消息列表查询失败");
}
}
}
@CrossOrigin
是Cross-Origin ResourceSharing(跨域资源共享)的简写
作用是解决跨域访问的问题,在Spring4.2以上的版本可直接使用。在类上或方法上添加该注解
@CrossOrigin
public class TestController extends BaseController {
XXXX
}
@PathVariable,@RequestHeader,@CookieValue,@RequestParam, @RequestBody,@SessionAttributes, @ModelAttribute;
@Controller
@RequestMapping("/owners/{a}")
public class RelativePathUriTemplateController {
@RequestMapping("/pets/{b}")
public void findPet(@PathVariable("a") String a,@PathVariable String b, Model model) {
}
}
@RequestHeader,@CookieValue: 处理request header部分的注解
@RequestMapping("/test")
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive")long keepAlive) {
}
@RequestMapping("/test")
public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie) {
}
@ResponseStatus
@ResponseStatus用于修饰一个类或者一个方法,
修饰一个类的时候,一般修饰的是一个异常类,
当处理器的方法被调用时,@ResponseStatus指定的code和reason会被返回给前端。
value属性是http状态码,比如404,500等。reason是错误信息
当修改类或方法时,只要该类得到调用,那么value和reason都会被添加到response里
@ResponseStatus(value=HttpStatus.FORBIDDEN, reason="出现了错误")
public class UserException extends RuntimeException{
XXXXX
}
ControllerAdvice
@Component
public class GlobalExceptionHandler {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
@ExceptionHandler
@ResponseBody
@ResponseStatus(value=HttpStatus.BAD_REQUEST,reason="哈哈")
public String handle(ValidationException exception) {
System.out.println("bad request, " + exception.getMessage());
return "bad request, " + exception.getMessage();
}
}
元注解包括 @Retention @Target @Document @Inherited四种
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {
XXX
}
@Retention: 定义注解的保留策略:
@Retention(RetentionPolicy.SOURCE)
@Retention(RetentionPolicy.CLASS)
@Retention(RetentionPolicy.RUNTIME)
@Target:定义注解的作用目标:
@Target(ElementType.TYPE)
@Target(ElementType.FIELD)
@Target(ElementType.METHOD)
@Target(ElementType.PARAMETER)
@Target(ElementType.CONSTRUCTOR)
@Target(ElementType.LOCAL_VARIABLE)
@Target(ElementType.ANNOTATION_TYPE)
@Target(ElementType.PACKAGE)
由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等
@RequestMapping
value, method:
value:指定请求的实际地址,指定的地址可以是URI Template 模式;
method:指定请求的method类型, GET、POST、PUT、DELETE等;
value的uri值为以下三类:
A) 可以指定为普通的具体值;如@RequestMapping(value =”/testValid”)
B) 可以指定为含有某变量的一类值;如@RequestMapping(value=”/{day}”)
C) 可以指定为含正则表达式的一类值;如@RequestMapping(value=”/{textualPart:[a-z-]+}.{numericPart:[\\d]+}”) 可以匹配../chenyuan122912请求。
2、 consumes,produces:
consumes: 指定处理请求的提交内容类型(Content-Type),例如@RequestMapping(value = ”/test”, consumes=”application/json”)处理application/json内容类型
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
params、headers:
params: 指定request中必须包含某些参数值是,才让该方法处理。
@RequestMapping(value = "/test", method = RequestMethod.GET, params="name=chenyuan")
public void findOrd(String name) {
}
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
@RequestMapping(value = "/test", method = RequestMethod.GET, headers="Referer=www.baidu.com")
public void findOrd(String name) {
}
@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。
@JsonBackReference解决嵌套外链问题。
@RepositoryRestResourcepublic配合spring-boot-starter-data-rest使用。
@EnableAutoConfiguration
可以将@EnableAutoConfiguration或者@SpringBootApplication注解添加到一个@Configuration类上来选择自动配置。
如果发现应用了你不想要的特定自动配置类,你可以使用@EnableAutoConfiguration注解的排除属性来禁用它们。
@Configuration:相当于传统的xml配置文件
@ImportResource注解加载xml配置文件
@Entity:@Table(name=”“):表明这是一个实体类。一般用于jpa这两个注解一般一块使用,但是如果表名和实体类名相同的话,@Table可以省略
@MappedSuperClass:用在确定是父类的entity上。父类的属性子类可以继承。
@NoRepositoryBean:一般用作父类的repository,有这个注解,spring不会去实例化该repository。
@Column:如果字段名与列名相同,则可以省略。
@Id:表示该属性为主键。
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = “repair_seq”):表示主键生成策略是sequence(可以为Auto、IDENTITY、native等,Auto表示可在多个数据库间切换),指定sequence的名字是repair_seq。
@SequenceGeneretor(name = “repair_seq”, sequenceName = “seq_repair”, allocationSize = 1):name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致。
@Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic。@Basic(fetch=FetchType.LAZY):标记可以指定实体属性的加载方式
@JsonIgnore:作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。
@JoinColumn(name=”loginId”):一对一:本表中指向另一个表的外键。一对多:另一个表指向本表的外键。
@OneToOne、@OneToMany、@ManyToOne:对应hibernate配置文件中的一对一,一对多,多对一。
全局异常处理
@ControllerAdvice:包含@Component。可以被扫描到。统一处理异常。
@ExceptionHandler(Exception.class):用在方法上面表示遇到这个异常就执行以下方法。