• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > 详解Spring注解--@Autowired、@Resource和@Service

详解Spring注解--@Autowired、@Resource和@Service

作者:五月的仓颉 字体:[增加 减小] 来源:互联网 时间:2017-05-28

五月的仓颉 通过本文主要向大家介绍了springmvc autowired,spring autowired,spring注解 autowired,spring中autowired,@resource autowired等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

什么是注解

传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:

1、如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低

2、在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率

为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。

本篇文章,讲讲最重要的三个Spring注解,也就是@Autowired、@Resource和@Service,希望能通过有限的篇幅说清楚这三个注解的用法。

不使用注解

先看一个不使用注解的Spring示例,在这个示例的基础上,改成注解版本的,这样也能看出使用与不使用注解之间的区别,先定义一个老虎:

public class Tiger
{
 private String tigerName = "TigerKing";
 
 public String toString()
 {
  return "TigerName:" + tigerName;
 }
}
</div>

再定义一个猴子:

public class Monkey
{
 private String monkeyName = "MonkeyKing";
 
 public String toString()
 {
  return "MonkeyName:" + monkeyName;
 }
}
</div>

定义一个动物园:

public class Zoo
{
 private Tiger tiger;
 private Monkey monkey;

 public void setTiger(Tiger tiger)
 {
  this.tiger = tiger;
 }

 public void setMonkey(Monkey monkey)
 {
  this.monkey = monkey;
 }

 public Tiger getTiger()
 {
  return tiger;
 }

 public Monkey getMonkey()
 {
  return monkey;
 }
 public String toString()
 {
  return tiger + "\n" + monkey;
 }
}

</div>

spring的配置文件这么写:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns="http://www.springframework.org/schema/beans" 
 xmlns:context="http://www.springframework.org/schema/context" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
  http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-4.2.xsd"
 default-autowire="byType">

 <bean id="zoo" class="com.xrq.bean.Zoo" >
  <property name="tiger" ref="tiger" />
  <property name="monkey" ref="monkey" />
 </bean>

 <bean id="tiger" class="com.xrq.domain.Tiger" />
 <bean id="monkey" class="com.xrq.domain.Monkey" />
</beans>
</div>

都很熟悉,权当复习一遍了。

@Autowired

@Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。

因此,引入@Autowired注解,先看一下spring配置文件怎么写:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns="http://www.springframework.org/schema/beans" 
 xmlns:context="http://www.springframework.org/schema/context" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
  http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-4.2.xsd">

 <context:component-scan base-package="com.xrq" />

 <bean id="zoo" class="com.xrq.bean.Zoo" />
 <bean id="tiger" class="com.xrq.domain.Tiger" />
 <bean id="monkey" class="com.xrq.domain.Monkey" />
</beans>

</div>

注意第10行,使用必须告诉spring一下我要使用注解了,告诉的方式有很多,<context:component-scan base-package="xxx" />是一种最简单的,spring会自动扫描xxx路径下的注解。

看到第12行,原来zoo里面应当注入两个属性tiger、monkey,现在不需要注入了。再看下,Zoo.java也很方便,把getter/setter都可以去掉:

public class Zoo
{
 @Autowired
 private Tiger tiger;
 
 @Autowired
 private Monkey monkey;
 
 public String toString()
 {
  return tiger + "\n" + monkey;
 }
}
</div>

这里@Autowired注解的意思就是,当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去。

有一个细节性的问题是,假如bean里面有两个property,Zoo.java里面又去掉了属性的getter/setter并使用@Autowired注解标注这两个属性那会怎么样?答案是Spring会按照xml优先的原则去Zoo.java中寻找这两个属性的getter/setter,导致的结果就是初始化bean报错。

OK,假设此时我把.xml文件的13行、14行两行给去掉,再运行,会抛出异常:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Zoo': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.xrq.domain.Tiger com.xrq.bean.Zoo.ttiger; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.xrq.domain.Tiger] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
 at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
 at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
 at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
 at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
 at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
 at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
 at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
 at com.xrq.test.MyTest.main(MyTest.java:13)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.xrq.domain.Tiger com.xrq.bean.Zoo.ttiger; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.xrq.domain.Tiger] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.fact



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解Spring注解--@Autowired、@Resource和@Service
  • 详解Spring注解--@Autowired、@Resource和@Service

相关文章

  • 2017-05-28java中多态概念、实现原理详解
  • 2017-05-28C# 中Excel导入时判断是否被占用三种方法
  • 2017-05-28详谈Java编程之委托代理回调、内部类以及匿名内部类回调(闭包回调)
  • 2017-05-28详解Javascript判断Crontab表达式是否合法
  • 2017-05-28Java根据模板导出Excel报表并复制模板生成多个Sheet页
  • 2017-05-28Java Iterator迭代器_动力节点Java学院整理
  • 2017-05-28超实用的Java快捷键(总结)
  • 2017-05-28详谈Java编程之委托代理回调、内部类以及匿名内部类回调(闭包回调)
  • 2017-05-28spring mvc+localResizeIMG实现HTML5端图片压缩上传
  • 2017-05-28Java 泛型总结(二):泛型与数组

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Java技术汇总
    • Java装饰器设计模式_动力节点Java学院整理
    • Java网络通信基础编程(必看篇)
    • java 获取用户的MAC地址多种方法实例详解
    • SpringMVC中日期格式的转换
    • java向文件中追加内容与读写文件内容源码实例代码
    • 详谈java线程与线程、进程与进程间通信
    • 详解Spring全局异常处理的三种方式
    • 浅谈对java中锁的理解
    • Java 实现随机验证码功能简单实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有