参考博客: https://blog.csdn.net/u013412772/article/details/73741710

引用文章地址:

https://my.oschina.net/HeliosFly/blog/203902(重点推荐!!!!!) 
http://wiki.jikexueyuan.com/project/spring/annotation-based-configuration/spring-autowired-annotation.html 
https://www.tianmaying.com/tutorial/spring-auto-wiring 
http://www.cnblogs.com/liuzy2014/p/6692781.html 
http://blog.csdn.net/baple/article/details/17891755

前言:

@Autowired注解代码定义

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD,
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}

从上述定义中,我们可以得出@Autowired注解只有一个属性即required属性,此属性的默认值为true,即默认情况下它要求依赖对象必须存在,如果不存在会出现空指针等错误;如果允许为null,可以设置它required属性为false.其中@Autowired注解和标注的变量的类的set和get方法无关,自动装配的实现并不是依赖set方法的方式实现的.在xml中利用

<property name="" value="" />

这种方式是依赖对应类的set方法的方式实现的 @Autowired注解使用之前首先确定判断一下此处能够使用@Autowired注解.


一、 @Autowired注解使用场景介绍

(1)构造函数

(2)成员变量

(3)Setter方法

(4)普通方法

二、 @Autowired注解所涉及的原理部分

其实在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>  

注意事项:

在使用@Autowired时,首先在容器中查询对应类型的bean,

    如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
    
    如果查询的结果不止一个,那么@Autowired会根据名称来查找。
    
    如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false
    

上述过程说明了@Autowired注解默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;

三、 处理使用@Autowired注解出现自动装配的歧义性问题

使用@Autowired注解的过程中,如果出现NoUniqueBeanDefinitionException异常,大多是因为自动装配或者其他方式装配所导致的歧义性.即一个接口存在两个以上的实现类.即在自动装配的时候,可能出现因重名问题导致的NoUniqueBeanDefinitionException异常.

@Autowired是按类型进行装配的,那么我一个接口UserInterface,有多个实现类

AImpl(@service(name="userInterface1")),BImpl(@service(name="userInterface2")

等等这些实现类都加入了Spring容器,当在一个类中使用如下语句:

@Autowired
private IUserInterface userInterface;

在下面列举一下了一下,上述问题以及类似的装配歧义性解决问题方法.

方法一

首先加上注解@Qualifier来区分不同的实例.通过在实现接口的类上通过value属性去命名不同的名称,对于@Repository、@Service 和 @Controller 和 @Component四个注解都有类似value属性可以设置,例如:

@Service(value="userServiceImpl")
public class UserServiceImpl implements IUserService{ } @Autowired
@Qualifier("userServiceImpl")
private IUserService userServiceImpl;

方法二

因为一个借口存在两个以上的实现类,也可以通过标识首选哪个bean,来解决歧义性问题.例如:

@Component
@Primary
public class UserServiceImpl implements IUserService{ }

此时,如果引用到了IUserService接口的实现类注入,则首先注入@Promary注解标注的类,但是此时有一个问题,在同一个接口的实现类中,你只能使用一次@Primary,如果对于AImpl和BImpl都使用了@primary,则还是会发生装配的歧义性.此时,建议使用(1)的方式来解决歧义性问题.

<4>方法三

最后一种方式,可以使用自定义的限定符注解,但是此种情况很少出现,再次就不做介绍,可自行百度.

四、 Spring通过哪些特性实现自动装配的?

Spring从两个角度来实现自动化装配:

(1)组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean.
(2)自动装配(autowiring):Spring自动满足bean之间的依赖.

组件扫描和自动装配组合在一起就能发挥出强大的威力,它们能够将你的显示配置降低到最少.

五、@Autowired和@Resource之间的区别

在本文只列举出@Autowired和@Resource之间常见的表面区别,至于区别的原因需要查看Spring官方文档中的@Autowired注解实现方式和Java中@Resource注解实现方式.

(1)、@Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;

(2)、@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;

(3)、@Resource注解是由J2EE提供,而@Autowired是由spring提供,故减少系统对spring的依赖建议使用@Resource的方式;

(4)、@Resource和@Autowired都可以书写标注在字段或者该字段的setter方法之上

(5)、@Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属 性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找 依赖对象.注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖的对象时候,会回退到按照类型装配,但一旦指定了name属性,就只能按照名称装配了.

六、Spring是如何启动自动扫描的

在这里列举出三种启动自动扫描的方式.

方式一:此种情况下,针对比较特殊的情形,即项目中运用了SpringBoot,则可以利用@SpringBootApplication注解的方式启动自动扫描功能.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

方式二:通过XML配置方式,启动自动扫描功能.XML配置方式

<?xml version="1.0" encoding="UTF-8"?>
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.tianmaying" />
</beans>

标签将会开启Spring Beans的自动扫描,并可设置base-package属性,表示Spring将会扫描该目录以及子目录下所有被@Component标注修饰的类,对它们进行装配。

方式三:通过Java配置方式,启动自动扫描功能.

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.cn.config")
public class BlogSystemConfig {
/**
* 在这里实现java方式的配置,
*/
}

在这里给出一个具体的实例:

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
@ComponentScan(basePackages = "com.cn.config")
public class DataSourceConfig { @Bean(name="dataSource")//java配置方式,配置数据源(dataSource)
public BasicDataSource dataSource(){
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.postgresql.Driver");
dataSource.setUrl("jdbc:postgresql://127.0.0.1:5432/center_db?useUnicode=true&characterEncoding=UTF-8");
dataSource.setUsername("postgres");
dataSource.setPassword("123456");
dataSource.setInitialSize(5);
dataSource.setMaxActive(10);
return dataSource;
} }

关于@Configuration和@ComponentScan两个注解: 
(1)@Configuration表示这个Java文件是一个配置文件,这类Java代码的作用在于配置,要和普通的Java代码区分开发,因此一般我们需要将其放在一个专门的包中,在代码例子中是com.cn.config。

(2)@ComponentScan表示开启Spring Beans扫描,类似于XML配置,这里也可以可以设置basePackages属性。 
如果@ComponentScan注解没有显示去给其他的属性赋值的话,比如此处给basePackages赋值了,如果没有的话,@ComponentScan注解会扫描与配置类相同的包.

注意:

关于@Repository、@Service 和 @Controller 和 @Component四个注解的使用情形 
在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释.这里就是说把这个类交给Spring管理,重新起个名字叫userManager,由于不好说这个类属于哪个层面,就用@Component.

七、Spring存在几种装配方式?

目前,在Spring中,一共提供三种装配方式:

    (1)基于标注的自动装配
(2)基于XML配置的显式装配
(3)基于Java配置的显式装配

在实际项目中,一般是上述三种装备方式都可能存在,不过基于标注的自动装配方式是在项目中最常用的.通过给Java类增加相应的标注,就能够启用Spring隐式的Bean发现机制,并自动完成装配过程.我们在开发中应该尽可能使用自动装配,足以应付开发中的绝大多数情况.在某些情况下,基于XML配置和基于Java配置的显式装配会有用武之地,比如实例化一个第三方库中的Bean.这种情况下,Java配置和XML配置我们优先使用Java配置,因为这是一种类型安全的方式,能够在编译时就尽早发现错误. 
关于上述所说的类型安全可以这样理解: 
如果使用字符串的形式,在xml中类名或其他硬编码方式提供的信息,在开发时是发现不了的,会在运行时抛出异常。而使用Java配置形式,类名或其他硬编码配置信息写错的话,编译时就会提示错误,比如Eclipse中就会提示找不到类的错误信息,这就避免了这种情况下的运行时异常,因此是更加安全的.

Spring @Autowired使用介绍的更多相关文章

  1. Spring MVC 使用介绍(十五)数据验证 (二)依赖注入与方法级别验证

    一.概述 JSR-349 (Bean Validation 1.1)对数据验证进一步进行的规范,主要内容如下: 1.依赖注入验证 2.方法级别验证 二.依赖注入验证 spring提供BeanValid ...

  2. Spring MVC 使用介绍(十四)文件上传下载

    一.概述 文件上传时,http请求头Content-Type须为multipart/form-data,有两种实现方式: 1.基于FormData对象,该方式简单灵活 2.基于<form> ...

  3. Spring MVC 使用介绍(十三)数据验证 (一)基本介绍

    一.消息处理功能 Spring提供MessageSource接口用于提供消息处理功能: public interface MessageSource { String getMessage(Strin ...

  4. springboot:spring data jpa介绍

    转载自:https://www.cnblogs.com/ityouknow/p/5891443.html 在上篇文章springboot(二):web综合开发中简单介绍了一下spring data j ...

  5. spring boot(五)Spring data jpa介绍

    在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...

  6. Spring @Autowired、@Resource、@Required、@Component、@Repository、@Service、@Controller注解的用法和作用

    Spring @Autowired,@Resource,@Required注解的用法和作用 Spring中 @Autowired标签与 @Resource标签 的区别 Spring注解@Compone ...

  7. Guide to Spring @Autowired

    Guide to Spring @Autowired Spring希望由@Autowired注解的依赖在某个依赖bean被构造时是可以访问的.如果框架不能解析这个用于wiring的bean,就会抛出异 ...

  8. Spring Framework简单介绍

    Spring Framework        学习java编程不知不觉已经三年时间了,開始的时候,总是喜欢看着视频,然后按部就班的敲打着键盘,每当系统正常执行后.心里乐开了花.最開始的时候,所有的代 ...

  9. Java之Spring Cloud概念介绍(非原创)

    文章大纲 一.理解微服务二.Spring Cloud知识介绍三.Spring Cloud全家桶四.参考资料下载五.参考文章 一.理解微服务   我们通过软件架构演进过程来理解什么是微服务,软件架构的发 ...

随机推荐

  1. 8、SRR数据下载https://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/2.8.2/

    1.prefetch SRRxxxxxx         -/ncbi/public/sra 2.fastq-dump --split-files xxxxxxsra 3.SRA.SAM以及Fastq ...

  2. p2341&bzoj1051 受欢迎的牛

    传送门(洛谷) 传送门(bzoj) 题目 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C ...

  3. C# 生成chm帮助文件

    引用博友的博客地址,里面有详细资料,谢谢博主分享 http://blog.csdn.net/snakorse/article/details/44963015

  4. 八数码 Java实现

    参考http://blog.csdn.net/helloworld10086/article/details/41853389 package com.EightNumber.view; import ...

  5. cc和gcc

    cc就是一个链接文件连接到gcc中.只不过cc是unix中常用的编辑工具,而在linux中用的gcc.有一些在unix中写好的程序要放在linux中,所以要指定命令cc为gcc,其实一样.用where ...

  6. 学习:数学----gcd及扩展gcd

    gcd及扩展gcd可以用来求两个数的最大公因数,扩展gcd甚至可以用来求一次不定方程ax+by=c的解   辗转相除法与gcd 假设有两个数a与b,现在要求a与b的最大公因数,我们可以设 a=b*q+ ...

  7. 前端 HTML-CSS 规范

    黄金定律 一个项目应该永远遵循同一套编码规范! 不管有多少人共同参与同一项目,一定要确保每一行代码都像是同一个人编写的. HTML 语法 用两个空格来代替制表符(tab) – 这是唯一能保证在所有环境 ...

  8. 解决Eclipse导入Gradle项目时在 Building gradle project info 一直卡住

    问题描述 在使用 Eclipse 导入 Gradle 项目时一直卡住,不能导入项目 问题解决   解决办法主要有两种:一是直接下载 gradle 离线包,二是修改项目的 ..\gradle\wrapp ...

  9. CMD当前代码页修改

    python3.x在程序开发中统一的编码是 UTF-8,但是进行交互式编程的时候会经常遇到乱码问题,这是因为Window cmd的默认编码是GBK.与程序采用的 UTF-8 不一致造成的中文及特殊字符 ...

  10. 08.Spring Bean 解析 - BeanDefinitionDocumentReader

    基本概念 BeanDefinitionDocumentReader ,该类的作用有两个,完成 BeanDefinition 的解析和注册 . 解析:其实是解析 Ddocument 的内容并将其添加到  ...