最近时间有点空闲,头说项目需要优化升级,说让我们学习一下spring的注解,在网上找一些文章研究了一下,也做了一个小例子,下面是用的几个spring的注解。
1.@Autowried 这个注解是对成员变量,方法以及构造函数经行注释的,它是Byname方式经行依赖注入
如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常
- @Autowired
- private AccountDao accountDao;
- @Override
- public Account read(String username, String password) {
- Account account = accountDao.read(username);
- if (!password.equals(account.getPassword())) {
- account = null;
- }
- return account;
- }
@Autowried 注释在成员方法中,spring就会把方法的变量将方法的参数注入进来,构造方法的注释同样。
2.@Qualifer 标注的对象与上一个相同,不同的是它指定了注入对象的类型,在使用@Autowried时如果没有指定注入参数的类型就会报错,因此@Qualifer是对@Autowried的有益补充。
- @Autowired
- public void setUserDao(@Qualifier("userDao") UserDao userDao) {
- this.userDao = userDao;
- }
如果没有指定userDao 的类型的,并且存在另一个名字为userDao的对象,那么是spring就不知道该注入哪一个对象,如果使用@Qualifer指定注入对象的类型的话就不会出现保存的现象。
如果不存在该对象的话
- @Autowired(required = false)
- public void setUserDao(UserDao userDao) {
- this.userDao = userDao;
- }
注解与@Autowried的使用方法一样,但是建议使用@Resource。@Resource与@Autowried的不同就是@Autowried
是是通过Bytype的方式注入spring的,而@Resource是通过Byname或Bytype方式注入spring的。@Resource有两个
重要的属性分别是name和type,spring将属性name解析为bean的名字,而将type属性解析成bean的类型。如果使用
name属性就是使用Byname自动注入策略,如果使用type属性就是使用Bytype自动修护乳策略,如果即不指定name
也不指定type,那么spring就通过反射机制使用Byname自动注入策略。
如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个
原始类型(UserDao)进行匹配,如果匹配则自动装配;
4.@Transational 顾名思义就是用于事务控制的。
- /**
- * 注册用户
- *
- * @param account
- * @return
- */
- @Transactional(readOnly = false, rollbackFor = DataAccessException.class)
- Account register(Account account);
5.@RequestMapping 是定义控制器对应的请求参数的。
- /**
- * 2010-1-25
- */
- package org.zlex.spring.controller;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.ModelMap;
- import org.springframework.web.bind.annotation.ModelAttribute;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.zlex.spring.domain.Account;
- import org.zlex.spring.service.AccountService;
- /**
- * 登录控制器
- *
- * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
- * @version 1.0
- * @since 1.0
- */
- @Controller
- @RequestMapping(value = "/login.do")
- public class LoginController {
- @Autowired
- private AccountService accountService;
- /**
- * 初始化表单
- *
- * @param model
- * @return
- */
- @RequestMapping(method = RequestMethod.GET)
- public String initForm(ModelMap model) {
- Account account = new Account();
- model.addAttribute("account", account);
- // 直接跳转到登录页面
- return "account/login";
- }
- /**
- * 登录
- *
- * @param account
- * @return
- */
- @RequestMapping(method = RequestMethod.POST)
- public String login(@ModelAttribute("account") Account account) {
- Account acc = accountService.read(account.getUsername(), account
- .getPassword());
- if (acc != null) {
- return "redirect:profile.do?id=" + acc.getId();
- } else {
- return "redirect:login.do";
- }
- }
- }
@RequestMapping可以注释在类上也可以住是在方法上,注释在类上是定义该类的访问地址,需要访问其方法是,需要在地址的后面加上”?“+方法名。如果该注解注释在方法上就指定了该方法的访问地址。它是由一些参数,我用到的分别是mtehod -指定请求的类型即GET/POST。
@ModelAttribute("account")用来绑定表单即指明了这个方法使用的数据是来自account这个表单的数据,接收数据的对象就是Account。