欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring常用注解 使用注解来构造IoC容器的方法

程序员文章站 2023-12-18 12:18:22
使用注解来构造ioc容器 用注解来向spring容器注册bean。需要在applicationcontext.xml中注册

使用注解来构造ioc容器

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

如:在base-package指明一个包

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

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

<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,例如:

 @controller
 @scope("prototype")
 public class useraction extends baseaction<user>{
 ……
 }

使用@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,例如:

@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属性可以知道,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 ,例如:

@repository(value="userdao")
public class userdaoimpl extends basedaoimpl<user> {
………
}

@repository(value="userdao")注解是告诉spring,让spring创建一个名字叫“userdao”的userdaoimpl实例。

当service需要使用spring创建的名字叫“userdao”的userdaoimpl实例时,就可以使用@resource(name = "userdao")注解告诉spring,spring把创建好的userdao注入给service即可。

// 注入userdao,从数据库中根据用户id取出指定用户时需要用到
@resource(name = "userdao")
private basedao<user> userdao;

@resource、@autowired、@qualifier 都用来注入对象。其中@resource可以以 name 或 type 方式注入,@autowired只能以 type 方式注入,@qualifier 只能以 name 方式注入。

但它们有一些细微区别:

1、@resource、@qualifier默认按 byname自动注入,@autowired默认按bytype自动注入。

2、@resource有两个属性是比较重要的,分是name和type。如果使用name属性,则使用byname的自动注入策略。而使用type属性时则使用bytype自动注入策略。

3、@resources是jdk提供的注解,而@autowired是spring提供的注解。

可以把 @resource 当成 @autowired @qualifier 的老大吧,哈哈。你们有的,我都有,你们没有的,我也有~

@resource、@autowired、@qualifier 都用来注入对象。其中@resource可以以 name 或 type 方式注入,@autowired只能以 type 方式注入,@qualifier 只能以 name 方式注入。

但它们有一些细微区别:

1、@resource、@qualifier默认按 byname自动注入,@autowired默认按bytype自动注入。

2、@resource有两个属性是比较重要的,分是name和type。如果使用name属性,则使用byname的自动注入策略。而使用type属性时则使用bytype自动注入策略。

3、@resources是jdk提供的注解,而@autowired是spring提供的注解。

可以把 @resource 当成 @autowired @qualifier 的老大吧,哈哈。你们有的,我都有,你们没有的,我也有~

以上这篇spring常用注解 使用注解来构造ioc容器的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

上一篇:

下一篇: