spring常用注解

1.@Autowried  这个注解是对成员变量,方法以及构造函数经行注释的,它是Byname方式经行依赖注入

如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常

  1. <SPAN style="FONT-SIZE: 18px">       @Autowired  
  2.     private AccountDao accountDao;  
  3.   
  4.     @Override  
  5.     public Account read(String username, String password) {  
  6.         Account account = accountDao.read(username);  
  7.   
  8.         if (!password.equals(account.getPassword())) {  
  9.             account = null;  
  10.         }  
  11.         return account;  
  12.     }</SPAN>  
<span style="FONT-SIZE: 18px">       @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;
	}</span>
@Autowried 注释在成员变量上spring就会将其以Byname的形式自动化注入到spring容器中,因此便省去了get/set方法和spring配置文件的配置。

@Autowried 注释在成员方法中,spring就会把方法的变量将方法的参数注入进来,构造方法的注释同样。

2.@Qualifer  标注的对象与上一个相同,不同的是它指定了注入对象的类型,在使用@Autowried时如果没有指定注入参数的类型就会报错,因此@Qualifer是对@Autowried的有益补充。

  1. @Autowired    
  2. public void setUserDao(@Qualifier("userDao") UserDao userDao) {     
  3.     this.userDao = userDao;     
  4. }    
@Autowired  
public void setUserDao(@Qualifier("userDao") UserDao userDao) {   
    this.userDao = userDao;   
}  

如果没有指定userDao 的类型的,并且存在另一个名字为userDao的对象,那么是spring就不知道该注入哪一个对象,如果使用@Qualifer指定注入对象的类型的话就不会出现保存的现象。

如果不存在该对象的话

  1. @Autowired(required = false)      
  2. public void setUserDao(UserDao userDao) {      
  3.     this.userDao = userDao;      
  4. }   
@Autowired(required = false)    
public void setUserDao(UserDao userDao) {    
    this.userDao = userDao;    
} 
3.@Resource 是JSR-250 的注解,spring不仅支持自定义的@Autowried注解,还支持JSR-250规范定义的注解。该

注解与@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   顾名思义就是用于事务控制的。

  1. /** 
  2.      * 注册用户 
  3.      *  
  4.      * @param account 
  5.      * @return 
  6.      */  
  7.     @Transactional(readOnly = false, rollbackFor = DataAccessException.class)  
  8.     Account register(Account account);  
/**
	 * 注册用户
	 * 
	 * @param account
	 * @return
	 */
	@Transactional(readOnly = false, rollbackFor = DataAccessException.class)
	Account register(Account account);
这是在service层使用事务的控制,他会有一些参数,我相信大家会明白是什么意思,错误回滚这是事务常用的。

5.@RequestMapping 是定义控制器对应的请求参数的。

  1. /** 
  2.  * 2010-1-25 
  3.  */  
  4. package org.zlex.spring.controller;  
  5.   
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7. import org.springframework.stereotype.Controller;  
  8. import org.springframework.ui.ModelMap;  
  9. import org.springframework.web.bind.annotation.ModelAttribute;  
  10. import org.springframework.web.bind.annotation.RequestMapping;  
  11. import org.springframework.web.bind.annotation.RequestMethod;  
  12. import org.zlex.spring.domain.Account;  
  13. import org.zlex.spring.service.AccountService;  
  14.   
  15. /** 
  16.  * 登录控制器 
  17.  *  
  18.  * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> 
  19.  * @version 1.0 
  20.  * @since 1.0 
  21.  */  
  22. @Controller  
  23. @RequestMapping(value = "/login.do")  
  24. public class LoginController {  
  25.   
  26.     @Autowired  
  27.     private AccountService accountService;  
  28.   
  29.     /** 
  30.      * 初始化表单 
  31.      *  
  32.      * @param model 
  33.      * @return 
  34.      */  
  35.     @RequestMapping(method = RequestMethod.GET)  
  36.     public String initForm(ModelMap model) {  
  37.         Account account = new Account();  
  38.         model.addAttribute("account", account);  
  39.         // 直接跳转到登录页面   
  40.         return "account/login";  
  41.     }  
  42.   
  43.     /** 
  44.      * 登录 
  45.      *  
  46.      * @param account 
  47.      * @return 
  48.      */  
  49.     @RequestMapping(method = RequestMethod.POST)  
  50.     public String login(@ModelAttribute("account") Account account) {  
  51.         Account acc = accountService.read(account.getUsername(), account  
  52.                 .getPassword());  
  53.         if (acc != null) {  
  54.             return "redirect:profile.do?id=" + acc.getId();  
  55.         } else {  
  56.             return "redirect:login.do";  
  57.         }  
  58.     }  
  59. }  
/**
 * 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(value = "/login.do")定义LoginController的访问地址。

@RequestMapping可以注释在类上也可以住是在方法上,注释在类上是定义该类的访问地址,需要访问其方法是,需要在地址的后面加上”?“+方法名。如果该注解注释在方法上就指定了该方法的访问地址。它是由一些参数,我用到的分别是mtehod -指定请求的类型即GET/POST。

@ModelAttribute("account")用来绑定表单即指明了这个方法使用的数据是来自account这个表单的数据,接收数据的对象就是Account。


使用注解来构造IoC容器

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

如:在base-package指明一个包

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

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

1 <context:component-scan base-package="cn.gacl.dao.impl,cn.gacl.service.impl,cn.gacl.action"/>

多个包逗号隔开。

1、@Component

@Component
是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。

2、@Controller

@Controller对应表现层的Bean,也就是Action,例如:

1 @Controller2 @Scope("prototype")3 public class UserAction extends BaseAction<User>{4 ……5 }

使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为"userAction"的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,则使用value作为bean的名字

这里的UserAction还使用了@Scope注解,@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式(scope="singleton"),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope="prototype" 可以保证当有请求的时候都创建一个Action对象

3、@ Service

@Service对应的是业务层Bean,例如:

1 @Service("userService")2 public class UserServiceImpl implements UserService {3 ………4 }

@Service("userService")注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Action:在Action只需要声明一个名字叫“userService”的变量来接收由Spring注入的"userService"即可,具体代码如下:

1 // 注入userService2 @Resource(name = "userService")3 private UserService userService;

注意:在Action声明的“userService”变量的类型必须是“UserServiceImpl”或者是其父类“UserService”,否则由于类型不一致而无法注入,由于Action中的声明的“userService”变量使用了@Resource注解去标注,并且指明了其name = "userService",这就等于告诉Spring,说我Action要实例化一个“userService”,你Spring快点帮我实例化好,然后给我,当Spring看到userService变量上的@Resource的注解时,根据其指明的name属性可以知道,Action中需要用到一个UserServiceImpl的实例,此时Spring就会把自己创建好的名字叫做"userService"的UserServiceImpl的实例注入给Action中的“userService”变量,帮助Action完成userService的实例化,这样在Action中就不用通过“UserService userService = new UserServiceImpl();”这种最原始的方式去实例化userService了。如果没有Spring,那么当Action需要使用UserServiceImpl时,必须通过“UserService userService = new UserServiceImpl();”主动去创建实例对象,但使用了Spring之后,Action要使用UserServiceImpl时,就不用主动去创建UserServiceImpl的实例了,创建UserServiceImpl实例已经交给Spring来做了,Spring把创建好的UserServiceImpl实例给Action,Action拿到就可以直接用了。Action由原来的主动创建UserServiceImpl实例后就可以马上使用,变成了被动等待由Spring创建好UserServiceImpl实例之后再注入给Action,Action才能够使用。这说明Action对“UserServiceImpl”类的“控制权”已经被“反转”了,原来主动权在自己手上,自己要使用“UserServiceImpl”类的实例,自己主动去new一个出来马上就可以使用了,但现在自己不能主动去new“UserServiceImpl”类的实例,new“UserServiceImpl”类的实例的权力已经被Spring拿走了,只有Spring才能够new“UserServiceImpl”类的实例,而Action只能等Spring创建好“UserServiceImpl”类的实例后,再“恳求”Spring把创建好的“UserServiceImpl”类的实例给他,这样他才能够使用“UserServiceImpl”,这就是Spring核心思想“控制反转”,也叫“依赖注入”,“依赖注入”也很好理解,Action需要使用UserServiceImpl干活,那么就是对UserServiceImpl产生了依赖,Spring把Acion需要依赖的UserServiceImpl注入(也就是“给”)给Action,这就是所谓的“依赖注入”。对Action而言,Action依赖什么东西,就请求Spring注入给他,对Spring而言,Action需要什么,Spring就主动注入给他。

4、@ Repository

@Repository对应数据访问层Bean ,例如:

1 @Repository(value="userDao")2 public class UserDaoImpl extends BaseDaoImpl<User> {3 ………4 }

@Repository(value="userDao")注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。

当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = "userDao")注解告诉Spring,Spring把创建好的userDao注入给Service即可。

1 // 注入userDao,从数据库中根据用户Id取出指定用户时需要用到2 @Resource(name = "userDao")3 private BaseDao<User> userDao;

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值