[转]Spring常用注解总结(3)


继续上一篇
接着总结Spring注解,详细说明注解配置xml文件和spring有哪些注解,每个注解是做什么用的.


使用注解来构造Ioc容器
用注解来向Spring容器注册Bean,需要在applicationContext.xml中注册
例如:在base-package指明一个包

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


表明cn.gacl.java包以及其子包中,如果某个类的头上带有特定的注解[@Component,@Repository,@Service,@Controller],就会将这个对象作为Bean注册进Spring容器。


也可以在中指定多个包,多个包用逗号隔开。如:

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


详细介绍各个注解的含义
1. @Component
@Component是所有受Spring管理组建的通用形式,该注解可以放在各个类的头上,但是不推荐使用@Component注解

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

@Controller
@Scope("prototype")
public class UserAction extends BaseAction<User>{

}


使用@Controller注解标识UserAction之后,就标识要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为userAction的action,这个名字是根据UserAction类名来取的。

注意:如果@Controller不指定其value,则默认的bean名字为这个类的类名,并且首字母小写。如果指定value,比如是 @Controller(“value=UserAction”)或者写成@Controller(“UserAction”) 那么就使用value作为bean的名字。

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



3. @Service
@Service对应的是业务层的Bean

@Service("userService")
public class UserServiceImpl implements UserService{

}


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

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


注意:在Action声明的”UserService”变量类型必须是”UserServiceImpl”或者是其父类”UserService”,否则由于类型不一致而无法注入。
由于Action中声明的userService变量使用了@Resource注解去标注,并且指明了其name=”userService”,这就等于告诉Spring,说我Action需要实例化一个”userService”,你Spring快点帮我实例化好,然后给我。

当Spring看到userService变量上的@Resource注解时,根据其指明的name属性就可以知道(知道bean id 找到对应的实现类),Action中需要用到一个UserServiceImpl的实例,此时Spring就会把自己创建好的名字叫做”userService”的UserServiceImpl实例注入给Action中的”userService”变量,帮助Action完成userService的实例化。

这样在Action中就不用通过

UserService userService=new UserServiceImpl();


这种最原始的方式去实例化userService了。如果没有Spring,那么当Action需要使用UserServiceImpl时,必须通过new这种方式主动实例化对象,但使用Spring之后,创建UserServiceImpl实例对象的工作交给Spring来做了,Spring能够把创建好的UserServiceImpl实例给Action,Action拿到就可以直接用。Action由原来的主动创建UserServiceImpl实例,变成了被动等待由Spring创建好UserServiceImpl实例后再注入给Action,Action才能够使用。这说明Action对”UserServiceImpl类的“控制权”已经被“反转”了(原来主动权在自己收上,自己要使用UserServiceImpl类的实例,自己主动去new一个出来马上就可以使用,但现在自己不能主动去new类的实例,new实例的权利已经被Spring拿走了,只有Spring才能个new类的实例,而Action只能等Spring创建好类的实例后,再把实例注入给Action,这样Action才能使用这个这个类的实例,这就是Spring核心思想“控制反转”,也叫“依赖注入”


4. Repository


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

@Repository(value="userDao")
public class UserDaoImpl extends BaseDaoImpl<User>{

}


@Repository(value=”userDao”)注解是告诉Spring,让Spring创建一个名字叫”userDao”的UserDaoImpl实例。
当Service需要使用UserDaoImpl的时候,就可以使用@Resource(name=”UserDao”)注解告诉Spring,Spring把创建好的userDao注入给Service即可。

//注入userDao
@Resource(name="userDao")
private BaseDao<User> userDao;



Spring常用注解汇总

本文汇总一下Spring的常用注解,以方便大家查询和使用,具体如下:
使用注解之前要开启知道扫描包功能

<context:component-scan base-package="cn.test">


@Configuration:把一个类作为一个Ioc容器,它的某个方法头上如果注册了Bean,就会作为这个Spring容器中的Bean


@Lazy(true):表示延迟初始化

@Service:用于标注业务层组件

@Controller:用于标注控制层组件,如Struts中的action

@Repository:用于标注数据访问层组件,即DAO

@Component:泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注

@Scope:作用域。用在类上

@PostConstruct用于指定初始化方法。用在方法上

@PreDestory用于指定销毁方法。用在方法上

@DependsOn:定义Bean初始化及销毁时的顺序

@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

@Autowired:默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如:
用在方法上
@Autowired
@Qualifier("personDaoBean")


@Resource:默认按名称装配。推荐使用。
用在方法上

@PostConstruct 初始化注解

@PreDestroy 摧毁注解 默认 单例 启动就加载

@Async异步方法调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值