上一篇已经介绍了自动化装配https://www.cnblogs.com/fionyang/p/11123900.html

  接下来就要介绍两种显示装配的方式了,分别是java代码装配和XML文件装配。。。

  那我不禁就要问了,既然自动装配方案这么好用,并且在大多数情况下也被推荐使用,为啥还要另外两种装配方案呢?那只是因为有时自动化装配方案也行不通,比如你想将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和@Autowired注解的啊,所以只能换方案喽。。。。

  2. 通过java代码装配bean

    1)创建配置类

      这种方案其实就是创建JavaConfig类,首先看看怎么用的,如下:

@Configuration
public class CarConfig{}

  上面这种,其实就创建了一个JavaConfig类,关键在于为其添加@Configuration注解,@Configuration表明这个类(CarConfig类)就是一个配置类,该类包含在Spring应用上下文中如何创建bean的细节。

2)声明简单bean

  要在JavaConfig类中声明bean,只需要编写一个方法,这个方法会创建一个实例,然后给这个方法添加@Bean注解即可,如下:

@Configuration
public class CarConfig{
@Bean
public Wheels getWheels() {
return new Wheels();
}
}

  这个@Bean注解会告诉Spring这个方法将会返回一个对象,该对象注册为Spring应用上下文中的bean,并且这个bean的ID将会和方法名相同,也就是getWheels。可是我不想去这个名字啊,太丑了吧,咋办?来来来,看下面:

@Configuration
public class CarConfig{
@Bean(name = "wheels")
public Wheels getWheels() {
return new Wheels();
}
}

  这才对嘛,通过name属性可以指定bean的ID,所以这里这个bean的ID将会是wheels。。。。事实上,这种方式来声明bean有很大的好处,就是@Bean所注解的方法内部可以自行发挥,只要最终生成的是一个返回类型的势力即可,如下:

//此处假设Wheels是一个接口,LexusWheels、AudiWheels和benzWheels都是Wheels的实现类
@Configuration
public class CarConfig{
@Bean(name = "wheels")
public Wheels getWheels() {
int flag = (int)Math.floor(Math.random() * 3);
if (flag == 0) {
return new LexusWheels();
}else if (flag == 1) {
return new AudiWheels();
}else {
return new BenzWheels();
}
}
}

  上面这段代码可以很好的说明,我们对bean的创建有更好的掌控性,可以尽情添加自己想要的东西。

3)借助JavaConfig实现注入

  在JavaConfig中装配bean最简单的方式就是引用创建bean的方法,如:

@Configuration
public class CarConfig{
@Bean(name = "wheels")
public Wheels getWheels() {
return new Wheels();
} @Bean
public Car getCar() {
return new Car(getWheels());
}
}

  这里在创建ID为getCar的bean时,会直接注入getWheels,看起来getWheels好像是通过调用getWheels()方法得到的,但是不是这样的,由于getWheels()方法上面加了@Bean注解,Spring会拦截对该方法的调用,并直接返回该方法生成的bean,而不是每次都实际调用。可是只能这么注入吗?看起来怪怪的,还难理解,有木有其他方式呢?那既然问了,就必须有,哈哈,

02-三种Bean装配机制(二)的更多相关文章

  1. 02-三种Bean装配机制(三)

    在前两篇中分别介绍了自动化装配机制和通过JavaConfig类进行装配,接下来介绍下通过XML装配bean,其实就目前趋势来看,这种方式用的越来越少(不是我说的,是作者说的,喜欢这种方式的别喷我

  2. 02-三种Bean装配机制(一)

    Spring要创建哪些bean并且如何将其装配在一起,现有的,主要是三种装配机制: 自动化装配 通过java代码装配 通过XML装配 这三种装配机制可以互相搭配使用,即是可以共存的.接下来就分别介绍啦

  3. 框架源码系列九:依赖注入DI、三种Bean配置方式的注册和实例化过程

    一.依赖注入DI 学习目标1)搞清楚构造参数依赖注入的过程及类2)搞清楚注解方式的属性依赖注入在哪里完成的.学习思路1)思考我们手写时是如何做的2)读 spring 源码对比看它的实现3)Spring ...

  4. JavaBean ,Enterprise Bean(EJB), 三种Bean, 以及POJO

    Bean简单的理解,可以理解为组件,一组通用方法的组合: JavaBean就可以称为Java组件,是所有组件的统称,EJB称为企业级 Java组件: 三种Bean: 1). session beans ...

  5. css中的三种基本定位机制

    css中的三种基本定位机制 a.普通文档流 b.定位:相对定位 绝对定位 固定定位 c.浮动 1.普通流中,元素位置由文档顺序和元素性质决定,块级元素从上到下依次排列,框之间的垂直距离由框的垂直mar ...

  6. 02 Spring框架 简单配置和三种bean的创建方式

    整理了一下之前学习Spring框架时候的一点笔记.如有错误欢迎指正,不喜勿喷. 上一节学习了如何搭建SpringIOC的环境,下一步我们就来讨论一下如何利用ioc来管理对象和维护对象关系. <? ...

  7. 【转】Spring 中三种Bean配置方式比较

    今天被问到Spring中Bean的配置方式,很尴尬,只想到了基于XML的配置方式,其他的一时想不起来了,看来Spring的内容还没有完全梳理清楚,见到一篇不错的文章,就先转过来了. 以前Java框架基 ...

  8. Spring 中三种Bean配置方式比较

    今天被问到Spring中Bean的配置方式,很尴尬,只想到了基于XML的配置方式,其他的一时想不起来了,看来Spring的内容还没有完全梳理清楚,见到一篇不错的文章,就先转过来了. 以前Java框架基 ...

  9. 分享知识-快乐自己:Spring中的(三种)异常处理机制

    案例目录结构: Web.xml 配置: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application ...

随机推荐

  1. 【Java】【Flume】Flume-NG阅读源代码AvroSink

    org.apache.flume.sink.AvroSink是用来通过网络来数据传输的.能够将event发送到RPCserver(比方AvroSource),使用AvroSink和AvroSource ...

  2. get与post一些特殊情况下

    p=574"> 文章已经迁移至http://androiddevelop.cn/?p=574 版权声明:本文博客原创文章.博客,未经同意,不得转载.

  3. 《Docker 实战》第三章 Docker Hub 寻宝游戏

    # 秘密仓库和密码 docker run --rm -it --name password dockerinaction/ch3_ex2_huntanswer

  4. C# WebBrowser的使用

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  5. Delphi中的线程类 - TThread详解

    Delphi中的线程类 - TThread详解 2011年06月27日 星期一 20:28 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本 ...

  6. 关于Socket的建立及连接

    最近在做一个东西,目前考虑的是采用Socket连接,从网上找了一个SuperSocket的socket通信框架.... 关于Socket连接,个人并不是搞得太懂,写的东西也全是个人理解,那么这里先整理 ...

  7. WPF读取和显示word

    引言 在项目开发中,word的读取和显示会经常出现在客户的需求中.特别是一些有关法律规章制度.通知.红头文件等,都是用word发布的. 在WPF中,对显示WORD没有特定的控件,这对开发显示WORD的 ...

  8. 没必要看源码。。把文档学通就已经牛逼了(我们大多还是在应用层,还达不到研究的程度。附class与examples大全链接)

    [学霸]深圳-鑫 2017/7/11 13:54:07只是学习怎么用QT的话,不用看源码.看帮助文档就很好要学习编码风格与思路,就看看源码 [学神]武汉-朝菌 2017/7/11 13:54:39没必 ...

  9. #467 – 使用UniformGrid 均分行和列(Use a UniformGrid for Evenly Spaced Rows and Columns)

    原文 #467 – 使用UniformGrid 均分行和列(Use a UniformGrid for Evenly Spaced Rows and Columns) UniformGrid 布局面板 ...

  10. RSA加密解密及RSA签名和验证

    原文:RSA加密解密及RSA签名和验证 1.RSA加密解密: (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)加密 (3)解密2.RSA签名和验证 (1)获取密钥,这里是 ...