Spring中注解的使用详解
一:@Rsource注解的使用规则
1.1.案例演示
Spring的主配置文件:applicationContext.xml(因为我这里将会讲到很多模块,所以我用一个主配置文件去加载各个模块的配置文件):
具体业务模块配置文件applicationContext-di-annotation.xml
业务类Person.java和Student.java
---------------------------------------------------------------------------------------------------------------------------------------
客户端代码:
执行结果是:student_annotation
1.2.使用总结
A:@Resource使用规则:
2.在spring的xml配置文件中引入注解解析器。
<context:annotation-config></context:annotation-config>
3.在spring的xml配置文件中把bean引入进来。
4.在一个类的属性上加
@Resource(name="student_annotation")
public Student student;
从该注解本身
@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {
String name() default "";
}
可以看出:1.该注解可以用于属性或者方法上,但一般用于属性上。2.该注解的作用范围是runtime。3.该注解有一个属性name,默认值为“”。
有点要注意@Resource注解只能作用于引用类型的属性上。
B:加入了注解之后的整个执行过程:
1.当启动spring容器的时候,spring容器加载了配置文件。
2.在spring配置文件中,只要遇到bean的配置,就会为该bean创建对象。
3.在纳入spring容器的范围内查找所有的bean,看哪些bean的属性或者方法上加有@Resource。
4.找到@Resource注解之后,判断该注解的name属性是否为“”(name没有写)
如果没有写name属性,则会让属性的名称和spring容器中bean的Id值做匹配,匹配成功则赋值;如果匹配不成功,则按照类型匹配,如果匹配不成功,就报错。
如果写了name属性,则会按照name属性的值和spring的bean中ID进行匹配,匹配成功,则赋值,不成功则报错。
C:@Resource与@Autowired
@Resource与@Autowired都是做bean的注入时使用。其实@Resource并不是spring的注解,它是jdk扩展包javax.annotation.Resource中的,需要导入使用,但 spring支持该注解的使用。
1.@Autowired
@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。
如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用 ,如下:
@Autowired
@Qualifier("student_annotation") 等价于 @Resource(name="student_annotation")
2.@Resource
@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。 @Resource有两个重要的属性:name和type,而Spring将 @Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。 所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则 使用byType自动注入策略。 如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
二:使用注解把一个类放到spring容器中
2.1.案例演示
Spring的主配置文件:applicationContext.xml(因为我这里将会讲到很多模块,所以我用一个主配置文件去加载各个模块的配置文件):
具体业务模块配置文件applicationContext-scan-annotation.xml
业务类Person.java和Student.java
-----------------------------------------------------------------------------------------------------------------------------------
客户端代码:
执行结果:student_annotation
2.2.使用总结
A:@Component的使用规则
1.在spring的配置文件中导入命名空间及规范
2.引入类扫描及注解解析器
<context:component-scan base-package="com.olymtech.spring.annotation.scan"></context:component-scan>
a:该注解解析器包含了两个功能:依赖注入和类扫描(包含了<context:annotation-config></context:annotation-config>)
b:base-package:在该包及子包中扫描
3.如果一个类或者接口上(一般都是类上),加了@Component注解,就会进行如下法则:
4.按照上面的@Resource法则再次进行操作。
2.3.注解与XML的区别
A:注解书写简单,但效率低(应为解析器要扫描类注解,完了再扫描属性注解),但比起网络的效率,它完全可以忽略不计(你服务器效率再高,我提交一个http请求, 咔,网断了,或网络阻塞,服务器效率再高有啥用?) 。
B:xml书写麻烦,但效率高(不存在扫描)
三:类扫描注解和依赖注入注解联合使用
2.1.Document文档读写案例演示
Spring的置文件:applicationContext-document.xml:
业务类:Document接口,DocumentManager类,ExcelDocument类,PdfDocument类,WordDocument类
------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------
客户端代码:
执行结果:read word
writer word
2.2.模仿web的MVC案例演示
Spring的置文件:applicationContext-mvc.xml:
业务类:
控制层:
服务层:
-----------------------------------------------------------
持久层:
--------------------------------------------------------
客户端代码:
执行结果:save person dao
四:spring中关于类扫描注解和依赖注入注解的归纳总结
Spring 2.5引入了更多典型化注解(stereotype annotations): @Component、@Service和 @Controller。 @Component是所有受Spring管理组件的通用形式; 而@Repository、@Service和 @Controller则是@Component的细化, 用来表示更具体的用例(例如,分别对应了持久化层、服务层和表现层)。也就是说, 你能@Component来注解你的组件类, 但如果用@Repository、@Service 或@Controller来注解它们,你的类也许能更好地被工具处理,或与切面进行关联。 例如,这些典型化注解可以成为理想的切入点目标。当然,在Spring Framework以后的版本中, @Repository、@Service和 @Controller也许还能携带更多语义。 如此一来,如果你正在考虑服务层中是该用 @Component还是@Service, 那@Service显然是更好的选择。 同样的,就像前面说的那样, @Repository已经能在持久化层中进行异常转换时被作为标记使用了。
-----------常用注解--------
--定义Bean的注解(类扫描注解)
@Controller
@Controller("Bean的名称")
定义控制层Bean,如Action
@Service
@Service("Bean的名称")
定义业务层Bean
@Repository
@Repository("Bean的名称")
定义DAO层Bean
@Component
定义Bean, 不好归类时使用.
--自动装配Bean (依赖注入注解;选用一种注解就可以)
@Autowired (Srping提供的)
默认按类型匹配,自动装配(Srping提供的),可以写在成员属性上,或写在setter方法上
@Autowired(required=true)
一定要找到匹配的Bean,否则抛异常。 默认值就是true
@Autowired
@Qualifier("bean的名字")
按名称装配Bean,与@Autowired组合使用,解决按类型匹配找到多个Bean问题。
@Resource JSR-250提供的
默认按名称装配,当找不到名称匹配的bean再按类型装配.
可以写在成员属性上,或写在setter方法上
可以通过@Resource(name="beanName") 指定被注入的bean的名称, 要是未指定name属性, 默认使用成员属性的变量名,一般不用写name属性.
@Resource(name="beanName")指定了name属性,按名称注入但没找到bean, 就不会再按类型装配了.
@Inject 是JSR-330提供的
按类型装配,功能比@Autowired少,没有使用的必要。
--定义Bean的作用域和生命过程
@Scope("prototype")
值有:singleton,prototype,session,request,session,globalSession
@PostConstruct
相当于init-method,使用在方法上,当Bean初始化时执行。
@PreDestroy
相当于destory-method,使用在方法上,当Bean销毁时执行。
--声明式事务
@Transactional
Spring中注解的使用详解的更多相关文章
- Spring boot注解(annotation)含义详解
Spring boot注解(annotation)含义详解 @Service用于标注业务层组件@Controller用于标注控制层组件(如struts中的action)@Repository用于标注数 ...
- Spring各种注解标签作用详解
@Autowired和@Resource等注解是将Spring容器中的bean注入到属性,而@Component等注解是将bean放入Spring容器中管理. @Autowired spring2.1 ...
- spring中bean的配置详解--定义parent
在工作中碰到了好多的配置文件,具体来说是spring 中bean配置的parent的配置,搞的我一头雾水,仔细看一下spring中有关bean的配置,剖析一下,具体什么含义! 一.Spring IoC ...
- Spring中的事务管理详解
在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...
- Tomcat与Spring中的事件机制详解
最近在看tomcat源码,源码中出现了大量事件消息,可以说整个tomcat的启动流程都可以通过事件派发机制串起来,研究透了tomcat的各种事件消息,基本上对tomcat的启动流程也就有了一个整体的认 ...
- spring中的idref标签详解
spring中的idref元素 idref元素是一个简单的对容器中存在的另外一个bean的检错途径(通过id); <idref bean="someBeanId"/> ...
- Spring中的applicationContext文件详解
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- Spring中的jar包详解
下面给大家说说spring众多jar包的特点吧,无论对于初学spring的新手,还是spring高手,这篇文章都会给大家带来知识上的收获,如果你已经十分熟悉本文内容就当做一次温故知新吧.spring. ...
- Spring中bean的scope详解
如何使用spring的作用域: <bean id="role" class="spring.chapter2.maryGame.Role" scope=& ...
随机推荐
- LA 3662 Another Minimum Spanning Tree (曼哈顿距离最小生成树 模板)
题目大意: 曼哈顿最小距离生成树 算法讨论: 同上. 这回的模板真的准了. #include <iostream> #include <cstring> #include &l ...
- 【译】JavaScript 开发者年度调查报告
截至目前有超过了 5000 人参与了(该次调查),准确的说是 5350 人.我迫不及待的想要和大家分享一下这次调查的细节.在分享之前我想要感谢参与调查的每一个人.这是 JavaScript 社区一个伟 ...
- css3实现手机qq空间菜单按钮
工作之余写的一个类似于QQzone的菜单效果 先上截图: 图一为点击按钮前界面: 图二为点击按钮后的界面 下面上代码: <!--css部分--> <style type=" ...
- javascript:自定义事件初探
javascript:自定义事件初探 http://www.cnblogs.com/jeffwongishandsome/archive/2008/10/27/1317148.html
- Windows10 磁盘活动时间百分之百导致系统卡顿解决方法
最近电脑边的特别慢,打开任务管理器发现是磁盘活动时间时不时的就会变成100%.起初是以为硬盘出问题了,后来网上查了一下才发现很多人都遇到过这个问题,其原因就是Windows的SuperFetch和家庭 ...
- html5本地存储web storage的简单使用
html5的一个非常cool的功能,就是web storage,类似于之前的cookie,不过与之不同的是,web storage 拥有本地5兆的容量可以存储,而cookie却只有4K,这是完全不能比 ...
- regular expression 基本语法
正则检测网址: http://regexpal.isbadguy.com/ (不包含界定符) 或 http://tool.chinaz.com/regex unicode转换工具 : htt ...
- npm install Error:EPROTO: protocol error, symlink '../mime/cli.js' -> '/vagrant/src/nodejs/node_modules/express/node_modules/send/node_modules/.bin/mime'
我在ubuntu上使用npm安装依赖是出现下面错误: npm ERR! Linux 3.13.0-101-genericnpm ERR! argv "/usr/bin/nodejs" ...
- project euler 26:Reciprocal cycles
A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with d ...
- mysql不能链接远程,报(Host '***.***.***.***' is not allowed to connect to this MySQL server)
Host '***.***.***.***' is not allowed to connect to this MySQL server 其中***...是本机公网ip; 解决办法: 首先看报错窗口 ...