Spring 常用注解

38 篇文章 0 订阅

 

1、Spring

@Bean

使用@Bean 注解表明myBean需要交给Spring进行管理,未指定bean 的名称,默认采用的是 "方法名" + "首字母小写"的配置方式

@Autowired

注解(不推荐使用,建议使用@Resource) @Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。@Autowired的标注位置不同,它们都会在Spring在初始化这个bean时,自动装配这个属性。

@Qualifier

@Autowired是根据类型进行自动装配的。例如,如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题。如下:

1). 可能存在多个UserDao实例;2). 可能不存在UserDao实例

@Resource

JSR-250标准注解,推荐使用它来代替Spring专有的@Autowired注解。@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按byName自动注入罢了。@Resource有两个属性是比较重要的,分别是name和type,Spring将 @Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

@Resource装配顺序:

a.如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常

b.如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常

c.如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常

d.如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配;

@PostConstruct

JSR-250注解 在方法上加上注解@PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行(注:Bean初始化包括,实例化Bean,并装配Bean的属性(依赖注入))。它的一个典型的应用场景是,当你需要往Bean里注入一个其父类中定义的属性,而你又无法复写父类的属性或属性的setter方法时。

@PreDestroy

JSR-250注解 在方法上加上注解@PreDestroy,这个方法就会在Bean初始化之后被Spring容器执行。其用法同@PostConstruct。和@PostConstruct 区别在于:@PostConstruct注释的方法将在类实例化后调用,而标注了 @PreDestroy 的方法将在类销毁之前调用。

@Component

(不推荐使用) 只需要在对应的类上加上一个@Component注解,就将该类定义为一个Bean了。Spring还提供了更加细化的注解形式:@Repository、@Service、@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean。目前版本(2.5)中,这些注解与@Component的语义是一样的,完全通用,在Spring以后的版本中可能会给它们追加更多的语义。所以,我们推荐使用@Repository、@Service、@Controller来替代@Component。

@Scope

在使用XML定义Bean时,我们可能还需要通过bean的scope属性来定义一个Bean的作用范围,我们同样可以通过@Scope注解来完成这项工作

@Transactional

也就是说,当抛出个RuntimeException 或其子类例的实例时。(Errors也一样 - 默认地 - 标识事务回滚。)

指定回滚:@Transactional(rollbackFor=Exception.class)

指定不回滚:@Transactional(noRollbackFor=RuntimeException.class)

如果有事务,那么加入事务,没有的话新建一个(不写的情况下):@Transactional(propagation=Propagation.REQUIRED)

容器不为这个方法开启事务:@Transactional(propagation=Propagation.NOT_SUPPORTED)

不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务:@Transactional(propagation=Propagation.REQUIRES_NEW) 

必须在一个已有的事务中执行,否则抛出异常:@Transactional(propagation=Propagation.MANDATORY)

必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反):@Transactional(propagation=Propagation.NEVER)

如果其他bean调用这个方法,在其他bean中声明事务,那就用事务。如果其他bean没有声明事务,那就不用事务:@Transactional(propagation=Propagation.SUPPORTS)

如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于REQUIRED:@Transactional(propagation=Propagation.NESTED)

readOnly=true只读,不能更新,删除:@Transactional (propagation = Propagation.REQUIRED,readOnly=true)

设置超时时间:@Transactional (propagation = Propagation.REQUIRED,timeout=30)

设置数据库隔离级别:@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)

@CrossOrigin

@CrossOrigin(origins = "", maxAge = 1000) 这个注解主要是为了解决跨域访问的问题。这个注解可以为整个controller配置启用跨域,也可以在方法级别启用。

@Controller

使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为"userAction"的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,则使用value作为bean的名字。

@Service

@Service("userService")注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Action:在Action只需要声明一个名字叫“userService”的变量来接收由Spring注入的"userService"即可

@Repository

@Repository(value="userDao")注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = "userDao")注解告诉Spring,Spring把创建好的userDao注入给Service即可。

@RequestMapping

我们可以 @RequestMapping 注解将类似 “/favsoft”这样的URL映射到整个类或特定的处理方法上。一般来说,类级别的注解映射特定的请求路径到表单控制器上,而方法级别的注解只是映射为一个特定的HTTP方法请求(“GET”,“POST”等)或HTTP请求参数。

@PathVariable

在Spring MVC中,可以使用 @PathVariable 注解方法参数并将其绑定到URI模板变量的值上

@RequestParam

@RequestParam将请求的参数绑定到方法中的参数上,如下面的代码所示。其实,即使不配置该参数,注解也会默认使用该参数。如果想自定义指定参数的话,如果将@RequestParam的 required 属性设置为false(如@RequestParam(value="id",required=false))。

@RequestBody

@RequestMapping(value = "/something", method = RequestMethod.PUT)public void handle(@RequestBody String body, Writer writer) throws IOException {
    writer.write(body);
}

@RequestBody是指方法参数应该被绑定到HTTP请求Body上。如果觉得@RequestBody不如@RequestParam趁手,我们可以使用 HttpMessageConverter将request的body转移到方法参数上, HttMessageConverser将 HTTP请求消息在Object对象之间互相转换,但一般情况下不会这么做。事实证明,@RequestBody在构建REST架构时,比@RequestParam有着更大的优势。

@ResponseBody

@ResponseBody与@RequestBody类似,它的作用是将返回类型直接输入到HTTP response body中。@ResponseBody在输出JSON格式的数据时,会经常用到。

@RestController 

我们经常见到一些控制器实现了REST的API,只为服务于JSON,XML或其它自定义的类型内容,@RestController用来创建REST类型的控制器,与@Controller类型。@RestController就是这样一种类型,它避免了你重复的写@RequestMapping与@ResponseBody。

@HttpEntity

HttpEntity除了能获得request请求和response响应之外,它还能访问请求和响应头。

@ModelAttribute

ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。该方法支持与@RequestMapping一样的参数类型,但并不能直接映射成请求。控制器中的@ModelAttribute方法会在@RequestMapping方法调用之前而调用。

2、缓存注解

@EnableCaching

开启缓存注解的支持

@CacheConfig

用于统一制定一些配置参数,这样在其他缓存注解里面就不用重复指定

@Cacheable

如果之前已经有缓存数据值直接返回缓存数据,否则执行方法,缓存方法的返回结果

@CachePut

能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用

@CacheEvict

能够根据一定的条件对缓存进行清空

@Caching

组合多个Cache注解使用

3、SpringBoot

@SpringBootApplication

查看源码可发现,@SpringBootApplication是一个复合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解。

@SpringBootConfiguration

标注当前类是配置类,这个注解继承自@Configuration。并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。

@EnableAutoConfiguration

是自动配置的注解,这个注解会根据我们添加的组件jar来完成一些默认配置,我们做微服时会添加spring-boot-starter-web这个组件jar的pom依赖,这样配置会默认配置springmvc和tomcat。

@ComponentScan

扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。等价于<context:component-scan>的xml配置文件中的配置项。

@ServletComponentScan

Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,这样通过注解servlet ,拦截器,监听器的功能而无需其他配置,所以这次相中使用到了filter的实现,用到了这个注解。

@MapperScan

spring-boot支持mybatis组件的一个注解,通过此注解指定mybatis接口类的路径,即可完成对mybatis接口的扫描。

@ImportResource、@Import、@PropertySource

这三个注解都是用来导入自定义的一些配置文件。

4、JPA

@Entity

声明该类为持久类。将一个Javabean类声明为一 个实体的数据库表映射类,最好实现序列化.此时,默认情况下,所有的类属性都为映射到数据表的持久性字段.若在类中,添加另外属性,而非映射来数据库的, 要用下面的Transient来注解.

@Table(name="promotion_info") 

持久性映射的表(表名="promotion_info).@Table是类一级的注解,定义在@Entity下,为实体bean映射表,目录和schema的名字,默认为实体bean的类名,不带包名.

@Id 注释可以表明哪种属性是该类中的独特标识符(即相当于数据表的主键)。 

@GeneratedValue 定义自动增长的主键的生成策略. 

@Transient

将忽略这些字段和属性,不用持久化到数据库.适用于,在当前的持久类中,某些属性不是用于映射到数据表,而是用于其它的业务逻辑需要,这时,须将这些属性进行transient的注解.否则系统会因映射不到数据表相应字段而出错. 

@Temporal(TemporalType.TIMESTAMP) 声明时间格式 

@Enumerated 声明枚举 

@Version 声明添加对乐观锁定的支持 

@OneToOne 可以建立实体bean之间的一对一的关联 

@OneToMany 可以建立实体bean之间的一对多的关联 

@ManyToOne  可以建立实体bean之间的多对一的关联 

@ManyToMany 可以建立实体bean之间的多对多的关联 

@Formula 一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等) 

@OrderBy Many端某个字段排序(List)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值