Spring相关常用注解使用说明

By timebusker on August 21, 2018

Servlet常用注解

@PreDestroy与@PostConstruct
  • SpringBean的初始化流程
    • start: 开始
    • Spring容器加载
    • 调用构造函数
    • @PostConstruct方法调用
    • init()调用
    • 其他代码
    • destroy()调用
    • @PreDestroy方法调用
    • end: 结束
  • PostConstruct批注用于需要依赖注入完成以执行任何初始化之后需要执行的方法上。在类投入使用之前必须调用此方法。 所有支持依赖注入的类都必须支持该注释。即使该类不要求注入任何资源,也必须调用用PostConstruct注释的方法。

@PostConstruct方法是在Servlet init()方法之前构造方法调用之后执行的

@PostConstruct的注意事项有: + 除了拦截器的情况外,该方法不得具有任何参数,在这种情况下,该方法将采用Interceptors规范定义的InvocationContext对象 + 在拦截器里定义的方法必须满足下面两种方式:void (InvocationContext)Object (InvocationContext) throws Exception + 在非拦截器里定义的方法必须满足这种形式:void () + 应用PostConstruct的方法可以用 publicprotectedpackage privateprivate修饰 + 除了应用程序客户端,该方法一定不能是静态的 + 方法可能是用final修饰的 + 如果该方法抛出未经检查的异常,则该类不得投入使用,除非在EJB可以处理异常甚至从异常中恢复的EJB情况下

  • @PreDestroy 注解在方法上用作回调通知,以表明实例正在被容器删除。带有@PreDestroy 注解的方法通常用于释放它一直持有的资源。 除Java EE 5中的应用程序客户端容器外,所有支持PostConstruct的容器管理对象都必须支持此注释。

@PreDestroy的注意事项有: + 同@PostConstruct

  • @Inject

需要导入javax.inject的包,和Autowired的功能一样。没有required=false的功能;

  • @Resource

可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的; 但是没有能支持@Primary功能没有支持@Autowired(reqiured=false);

Spring常用注解

  • @Primary

让Spring进行自动装配的时候,默认使用首选的Bean。

  • @Qualifier

使用@Qualifier指定需要装配的组件的id。

  • @Profile

指定组件在哪个环境的情况下才能被注册到容器中,不指定则在任何环境下都能注册这个组件。

+ 加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中。默认是default环境
+ 写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效
+ 没有标注环境标识的bean在任何环境下都是加载的;
@Profile("dev")
@Bean("devDataSource")
public DataSource dataSourceDev(@Value("${db.password}")String pwd) throws Exception{
	ComboPooledDataSource dataSource = new ComboPooledDataSource();
	dataSource.setUser(user);
	dataSource.setPassword(pwd);
	dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/dev");
	dataSource.setDriverClass(driverClass);
	return dataSource;
}



//1、使用命令行动态参数: 在虚拟机参数位置加载 -Dspring.profiles.active=test
//2、代码的方式激活某种环境;
@Test
public void testMain(){
	//1、创建一个applicationContext
	AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
	//2、设置需要激活的环境
	applicationContext.getEnvironment().setActiveProfiles("dev");
	//3、注册主配置类
	applicationContext.register(TestDHProfile.class);
	//4、启动刷新容器
	applicationContext.refresh();
	applicationContext.close();
}

Spring-MVC常用注解

  • @InitBinder

作用是给Binder做初始化的,被此注解的方法可以对WebDataBinder初始化。webDataBinder是用于表单到方法的数据绑定的!

@InitBinder只在@Controller中注解方法来为这个控制器注册一个绑定器初始化方法,方法只对本控制器有效。

+ 对数据绑定进行设置
+ 注册已有的编辑器
+ 注册自定义编辑器
  • @PathVariable

用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。

@RequestMapping(value="/product/{productId}",method = RequestMethod.GET)  
public String getProduct(@PathVariable("productId") String productId){  
      System.out.println("Product Id : " + productId);  
      return "hello";  
}  
  • @CookieValue

用来获取Cookie中的值。

@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String sessionId) {
    System.out.println("JSESSIONID = " + sessionId);
    return "success";
}
  • @RequestParam

用于将请求参数区数据映射到功能处理方法的参数上。

@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam("id") int id) {
    System.out.println("testRequestParam  " + id);
    return "success";
}
  • @SessionAttributes

将值放到session作用域中,写在class上面。 @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(value 属性值), 还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(types 属性值)。

  • @ResponseBody 

该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

  • @RequestBody

@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);

GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。

在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam。

  • @ModelAttribute

代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法, 可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中, 所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。