在spring ioc容器中,spring要先完成bean的定义和生成,然后需要需要注入的资源,在上一篇的扫描组件中就是这样实现的。而自动装配中我们只需要定义和生成一个bean,发现bean的过程将由spring自己完成,它是怎么发现的呢?答案是通过注解@Autowired,这个单词的意思就是自动装配,当我们在一个资源上使用了这个注解之后,spring如果发现这个注解,就会根据对应的类在生成的bean中找到对应的目标完成自动装配,不需要我们自己定义一个配置类告知spring需要扫描的包路径等信息。所以如果注解方式再细分的话,还能分成两种:

  • 注解@Component+java配置
  • 注解@Component+注解@Autowired

其实在扫描组件方式装配的例子中,我所定义的类它的成员变量都是基本类型,如果碰到引用类型就不太好办,恰好自动装配可以解决这一问题。自动装配实现只需要两步:定义资源-获取资源,同组件扫描方式相比,它少了一步扫描资源的步骤,因为这个是由spring自己完成的。下面举实例说明:

假设我要在controller层许调用service层的方法,这时候获取service对象我们就可以通过spring的自动装配完成。

一、定义资源(使用注解@Component)

 @Component
public class CoderService { private SqlSession sqlSession = null;
private CoderMapper coderMapper = null; // insert a coder to database
public void saveCoder(Coder coder) {
try {
sqlSession = MybatisTool.getSqlSession();
coderMapper = sqlSession.getMapper(CoderMapper.class);
int res = coderMapper.insert(coder);
sqlSession.commit();
System.out.println(res > 0 ? "保存成功" : "保存失败");
} catch (Exception e) {
System.out.println("保存失败");
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
}

定义bean的时候还是需要用到注解@Component,这样spring ioc容器就能生成对应类的bean实例。

二、获取资源(使用注解@Autowired)

 public class CoderController {

     @Autowired
public CoderService coderService = null; public void save(Coder coder) {
coderService.saveCoder(coder);
}
}

通过上面的注解@Autowired,spring就会自动装配coderService这个bean,这样我们就可以直接在save方法中调用其方法了。

通过以上两步就能轻松实现bean的装配,不用java配置并告诉spring扫描路径等信息,可见配置的越来越少,这种方式就比较适合含引用变量的bean的装配。它虽然简单好用,但是也有一个缺点,就是歧义性。

三、自动装配的歧义性

什么是歧义性呢?因为spring是根据类型在已经生成的所有bean中查找对应的bean实例,如果这个类型是个接口,既然是接口就会有多个实现类,这个时候spring ioc容器岂不是蒙圈了?我找到了这么多,到底选哪个呢?这是不是就出现歧义了呢?spring中提供了两种方式解决这个问题

  • 注解@Primary:用在类上,表示优先使用这个类的bean
  • 注解@Qualifier("组件名"):用在引用变量上,参数组件名是注解Component中的定义的名称

这样说有些晦涩难懂,直接上代码举例吧:

1⃣️定义一个接口CoderService

 /*
* 定义一个接口,提供coding方法
*/ public interface CoderService {
public void coding();
}

2⃣️定义两个实现类JavaCoderServiceImpl和PhpCoderServiceImpl并实现CoderService接口

 @Component("javaCoderService")
@Primary
public class JavaCoderServiceImpl implements CoderService{ @Override
public void coding() {
System.out.println("使用java开发");
}
} @Component("phpCoderService")
public class PhpCoderServiceImpl implements CoderService { @Override
public void coding() {
System.out.println("使用PHP开发");
}
}

上面的方法类中,两个都使用了@Component注解生成用来生成bean,而JavaCoderServiceImpl类上还有一个注解@Primary用来设置优先级,就是在spring查找到两个相同类型的实例时,优先选择含有@Primary注解的这个。

3⃣️自动装配调用方法

 @Component("coderController")
public class CoderController { @Autowired(required=false)
public CoderService coderService = null; public void coding() {
coderService.coding();
}
}

上面通过@Autowired注解进行自动装配,并设置required为false,意味着不是必须的,以防在找不到时抛出异常,因为默认是true;这种方式只能是控制bean的优先权,并不能容器自己选择合适的类型,这就有了@Qualifier(bean名称)注解,这个注解相当于按bean名称进行装配,它作用于变量上,此时可以删除注解@Primary,装配方式如下:

 @Component("coderController")
public class CoderController { @Autowired(required=false)
@Qualifier("javaCoderService")
public CoderService coderService = null; public void coding() {
coderService.coding();
}
}

以上就是自动装配方式。

装配SpringBean(五)--注解装配之自动装配的更多相关文章

  1. SpringBoot启动流程分析(五):SpringBoot自动装配原理实现

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  2. 五、Spring之自动装配

    Spring之自动装配 ​ Spring利用依赖注入(DI),完成对IOC容器中各个组件依赖关系的赋值. [1]@Autowired @Autowired 注解,它可以对类成员变量.方法及构造函数进行 ...

  3. 装配SpringBean(四)--注解装配之组件扫描

    前两篇文章我总结了通过XML方式装配bean的实现方式,虽然比较简单,但是需要配置很多,很多时候我们都会使用注解进行装配.使用注解的方式可以减少XML的配置,既能实现XML的功能,还提供了自动装配功能 ...

  4. Spring注解开发系列Ⅴ --- 自动装配&Profile

    自动装配: spring利用依赖注入和DI完成对IOC容器中各个组件的依赖关系赋值.自动装配的优点有: 自动装配可以大大地减少属性和构造器参数的指派. 自动装配也可以在解析对象时更新配置. 自动装配的 ...

  5. Spring装配Bean之组件扫描和自动装配

    Spring从两个角度来实现自动化装配: 组件扫描:Spring会自动发现应用上下文中所创建的bean. 自动装配:Spring自动满足bean之间的依赖. 案例:音响系统的组件.首先为CD创建Com ...

  6. Java的注解机制——Spring自动装配的实现原理

    http://www.cnblogs.com/Johness/archive/2013/04/17/3026689.html

  7. Spring中@Autowired注解与自动装配

    1 使用配置文件的方法来完成自动装配我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. ...

  8. @Resource注解完成自动装配

    @Resource注解是通过名字来自动装配的.在spring中自动装配的模式如果是通过名字来自动装配那么必须保证bean的名字和pojo 的属性名一直. 下面是详细代码:说明了@Resource注解是 ...

  9. Spring——原理解析-利用反射和注解模拟IoC的自动装配

    解析Spring的IoC容器基于注解实现的自动装配(自动注入依赖)的原理 1.本文案例 使用注解和反射机制来模拟Spring中IoC的自动装配功能 定义两个注解:@Component,用来标注组件:@ ...

随机推荐

  1. Ubunto 无法连接ssh客服端

    解决办法: (1)查看ip地址是否冲突 我在单位的虚拟机ip地址是192.168.14.85,与其它机器冲突了.改成了192.168.14.83   (2)关闭Ubuntu14.04的防火墙 root ...

  2. PPM 信号解析

    PWM信号 PWM信号用于控制单个电调或者单个舵机脉冲宽度调制信号. 像华科尔DEVO 10遥控接收器(RX1002)就输出10路PWM,参看下图. 舵机(电调)上用到PWM信号种类很多,我们这里对常 ...

  3. QT之QSettings 学习

    1.读写配置文件. 代码如下: //创建配置文件 QSettings iniFile(QCoreApplication::applicationDirPath()+"/test.ini&qu ...

  4. MATLAB 中自定义函数的使用

    MATLAB在文件内部(在函数内部)定义函数,但文件名以开头函数来命名,与Java中每个文件只能有一个公开类,但在文件内部还是可以定义其他非公开类一个道理. 无参函数 do.m function do ...

  5. [转]WPF的BitmapImage的文件无法释放及内存泄露的问题

    相信用过WPF的BitmapImage的,都在用类似这样的代码来解决文件无法删除的问题! 如果看看msdn上简单的描述,可以看到这样的说明: 如果 StreamSource 和 UriSource 均 ...

  6. ThinkPHP模型基础类提供的连贯操作方法

    ThinkPHP模型基础类提供的连贯操作方法(也有些框架称之为链式操作),可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作. 直线电机哪家好 使用也比较简单, 假如我们现在要查 ...

  7. csps-s模拟测试60嘟嘟噜,天才绅士少女助手克里斯蒂娜,凤凰院凶真题解

    题面:https://www.cnblogs.com/Juve/articles/11625190.html 嘟嘟噜: 约瑟夫问题 第一种递归的容易re,但复杂度较有保证 第二种适用与n大于m的情况 ...

  8. 报javax.servlet.ServletException: Servlet.init() for servlet [springmvc] threw exception的解决记录

    1.异常详情: 2.异常分析: 从异常的详情中看出:companyService未找到,出现这种情况的愿意可能是companyServiceImpl类没有交给IOC容器管理,但是经过我已经在该类上打了 ...

  9. JavaSE_12_序列化流和打印流

    1.1 序列化流概述 Java 提供了一种对象序列化的机制.用一个字节序列可以表示一个对象,该字节序列包含该对象的数据.对象的类型和对象中存储的属性等信息.字节序列写出到文件之后,相当于文件中持久保存 ...

  10. Audio 标签的使用和自己封装一个强大的React音乐播放器

    原文地址:https://www.dodoblog.cn/blog?id=5be84d5c70b2b617f27a4610 这篇文章主要介绍一下博客里的这个音乐播放器是怎么写的 为了更好的表达高深的东 ...