在spring 3.0中,通过@controller标注即可将class定义为一个controller类。为使spring能找到定义为controller的bean,需要在applicationContext.xml配置文件中注册
在base-package指明一个包
表明com.om包及其子包中,如果某个类的头上带有特定的注解【@Component/@Repository/@Service/@Controller】,就会将这个对象作为Bean注册进Spring容器。
1:@Component
@Component是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。
2:@Controller
@Controller对应表现层的Bean,也就是Action,例如:
@Controller
@Scope("prototype")
public class UserController {
}
注:实际上,使用@component,也可以起到@Controller同样的作用。
使用@Controller注解标识UserController之后,就表示要把UserController交给Spring容器管理,在Spring容器中会存在一个名字为"UserController"的action,这个名字是根据UserController类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value="UserController")】或者【@Controller("UserController")】,则使用value作为bean的名字。
这里的UserController还使用了@Scope注解,@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope是单例模式(scope="singleton"),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope="prototype" 可以保证当有请求的时候都创建一个Action对象。
3:@RequestMapping
@RequestMapping是一种通过匹配URL路径来访问相应页面的,@RequestMapping 注解将类似 “/user”这样的URL映射到整个类或特定的处理方法上。一般来说,类级别的注解映射特定的请求路径到表单控制器上,而方法级别的注解只是映射为一个特定的HTTP方法请求(“GET”,“POST”等)或HTTP请求参数。
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/list", method = {RequestMethod.GET,RequestMethod.POST})
public String list(HttpServletRequest request) {
}
}
将 @Autowired 注释标注在成员变量上 ,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
@Autowired 根据bean 类型从spring 上线文中进行查找,注册类型必须唯一,否则报异常。与@Resource 的区别在于,@Resource 允许通过bean 名称或bean 类型两种方式进行查找@Autowired(required=false) 表示,如果spring 上下文中没有找到该类型的bean 时, 才会使用new SoftPMServiceImpl(); @Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 id 或 name 作为 Map 的 key。 @Autowired 还有一个作用就是,如果将其标注在 BeanFactory 类型、ApplicationContext 类型、ResourceLoader 类型、ApplicationEventPublisher 类型、MessageSource 类型上,那么 Spring 会自动注入这些实现类的实例,不需要额外的操作。
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserBiz userBiz;
}
@RequestParam将请求的参数绑定到方法中的参数上。其实,即使不配置该参数,注解也会默认使用该参数。如果想自定义指定参数的话,如果将@RequestParam的 required 属性设置为false(如@RequestParam(value="id",required=false))。
6:@RequestBody
@RequestBody是指方法参数应该被绑定到HTTP请求Body上。
@RequestMapping(value = "/user",method = RequestMethod.GET)
public void UserInfo(@RequestBody String userId,User user){
}
7:@ResponseBody
@ResponseBody与@RequestBody类似,它的作用是将返回类型直接输入到HTTP response body中。最常用的我们使用ajax传输json,需要再类上面配置@ResponseBody。
@ResponseBody
@RequestMapping(value = "/user", method = RequestMethod.POST)
public String list() {
return "Hello World";
}
@ModelAttribute
public User addUser(@RequestParam String userId) {
...
}
@ModelAttribute方法用来在model中填充属性,如填充下拉列表、宠物类型或检索一个命令对象比如账户(用来在HTML表单上呈现数据)。
@ModelAttribute作用在方法参数上
当@ModelAttribute作用在方法参数上时,表明该参数可以在方法模型中检索到。如果该参数不在当前模型中,该参数先被实例化然后添加到模型中。一旦模型中有了该参数,该参数的字段应该填充所有请求参数匹配的名称中。这是Spring MVC中重要的数据绑定机制,它省去了单独解析每个表单字段的时间。
@ModelAttribute是一种很常见的从数据库中检索属性的方法,它通过@SessionAttributes使用request请求存储。在一些情况下,可以很方便的通过URI模板变量和类型转换器检索属性。
9:@Cacheable 和@CacheFlush
@Cacheable :声明一个方法的返回值应该被缓 存
例如:@Cacheable(modelId = "testCaching")
@CacheFlush :声明一个方法是清空缓存的触发器
例如:@CacheFlush(modelId = "testCaching")
10:@Resource
@Resource 默认按bean 的name 进行查找,如果没有找到会按type 进行查找, 此时与@Autowired 类似在没有为 @Resource 注解显式指定 name 属性的前提下,如果将其标注在 BeanFactory 类型、ApplicationContext 类型、ResourceLoader 类型、 ApplicationEventPublisher 类型、MessageSource 类型上,那么 Spring 会自动注入这些实现类的实例,不需要额外的操作。此时 name 属性不需要指定 ( 或者指定为""),否则注入失败。
11:@PostConstruct 和@PreDestroy
@PostConstruct 在方法上加上注解@PostConstruct ,这个方法就会在Bean 初始化之后被Spring 容器执行 (注:Bean 初始化包括,实例化Bean ,并装配Bean 的属性(依赖注入))。
@PreDestroy 在方法上加上注解@PreDestroy ,这个方法就会在Bean 被销毁前被Spring 容器执行。
12:@Repository
与@Controller 、@Service 类似,都是向spring 上下文中注册bean。
13:@SessionAttributes
Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 session 中, 以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。 这一功能是通过类定义处标注 @SessionAttributes 注解来实现的。 @SessionAttributes 只能声明在类上,而不能声明在方法上。
例如
@SessionAttributes("User") // 将ModelMap 中属性名为User的属性
@SessionAttributes({"attr1","attr2"})
@SessionAttributes(types = User.class)
@SessionAttributes(types = {User.class,Dept.class})
@SessionAttributes(types = {User.class,Dept.class},value={"attr1","attr2"})
14:@InitBinder
如果希望某个属性编辑器仅作用于特定的 Controller ,可以在 Controller 中定义一个标注 @InitBinder 注解的方法, 可以在该方法中向 Controller 了注册若干个属性编辑器
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
@ required 负责检查一个bean在初始化时其声明的 set方法是否被执行, 当某个被标注了 @Required 的 Setter 方法没有被调用,则 Spring 在解析的时候会抛出异常,以提醒开发者对相应属性进行设置。 @Required 注解只能标注在 Setter 方法之上。因为依赖注入的本质是检查 Setter 方法是否被调用了,而不是真的去检查属性是否赋值了以及赋了什么样的值。如果将该注解标注在非 setXxxx() 类型的方法则被忽略。
16:@Qualifier
@Autowired @Qualifier("softService")
private ISoftPMService softPMService;
使用@Autowired 时,如果找到多个同一类型的bean,则会抛异常,此时可以使用 @Qualifier("beanName"),明确指定bean的名称进行注入,此时与 @Resource指定name属性作用相同。
17:@PathVariable
@PathVariable是用来获得请求url中的动态参数的,当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。
@RequestMapping(value="/user/{userId}",method = RequestMethod.GET)
public String getUser(@PathVariable("userId") String userId){
return "";
}