一,使用注解:
在spring的配置文件applicationcontext.xml中,加入注解扫描。配置项就配置了对指定的包进行扫描,以实现依赖注入。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?xml version= "1.0" encoding= "utf-8" ?> <span style= "font-size:18px;" ><beans xmlns= "http://www.springframework.org/schema/beans" xmlns:xsi= "http://www.w3.org/2001/xmlschema-instance" xmlns:context= "http://www.springframework.org/schema/context" xmlns:aop= "http://www.springframework.org/schema/aop" xsi:schemalocation=" http: //www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http: //www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http: //www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http: //www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> <aop:aspectj-autoproxy/> <context:annotation-config/> <context:component-scan base- package = "com.test" /> //去哪扫描 </beans> |
二,常见注解:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@controller @service @autowired @requestmapping @requestparam @modelattribute @cacheable @cacheflush @resource @postconstruct @predestroy @repository @component (不推荐使用) @scope @sessionattributes @initbinder @required @qualifier |
三,常用spring注解:
@controller(运用于表现层)
使用@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对象
@controller
1
2
3
|
@scope ( "prototype" ) public class useraction extends baseaction<user>{ } |
@ service(运用于业务逻辑层)
注意,@service注解是在服务接口的实现类下,而不是接口中使用。
这里很好的体现了spring中的控制反转,我们不在让对象自己去实例化对象,去主动依赖对象,而是 专门用一个容器来创建对象,由ioc进行管理。实例:
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就主动注入给他。
1
2
3
|
@service ( "userservice" ) public class userserviceimpl implements userservice { } |
@ repository(运用于数据管理层)
笔者是使用工具反向生成的实体层数据model跟mapper,所以也没用到这个注解,不过这个就是简单的向spring容器中注入一个bean
1
2
3
|
@repository (value= "userdao" ) public class userdaoimpl extends basedaoimpl<user> { } |
四,常用springmvc注解:
@autowired(按类型注入)
对类成员变量、方法及构造函数进行标注,完成自动装配的工作。简单来说就是调用bean,告诉spring这个存在与被管理的容器中。
@autowired 根据bean 类型从spring 上线文中进行查找,注册类型必须唯一,否则报异常
@autowired 标注作用于 map 类型时,如果 map 的 key 为 string 类型,则 spring 会将容器中所有类型符合 map 的 value 对应的类型的 bean 增加进来,用 bean 的 id 或 name 作为 map 的 key。
@autowired 还有一个作用就是,如果将其标注在 beanfactory 类型、applicationcontext 类型、resourceloader 类型、applicationeventpublisher 类型、messagesource 类型上,那么 spring 会自动注入这些实现类的实例,不需要额外的操作。
@autowired
private ireportservice reportservice ;
@resource(按名称注入)
跟@autowired类似,@resource 默认按bean的name进行查找,如果没有找到会按type进行查找
@resource
private datasource datasource; // inject the bean named 'datasource'
@resource(name="datasource")
@resource(type=datasource.class)
延伸问题:什么是按类型进行装配,什么是按名称进行装配?
所谓按类型,就是当spring容器中存在一个与指定属性类型相同的bean,那么将该属性进行自动装配;如果存在多个该类型的bean,那么跑出异常,并指出不能使用按类型进行自动装配;如果没有找到匹配的bean,则什么事都不发生。
所谓按名称,即根据属性名进行自动装配,此项会检查spring容器中与该属性名完全一致的的bean,进行自动装配。
@requestmapping(映射请求地址)
用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
其中有六个属性,分别为:
1、 value, method;
value: 指定请求的实际地址,指定的地址可以是uri template 模式(后面将会说明);
method: 指定请求的method类型, get、post、put、delete等;
2、consumes,produces
consumes: 指定处理请求的提交内容类型(content-type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(accept)类型中包含该指定类型才返回;
3、params,headers
params: 指定request中必须包含某些参数值是,才让该方法处理。
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
1
2
3
4
5
6
7
8
9
|
@controller @requestmapping ( "/bbtforum.do" ) public class bbtforumcontroller { @requestmapping (params = "method=listboardtopic" ) public string listboardtopic( int topicid,user user) {} } @requestmapping ( "/softpg/downsoftpg.do" ) @requestmapping (value= "/softpg/ajaxloadsoftid.do" , method=requestmethod.post) @requestmapping (value= "/osu/product/detail.do" , params={ "modify=false" }, method=requestmethod.post) |
@requestparam(获取请求参数的值)
比如我们在浏览器的访问地址是:localhost:8080/hello?id=1000,则拿到id的值,例如:
1
2
3
4
5
6
7
8
|
@restcontroller public class hellocontroller { @requestmapping (value= "/hello" ,method= requestmethod.get) public string sayhello( @requestparam ( "id" ) integer id){ return "id:" +id; } } |
@pathvaribale (获取url中的数据)
1
2
3
4
5
6
7
8
|
@restcontroller public class hellocontroller { @requestmapping (value= "/hello/{id}" ,method= requestmethod.get) public string sayhello( @pathvariable ( "id" ) integer id){ return "id:" +id; } } |
@responsebody(返回类型为json)
作用: 该注解用于将controller的方法返回的对象,通过适当的httpmessageconverter转换为指定格式后,写入到response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
总结
以上所述是小编给大家介绍的spring springmvc中常用注解解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://www.cnblogs.com/lwh-note/p/9098797.html