一:@Rsource注解的使用规则

1.1.案例演示

Spring的主配置文件:applicationContext.xml(因为我这里将会讲到很多模块,所以我用一个主配置文件去加载各个模块的配置文件):

具体业务模块配置文件applicationContext-di-annotation.xml

业务类Person.java和Student.java

---------------------------------------------------------------------------------------------------------------------------------------

客户端代码:

执行结果是:student_annotation

1.2.使用总结

A:@Resource使用规则:

1.在spring的xml配置文件中导入命名空间及规范。
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-2.5.xsd

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的配置文件中导入命名空间及规范

xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd

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注解,就会进行如下法则:

如果其value属性的值为“”
@Component
public class Person(){
}
等价于
<bean id="person" class="......Person"></bean>(如果value值不写,默认的是类名首字母小写,其他不变)
如果其value属性的值不为“”
@Component("p")
public class Person(){
}
等价于
<bean id="p" class="......Person"></bean>

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中注解的使用详解的更多相关文章

  1. Spring各种注解标签作用详解

    @Autowired和@Resource等注解是将Spring容器中的bean注入到属性,而@Component等注解是将bean放入Spring容器中管理. @Autowired spring2.1 ...

  2. Spring中的事务管理详解

    在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...

  3. Spring中的jar包详解

    下面给大家说说spring众多jar包的特点吧,无论对于初学spring的新手,还是spring高手,这篇文章都会给大家带来知识上的收获,如果你已经十分熟悉本文内容就当做一次温故知新吧.spring. ...

  4. Spring中bean的scope详解

    如何使用spring的作用域: <bean id="role" class="spring.chapter2.maryGame.Role" scope=& ...

  5. (转)java之Spring(IOC)注解装配Bean详解

    java之Spring(IOC)注解装配Bean详解   在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看 ...

  6. SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解

    SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解 博客分类: 跟开涛学SpringMVC   6.6.2.@RequestParam绑定单个请求参数值 @RequestParam用于 ...

  7. [置顶] 深入浅出Spring(三) AOP详解

    上次的博文深入浅出Spring(二) IoC详解中,我为大家简单介绍了一下Spring框架核心内容中的IoC,接下来我们继续讲解另一个核心AOP(Aspect Oriented Programming ...

  8. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  9. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

随机推荐

  1. ajax-登陆+验证码

    登陆用户名和密码判断+验证码验证 省略dao层和service层 1.生成验证码的number.jsp <%@ page contentType="image/jpeg" l ...

  2. linux vi(vim)常用命令汇总

    1 查找 /xxx(?xxx) 表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示向上查找其中xxx可以是正规表达式,关于正规式就不多说了. 一般来说是区分大小写的, 要想不区分大 ...

  3. Qt qml pageview 左右滑动分页组件

    [先看效果] [下载]http://download.csdn.net/detail/surfsky/8516949 [调用] 分页视图 左右分页滑动列表组件 示例 PageView{ id: pv ...

  4. Visual Studio Xamarin编译Android项目出错的解决办法

    安装完Xamarin后,编译Android项目时,你会发现好长时间进度都不动,当你取消编译后,会发现其实是出错了,就是因在Android项目在第一次编译时要去google网站上下一个andorid s ...

  5. Python.Django视频教程(全13集)

    Python.Django视频教程(全13集)教程目录: 下载地址:http://www.fu83.cn/thread-205-1-1.html

  6. sbt的assembly插件使用(打包所有依赖)

    1.sbt是什么 对于sbt 我也是小白, 为了搞spark看了一下scala,学习scala时指定的构建工具就是sbt(因为sbt也是用scala开发的嘛),起初在我眼里就是一个maven(虽然ma ...

  7. C语言课程1——Hello World

    相信大家看了第一篇文章后,都信心满满,后边咱来点实际吧,上代码,经典之作:Hello World. 首先,不知道大家用的什么工具,VC6.0(太老了,强烈建议不用),VS,或是其他~ Hello Wo ...

  8. 编程第一个Apple Watch程序创建项目

    编程第一个Apple Watch程序创建项目 2.4  编程第一个程序 本节将通过编写第一个程序,为开发者讲解如何添加Watch应用对象.运行程序.界面设计.编写代码等内容本文选自Apple Watc ...

  9. [Js]JavaScript闭包和范围的快速测试

    1. if (!("a" in window)) { var a = 1; } alert(a); [分析]代码含义:如果window不包含属性a,就声明一个变量a并赋值为1 ①J ...

  10. IIS安装错误导致网站访问不了

    如下图,网站正常但就是访问不了,原因是IIS配置不正确,把ASP.NET4.5等相关勾选上就可以了,不要用默认的勾选,要自己手动勾选.