20200812 spring注解

@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) {
     //使用@PathVariable注解绑定 {dayid} 到String dayid
  }

@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或者falsetrue为只读、默认为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 { 

  //Fruit有2个实例子类,因为梨子用@Primary,那么会使用Pear注入
    @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) {     
    // implementation omitted 
  } 
}

@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状态码,比如404500等。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)   //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS)     //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME)  //注解会在class字节码文件中存在,在运行时可以通过反射获取到

@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) {      
    // implementation omitted  
  }
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
@RequestMapping(value = "/test", method = RequestMethod.GET, headers="Referer=www.baidu.com")  
  public void findOrd(String name) {      
    // implementation omitted  
  }
 



@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):用在方法上面表示遇到这个异常就执行以下方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值