疯狂的小鸡

Spring常用注解

字数统计: 2.3k阅读时长: 8 min
2018/10/02 Share

资料性内容,请善用Ctrl+F

bean注解

开启注解创建bean
<context:component-scan base-package=”cn.java.*“/>

@Controller:注册一个bean到spring(一般用于Controller层)
@Service:注册一个bean到spring(一般用于service层)
@Repository:注册一个bean到spring(一般用于dao层)
@Component (不推荐使用):注册一个bean到spring,一般使用前三个来指示不同层的bean
这四个表示作用一致,其区别是区分创建的层次,暂时没有功能上的意义。Bean的ID默认使用类名首字母小写。

@Scope
在使用XML 定义Bean 时,可以通过bean 的scope 属性来定义一个Bean 的作用范围,同样可以通过@Scope 注解来完成
@Scope中可以指定如下值:
singleton:定义bean的范围为每个spring容器一个实例(默认值)
prototype:定义bean可以被多次实例化(使用一次就创建一次)
request:定义bean的范围是http请求(springMVC中有效)
session:定义bean的范围是http会话(springMVC中有效)
global-session:定义bean的范围是全局http会话(portlet中有效)

注入注解

开启注解注入
<context:annotation-config/>

@Required
@Required注解用于bean属性的setter方法,它表明受影响的bean属性在配置时必须放在XML文件中,否则容器会抛出一个BeanInitializationException异常

@Autowired
@Autowired注解对它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作
默认情况下,@Autowired 注释意味着依赖是必须的,它类似于 @Required 注释,然而,你可以使用 @Autowired 的 (required=false) 选项关闭默认行为。
@Autowired(required=false)
Object o = new Object();
表示,如果spring 上下文中没有找到该类型的bean 时, 才会使用new Object();
@Autowired根据bean 类型从spring 上线文中进行查找,注册类型必须唯一,否则报异常。
@Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 id 或 name 作为 Map 的 key。
@Autowired 还有一个作用就是,如果将其标注在 BeanFactory 类型、ApplicationContext 类型、ResourceLoader 类型、ApplicationEventPublisher 类型、MessageSource 类型上,那么 Spring 会自动注入这些实现类的实例,不需要额外的操作。

@Qualifier
使用@Autowired 时,如果找到多个同一类型的bean,则会抛异常,此时可以使用 @Qualifier(“beanName”),明确指定bean的名称进行注入,此时与 @Resource指定name属性作用相同。通常在一个接口有多个实现的情况下使用。

@PostConstruct
在方法上加上注解@PostConstruct ,这个方法就会在Bean 初始化之后被Spring 容器执行

@PreDestroy
在方法上加上注解@PreDestroy ,这个方法就会在Bean 被销毁前被Spring 容器执行。

请求和参数型注解

@RequestMapping:用于处理请求地址映射,可以作用于类和方法上。

@RequestParam:作用于参数,用于获取传入参数的值
value:指定参数的名称
required:定义该传入参数是否必须,默认为true

@ResponseBody:作用于方法上,可以将整个返回结果以某种格式返回,如json或xml格式。

@CookieValue:作用于参数,用于获取请求的Cookie值
public String requestParams(@CookieValue(“JSESSIONID”) String cookie)

@PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
@PathVariable(“xxx”) 绑定到操作方法的入参中。
@RequestMapping(“/edit/{id}/{name}”)
public String edit(@PathVariable long id,@PathVariable String name) {

@ModelAttribute:用于把参数保存到model中, 可作用于方法或参数,注解在方法上的时候,该方法将在处理器方法执行之前执行,然后把返回的对象存放在 session(前提时要有@SessionAttributes注解) 或模型属性中,@ModelAttribute(“attributeName”) 在标记方法的时候指定,若未指定,则使用返回类型的类名称(首字母小写)作为属性名称。

@SessionAttributes
默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中。配合@ModelAttribute(“user”)使用的时候,会将对应的名称的model值存到session中。
一般注解在类上,指定该类哪些属性需要存到session中
@SessionAttributes(value = {“user”,”password”})

AOP注解

开启AOP注解
<aop:aspectj-autoproxy/>

@Aspect
用于声明一个类,表明该类中的方法是切面方法

@Pointcut声明切入点
@pointcut(execution( cn.java.controller..*(..)))
在@Aspect声明的类中声明哪些类和方法是需要加入切点

@Before之前通知
@Before(“方法名()”)

@After之后通知
@After(“方法名()”)

@AfterReturning后置通知
@AfterReturning(pointcut = “方法名()”, returning=”retVal”)

@AfterThrowing
异常通知
@AfterThrowing(pointcut = “方法名()”, throwing=”ex”)

@Around
环绕通知
@Around(“方法名()”)

Transaction注解(事务)

开启事务注解
<bean id=”txManager” class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>
        <property name=”dataSource” ref=”dataSource” />
</bean>
<tx:annotation-driven transaction-manager=”txManager” />

@Transactional
@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

缓存注解

开启注解
<cache:annotation-driven/>

@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来。 @Cacheable可以指定三个属性,key、value和condition。

默认的key生成策略是通过KeyGenerator生成的,其默认策略如下:
如果方法没有参数,则使用0作为key。
如果只有一个参数的话则使用该参数作为key。
如果参数多余一个的话则使用所有参数的hashCode作为key。
自定义策略:
@Cacheable(key=”#id”)指定id参数id为key
@Cacheable(key=”#p0”)指定传入的第一个参数为key

value 表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。其可以是一个Cache也可以是多个Cache,当需要指定多个Cache时其是一个数组。

@Cacheable(“cache1”) Cache是发生在cache1上的
@Cacheable({“cache1”, “cache2”}) Cache是发生在cache1和cache2上的

有的时候我们可能并不希望缓存一个方法所有的返回结果。通过condition属性可以实现这一功能。condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。如下示例表示只有当user的id为偶数时才会进行缓存。
@Cacheable(value={“users”}, key=”#user.id”, condition=”#user.id%2==0”)

@CachePut
也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

@CacheEvict
是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。

allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。

beforeInvocation清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。

@Caching注解可以让我们在一个方法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。

格式化注解

@DateTimeFormat(pattern=”yyyy-MM-ddHH:mm:ss”)
加在javaBean属性上,将String转换成Date,一般前台给后台传值时用

@JsonFormat(pattern=”yyyy-MM-ddHH:mm:ss”)
加在javaBean属性get方法上,将时间数据转为json数据,将Date转换成String 一般后台传值给前台时

CATALOG
  1. 1. bean注解
  2. 2. 注入注解
  3. 3. 请求和参数型注解
  4. 4. AOP注解
  5. 5. Transaction注解(事务)
  6. 6. 缓存注解
  7. 7. 格式化注解