spring学习笔记

常见注解

@Service用于标注业务层组件、 
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。不建议使用。

@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
    @Autowired @Qualifier("personDaoBean") 存在多个实例配合使用
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

@Scope用于指定scope作用域的(用在类上)
@PostConstruct初始化注解,用于指定初始化方法(用在方法上)
@PreDestory摧毁注解 默认 单例  启动就加载,用于指定销毁方法(用在方法上)
@DependsOn:定义Bean初始化及销毁时的顺序

@RequestMapping 这个注解用于将url映射到整个处理类或者特定的处理请求的方法。可以只用通配符!
@RequestParam
@ResponseBody
@RequestBody
@ModelAttribute
@Cacheable
@CacheFlush

@SessionAttributes
@InitBinder
@Required
@Lazy(true) 表示延迟初始化
@Async异步方法调用

定义Bean的注解 【@Component/@Repository/@Service/@Controller】

1,xml配置

用注解来向Spring容器注册Bean。需要在applicationContext.xml中注册<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>。如下:

<context:component-scan base-package="cn.gacl.java"/>

表明cn.gacl.java包及其子包中,如果某个类的头上带有特定的注解【@Component/@Repository/@Service/@Controller】, 就会将这个对象作为Bean注册进Spring容器。也可以在 base-package=” ” 中指定多个包,多个包逗号隔开。

2,spring 上下文中注册bean

@Component/@Repository/@Service/@Controller 使用方法一样,放在类的头上,这几个注解都是向spring 上下文中注册bean。例如:

@Service("userService")
public class UserServiceImpl implements UserService {
    // to do somethine
}

默认的bean名字为这个类的类名首字母小写,如果指定value【@Service(value=”userService”)】或者【@Service(“userService”)】, 则使用value作为bean的名字。 @Component 是所有受Spring 管理组件的通用形式, Spring 还提供了更加细化的注解形式: @Repository 、@Service 、@Controller ,它们分别对应存储层Bean ,业务层Bean ,和展示层Bean 。 @Controller,@Service,@Repository会携带更多语义。尽量考虑使用@Controller,@Service,@Repository代替通用的@Component

http请求注解(spring MVC模块注解)【@RequestMapping/@RequestParam/@PathVariable/@ResponseBody/@RequestBody】

@RequestMapping

@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping注解有六个属性:

1、 value, method;

value: 指定请求的实际地址,指定的地址可以是URI Template 模式;

method: 指定请求的method类型, GET、POST、PUT、DELETE等;

@RequestMapping (value= "testMethod" , method={RequestMethod. GET , RequestMethod. DELETE })
public String testMethod() {
   return "method" ;
}

在上面的代码中就使用method 参数限制了以GET 或DELETE 方法请求/testMethod 的时候才能访问到该Controller 的testMethod 方法。

2、consumes,produces

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

@RequestMapping(value = "pets", method = RequestMethod.POST, consumes="application/json")  
public void addPet(@RequestBody Pet pet, Model model) {      
    // implementation omitted  
}  

produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

@RequestMapping(value = "pets/{petId}", method = RequestMethod.GET, produces="application/json")  
@ResponseBody  
public Pet getPet(@PathVariable String petId, Model model) {      
    // implementation omitted  
}  
3、params,headers

params: 指定request中必须包含某些参数值是,才让该方法处理。

@RequestMapping (value= "testParams" , params={ "param1=value1" , "param2" , "!param3" })
public String testParams() {
   System. out .println( "test Params..........." );
   return "testParams" ;
}

在上面的代码中就使用method 参数限制了以GET 或DELETE 方法请求/testMethod 的时候才能访问到该Controller 的testMethod 方法。

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

@RequestMapping (value= "testHeaders" , headers={ "host=localhost" , "Accept" })
public String testHeaders() {
   return "headers" ;
}

headers 属性的用法和功能与params 属性相似。在上面的代码中当请求/testHeaders 的时候只有当请求头包含Accept 信息, 且请求的host 为localhost 的时候才能正确的访问到testHeaders 方法。

@RequestParam 、@PathVariable 、@RequestBody 等

handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型)

A、处理requet uri 部分(这里指uri template中variable,不含queryString部分)的注解: @PathVariable;

B、处理request header部分的注解: @RequestHeader, @CookieValue;

C、处理request body部分的注解:@RequestParam, @RequestBody;

D、处理attribute类型是注解: @SessionAttributes, @ModelAttribute;

1、 @PathVariable

当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。

@Controller  
@RequestMapping("/owners/{ownerId}")  
public class RelativePathUriTemplateController {  
  
  @RequestMapping("/pets/{petId}")  
  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {      
    // implementation omitted  
  }  
}

上面代码把URI template 中变量 ownerId的值和petId的值,绑定到方法的参数上。 若方法参数名称和需要绑定的uri template中变量名称不一致,需要在@PathVariable(“name”)指定uri template中的名称。

2、@RequestParam, @RequestBody

####### @RequestParam 绑定 HttpServletRequest 请求参数到控制器方法参数。

A) 常用来处理简单类型的绑定,通过Request.getParameter() 获取的String可直接转换为简单类型的情况; 因为使用request.getParameter()方式获取参数,所以可以处理get 方式中queryString的值,也可以处理post方式中 body data的值;

B)用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST;

C) 该注解有四个属性: value、required; value绑定本次参数的名称(要跟URL上面的一样),required用来指示参数是否必须绑定;

//请求url /requestParam?hello=test&age=1
@RequestMapping ( "requestParam" )
public String testRequestParam( @RequestParam(value="hello",required=false) String name, @RequestParam int age) {
    return "requestParam" ;
}

注意:

和@PathVariable 一样,当你没有明确指定从request 中取哪个参数时,默认取更方法参数同名的参数。 此外,当需要从request 中绑定的参数和方法的参数名不相同的时候,也需要在@RequestParam 中明确指出是要绑定哪个参数。

####### @RequestBody 该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;

3,@RequestHeader、@CookieValue

@RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上。

@CookieValue 可以把Request header中关于cookie的值绑定到方法的参数上。

如下:

@RequestMapping("/displayHeaderInfo.do")  
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,  
                              @RequestHeader("Keep-Alive") long keepAlive)  {  
  //...  
} 

@RequestMapping("/displayHeaderInfo.do")  
public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie)  {  
  //...  
}  
4,@ResponseBody

@ResponseBody:

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

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

总结: GET模式下,这里使用了@PathVariable绑定输入参数,非常适合Restful风格。因为隐藏了参数与路径的关系,可以提升网站的安全性,静态化页面,降低恶意攻击风险。 POST模式下,使用@RequestBody绑定请求对象,Spring会帮你进行协议转换,将Json、Xml协议转换成你需要的对象。 @ResponseBody可以标注任何对象,由Srping完成对象——协议的转换。

自动装配Bean【@Primary/@Autowired/@Qualifier/@Resource】

1,@Primary和@Qualifier

首先解释一下@Primary和@Qualifier这两个注解的意思:这两个注解是为了处理自动装配的歧义性,@Primary的意思是在众多相同的bean中,优先使用用@Primary注解的bean.而@Qualifier这个注解则指限定自动装配的bean。

@Primary注解在注册bean是声明,如:

@Component
@Primary
public class Cake implements Dessert{ ... }

当遇到歧义性的时候, Spring将会使用首选的bean, 而不是其他可选的bean。 实际上, 你所声明就是“最喜欢”的bean。

我们可以为bean设置自己的限定符, 而不是依赖于将bean ID作为限定符。 在这里所需要做的就是在bean声明上添加@Qualifier注解。 例 如, 它可以与@Component组合使用, 如下所示:

@Component
@Qualifier("beanName")
public class Cake implements Dessert{ ... }

@Component
@Qualifier("beanName2")
public class Cake implements Dessert{ ... }

使用@Autowired 时,如下所示:

@Autowired
private Dessert dessert;

一个接口Dessert和这个接口的三个实现类,bean找到多个同一类型的bean,则会抛异常,出现如下错误:NoUniqueBeanDefinitionException.

此时可以使用 @Qualifier(“beanName”),明确指定bean的名称进行注入,此时与 @Resource指定name属性作用相同。如下:

@Autowired
@Qualifier("beanName")
private Dessert dessert;
2,@Autowired和@Resource

@Autowired 为Spring提供的注解

• 例如

@Autowired
private ISoftPMService softPMService;

• 或者

@Autowired(required=false)
private ISoftPMService softPMService;

@Autowired 根据bean 类型从spring 上线文中进行查找,注册类型必须唯一,否则报异常。 @Autowired(required=false) 表示,如果spring 上下文中没有找到该类型的bean 时, 则softPMService值为null;

@Resource 由J2EE提供

• 例如

@Resource
private DataSource dataSource; // inject the bean named 'dataSource'

• 或者

@Resource(name="dataSource")
@Resource(type=DataSource.class)
private DataSource dataSource;

@Resource 默认按bean 的name 进行查找,如果没有找到会按type 进行查找, 此时与@Autowired 类 似.

@Autowired与@Resource 的区别在于:

@Resource 允许通过bean 名称或bean 类型两种方式进行查找,默认使用name查找
@Autowired(required=false) 表示,如果spring 上下文中没有找到该类型的bean 时, 允许为null;

定义Bean的作用域和生命过程

@Scope(“prototype”) 值有:

singleton,prototype,session,request,session,globalSession
singleton:单例模式
Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。
Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean定义为singleton模式,
prototype:原型模式
prototype:原型模式,每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,
而singleton全局只有一个对象。根据经验,对有状态的bean使用prototype作用域,而对无状态的bean使用singleton作用域。
request
request:在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效。
针对每一次Http请求,Spring容器根据该bean的定义创建一个全新的实例,且该实例仅在当前Http请求内有效,而其它请求无法看到当前请求中状态的变化,当当前Http请求结束,该bean实例也将会被销毁。
session
session:在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。
<bean id="userPreference" class="com.ioc.UserPreference" scope="session"/>,同Http请求相同,每一次session请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的session请求内有效,请求结束,则实例将被销毁。
global Session:在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。

@PostConstruct 相当于init-method,使用在方法上,当Bean初始化时执行。

@PreDestroy 相当于destory-method,使用在方法上,当Bean销毁时执行。

声明式事务

 @Transactional