尽管通过组件扫描和自动装配实现Spring的自动化配置很方便也推荐,但是有时候自动配置的方式实现不了,就需要明确显示的配置Spring。比如说,想要将第三方库中的组件装配到自己的应用中,这样的情况下,是没办法在它的类上添加 @Compnent和 @Autowired注解的。

在这种情况下,需要使用显示装配的方式,可以分别通过Java和XML实现,推荐使用Java的方式,因为更加强大,类型安全并且重构友好,因为就和我们应用所写的Java代码一样。但是虽然JavaConfig和其他的java代码没有区别,但是在概念上是不同的。所以JavaConfig不应该出现业务逻辑的代码,并建议放在单独的包中,做隔离。

创建配置类

在之前,看到过JavaConfig,我们再看一下:

package soundsystem;
import org.springframework.context.annotation.Configuration; @Configuration
public class CDPlayerConfig { }

创建javaConfig类的关键在于为其添加 @Configuration注解,@Configuration注解表明这个类是一个配置类,该类应该包含Spring上下文中如何创建bean的细节。之前我们都是依赖组件扫描来发现Spring应该创建的bean。尽管可以同时使用组件扫描和显示配置,但是现在我们去掉了 @CompnentScan注解,现在的CDPlayerConfig类就没有任何作用了。如果现在运行之前的测试类,就会失败,并且出现BeanCreationException异常。

声明简单的bean

在JavaConfig中声明bean,需要编写一个方法,该方法会创建所需类型的实例,然后这个方法添加 @Bean注解。

@Bean
public CompactDisc sgtPeppers() {
return new SgtPeppers();
}

@Bean注解会告诉Spring这个方法会返回一个对象,该对象要注册为Spring应用上下文中的bean。

默认情况下,bean的ID与带有 @Bean注解的方法名是一样的,在上面的例子中,bean的ID将会是sgtPeppers。如果想设置不同的ID,那么可以重命名该方法,也可以通过name属性指定一个不通的名字:

@Bean(name="lonelyHeartsClubBand")
public CompactDisc sgtPeppers() {
return new SgtPeppers();
}

借助JavaConfig实现注入

前面声明的CompactDisc很简单,因为没有其他依赖。但现在,我们需要声明CDPlayer bean,它依赖于CompactDisc。

在javaConfig中装配bean的最简单方式就是引用创建bean的方法。

@Bean
public CDPlayer cdPlayer() {
return new CDPlayer(sgtPeppers());
}

注意:看起来,CompactDisc是通过调用sgtPeppers()得到的,但情况并非完全如此。因为sgtPeppers()方法添加了 @Bean注解,Spring会拦截所有对它的调用,并确保直接返回该方法创建的bean,而不是每次都进行实际的调用。

假如引入另外一个CDPlayer bean,他和之前的那个bean完全一样:

@Bean
public CDPlayer cdPlayer() {
return new CDPlayer(sgtPeppers());
} @Bean
public CDPlayer anotherCDPlayer() {
return new CDPlayer(sgtPeppers());
}

如果sgtPeppers()的调用是实际的方法调用,那么每个CDPlayer实例都会有一个特有的SgtPeppers实例。如果是实际的CD播放器和CD光盘的话,很ok,物理上没办法共用一张CD光盘在两个CD播放器上。

但是,在软件中,我们完全是可以将同一个SgtPeppers实例注入到任意数量的其它的bean中。默认情况下,Spring的bean都是单例的,我们并没有必要为第二个CDPlayer bean创建完全相同的SgtPeppers实例。

根本的问题在于,通过调用方法的方式来引入bean有点困惑,还有另外一种方式:

@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
return new CDPlayer(compactDisc);
}

通过这种方式引入其它的bean通常是最佳的方式,因为Spring并不会要求将CompactDisc声明放在同一个配置文件中,甚至不一定是JavaConfig中,可以将配置分布在XML、多个配置类以及自动扫描装配的bean中。

另外,这里的CDPlayer的构造器实现了DI功能,但是我们完全可以根据需求实例化CDPlayer,比如想通过Setter方法注入CompactDisc的话,可以这样:

@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
CDPlayer cdPlayer = new CDPlayer(compactDisc);
cdPlayer.setCompactDisc = compactDisc;
return cdPlayer;
}

转载请注明出处。

作者:wuxiwei

出处:http://www.cnblogs.com/wxw16/p/7704471.html

Spring装配Bean之Java代码装配bean的更多相关文章

  1. 第2章—装配Bean—通过java代码装配bean

    通过java代码装配bean ​ 在进行显式装配的时候,有两种选型方案:java和XML配置,这里先介绍java的配置方式. 2.3.1创建配置类 先复习下上一章的配置内容: @Configurati ...

  2. Spring 之通过 Java 代码装配 bean

    [关于IoC的几点认识] 1.面向接口编程 --> 每层只向上层提供接口 2.inversion of control (IoC)  -->参考百度百科 3.DI是IoC的一种实现方式 [ ...

  3. Spring装配之——JAVA代码装配Bean

    首先创建几个普通的JAVA对象,用于测试JAVA代码装配bean的功能. package soundsystemJava; //作为接口 定义了CD播放器对一盘CD所能进行的操作 public int ...

  4. Spring Boot 使用Java代码创建Bean并注册到Spring中

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/catoop/article/details/50558333 声明同一个类下的多个实例: packa ...

  5. Spring Boot 使用Java代码创建Bean并注冊到Spring中

    从 Spring3.0 開始,添加了一种新的途经来配置Bean Definition,这就是通过 Java Code 配置 Bean Definition. 与Xml和Annotation两种配置方式 ...

  6. (41)Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】

    已经好久没有讲一些基础的知识了,这一小节来点简单的,这也是为下节的在Spring Boot中使用多数据源做准备. 从Spring 3.0开始,增加了一种新的途径来配置Bean Definition,这 ...

  7. Spring进阶—如何用Java代码实现邮件发送(一)

    相关文章: <Spring进阶—如何用Java代码实现邮件发送(二)> 在一些项目里面如进销存系统,对一些库存不足发出预警提示消息,招聘网站注册用户验证email地址等都需要用到邮件发送技 ...

  8. Spring学习系列(三) 通过Java代码装配Bean

    上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean 二.通过Java类装配bean 在前面定义了HelloWorldConfig类,并使用@Compon ...

  9. Spring实战——通过Java代码装配bean

    上篇说的是无需半行xml配置完成bean的自动化注入.这篇仍然不要任何xml配置,通过Java代码也能达到同样的效果. 这么说,是要把上篇的料拿出来再煮一遍? 当然不是,上篇我们几乎都在用注解的方式如 ...

随机推荐

  1. 201521123003《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 我们利用Sca ...

  2. 201521123103 《Java学习笔记》 第五次学习总结

    一.本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. (1).接口更灵活.更方便,可以方便的为现有的系统添加新的功能. (2).is-a ...

  3. 201521123032 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  4. 201521123087 《Java程序设计》第9周学习总结

    1. 本周学习总结 2. 书 面作业 本次PTA作业题集异常 常用异常题目5-11.1 截图你的提交结果(出现学号)1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免?   ...

  5. Thrift教程初级篇——thrift安装环境变量配置第一个实例

    前言: 因为项目需要跨语言,c++客户端,web服务端,远程调用等需求,所以用到了RPC框架Thrift,刚开始有点虚,第一次接触RPC框架,后来没想到Thrift开发方便上手快,而且性能和稳定性也不 ...

  6. lintcode 155 二叉树的最小深度

    二叉树的最小深度   描述 笔记 数据 评测 给定一个二叉树,找出其最小深度. 二叉树的最小深度为根节点到最近叶子节点的距离. 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? Ai ...

  7. jquery-easyUI第一篇【介绍、入门、使用常用的组件】

    什么是easyUI 我们可以看官方对easyUI的介绍: easyUI就是一个在Jquery的基础上封装了一些组件-.我们在编写页面的时候,就可以直接使用这些组件-非常方便-easyUI多用于在后台的 ...

  8. Struts2第十一篇【简单UI标签、数据回显】

    Struts2UI标签 Sturts2为了简化我们的开发,也为我们提供了UI标签-也就是显示页面的标签-.. 但是呢,Struts2是服务端的框架,因此使用页面的标签是需要在服务器端解析然后再被浏览器 ...

  9. Java9新特性之——JShell

    java9已经在北京时间9月22日正式发布,开发者可以在oracle jdk官网上下载到最新的jdk9.jdk9和jdk8中的新特性不同:jdk8中的stream和lambda表达式能够让开发者非常快 ...

  10. Data_Struct(LinkList)

    最近在学数据结构,学到链表这节作业有链表,毕竟菜鸟代码基本照看书上算法写的,再加上自己的小修改,这里先记录下来,万一哪天想看了,来看看. 里面有用到二级指针,还是不太理解,还有就是注释不多,后续有了更 ...