一、自动化装配bean

1.组件扫描

2.自动装配

CompactDisc.java

  1. package Autowiring;
  2.  
  3. public interface CompactDisc {
  4. void play();
  5.  
  6. }

SgtPeppers.java

SgtPeppers类上使用了@Component注解。

这个简单的注解表明该类会作为组件类,并告知Spring要为这个类创建bean。没有必要显式配置SgtPeppersbean,因为这个类使用了@Component注解,所以Spring会为你把事情处理妥当。

  1. package Autowiring;
  2.  
  3. import org.springframework.stereotype.Component;
  4.  
  5. @Component
  6. public class SgtPeppers implements CompactDisc {
  7. private String title = "Sgt. Pepper's Lonely Hearts Club Band";
  8. private String artist = "The Beatles";
  9.  
  10. @Override
  11. public void play() {
  12. // TODO Auto-generated method stub
  13. System.out.println("Playing " + title + " by " + artist);
  14. }
  15.  
  16. }

不过,组件扫描默认是不启用的。我们还需要显式配置一下Spring,从而命令它去寻找带有@Component注解的类,并为其创建bean。

  1. package Autowiring;
  2.  
  3. import org.springframework.context.annotation.ComponentScan;
  4. import org.springframework.context.annotation.Configuration;
  5.  
  6. @Configuration
  7. @ComponentScan
  8. public class CDPlayerConfig {
  9.  
  10. }

通过Java代码定义了Spring的装配规则@ComponentScan默认会扫描与配置类相同的包。

因为CDPlayerConfig类位于Autowiring包中,因此Spring将会扫描这个包以及这个包下的所有子包,查找带有@Component注解的类。

这样的话,就能发现CompactDisc的实现类,并且会在Spring中自动为其创建一个bean。

测试

CDPlayerTest.java

  1. package Autowiring;
  2.  
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.test.context.ContextConfiguration;
  7. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  8.  
  9. @RunWith(SpringJUnit4ClassRunner.class)
  10. @ContextConfiguration(classes = Autowiring.CDPlayerConfig.class)
  11. public class CDPlayerTest {
  12. @Autowired
  13. private CompactDisc cd;
  14.  
  15. @Test
  16. public void test() {
  17. cd.play();
  18. }
  19. }

CDPlayerTest使用了Spring的SpringJUnit4ClassRunner,以便在测试开始的时候自动创建Spring的应用上下文。

注解@ContextConfiguration会告诉它需要在CDPlayerConfig中加载配置。因为CDPlayerConfig类中包含了@ComponentScan,因此最终的应用上下文中应该包含CompactDisc这个bean。在测试代码中有一个CompactDisc类型的属性,并且这个属性带有@Autowired注解,以便于将CompactDisc这个bean注入到测试代码之中

二、通过Java代码装配Bean

CDPlayerConfig.java

  1. package Javawiring;
  2.  
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5.  
  6. @Configuration
  7. public class CDPlayerConfig {
  8.  
  9. @Bean
  10. public CompactDisc randomBeatlesCD() {
  11. int choice = (int) Math.floor(Math.random() * );
  12. if (choice == ) {
  13. return new SgtPeppers();
  14. } else if (choice == ) {
  15. return new WhiteAlbum();
  16. } else if (choice == ) {
  17. return new HardDaysNight();
  18. } else {
  19. return new Revolver();
  20. }
  21. }
  22.  
  23. @Bean
  24. public CDPlayer cdPlayer(CompactDisc randomBeatlesCD) {
  25. return new CDPlayer(randomBeatlesCD);
  26. }
  27. }

@Configuration注解表明这个类是一个配置类 , 移除了@ComponentScan注解,此时的CDPlayerConfig类就没有任何作用了。

声明简单的bean

  1. @Bean
  2. public CDPlayer cdPlayer(CompactDisc randomBeatlesCD) {
  3. return new CDPlayer(randomBeatlesCD);
  4. }

CDPlayer实现了一个接口,构造函数的参数是实现了CompactDisc接口的类,然后执行其相应的方法。

  1. @Bean
  2. public CompactDisc randomBeatlesCD() {
  3. int choice = (int) Math.floor(Math.random() * );
  4. if (choice == ) {
  5. return new SgtPeppers();
  6. } else if (choice == ) {
  7. return new WhiteAlbum();
  8. } else if (choice == ) {
  9. return new HardDaysNight();
  10. } else {
  11. return new Revolver();
  12. }
  13. }

三、通过XML装配bean

声明一个bean

  1. <bean id="sgtPepperss" class="XMLwiring.SgtPepperss" ></bean>

测试的时候修改@ContextConfiguration("classpath:SoundSystemXMLwiring.xml"),然后定义相应的对象进行测试。

四、混合装配

两个Java配置文件,在一个总的配置文件中使用@Import({ CDConfig.class, CDPlayerConfig.class })进行结合。

1.在JavaConfig中引用XML配置  <@ImportResource注解>

@ImportResource("classpath:SoundSystemJavaXMLwiring.xml")

2.在XML配置中引用JavaConfig

将Java配置文件当作bean在XML文件中进行声明即可。

笔记3 装配Bean总结的更多相关文章

  1. 《Spring In Action》阅读笔记之装配bean

    Spring主要装配机制 1.在XML中进行显式配置 2.在Java中进行显式配置 3.隐式的的bean发现机制和自动装配 自动化装配bean Spring从两个角度来实现自动化装配 1.组件扫描:S ...

  2. Spring学习笔记--自动装配Bean属性

    Spring提供了四种类型的自动装配策略: byName – 把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中. byType – 把与Bean的属性具有相同类型 ...

  3. [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. #Spring实战第二章学习笔记————装配Bean

    Spring实战第二章学习笔记----装配Bean 创建应用对象之间协作关系的行为通常称为装配(wiring).这也是依赖注入(DI)的本质. Spring配置的可选方案 当描述bean如何被装配时, ...

  5. Spring学习笔记—装配Bean

    在Spring中,对象无需自己负责查找或创建与其关联的其他对象.相反,容器负责把需要相互协作的对象引用赋予各个对象.创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入的本质. ...

  6. SpringInAction读书笔记--第2章装配Bean

    实现一个业务需要多个组件相互协作,创建组件之间关联关系的传统方法通常会导致结构复杂的代码,这些代码很难被复用和单元测试.在Spring中,对象不需要自己寻找或创建与其所关联的其它对象,Spring容器 ...

  7. Spring学习笔记(二)之装配Bean

    一,介绍Bean的装配机制 在Spring中,容器负责对象的创建并通过DI来协调对象之间的关系.但是我们要告诉Spring创建哪些Bean并且如何将其装配在一起.,装配wiring就是DI依赖注入的本 ...

  8. Spring学习笔记(三)之装配Bean

    除了组件扫描与自动装配之外还有基于Java代码的装配与基于XML的装配. 有一些场景是我们不能用自动装配的,比如我们要给第三方库中的组件装配到我们的应用中,这时自动装配无效,因为自动装配只能扫描本应用 ...

  9. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(11):XML和Annotation装配Bean的混合使用(@ImportResource)

    一.XML和Annotation装配Bean如何合理使用 引入第三方资源包中类的时候,建议使用XML配置,而使用自己编写的Java类的时候,推荐使用Annotation注解配置Bean. 二.关于注解 ...

随机推荐

  1. CNN中的padding

    在使用TF搭建CNN的过程中,卷积的操作如下 convolution = tf.nn.conv2d(X, filters, strides=[1,2,2,1], padding="SAME& ...

  2. Web Uploader初始化隐藏容器失败及点击上传图片时反应较慢的问题

    问题1:在一个页面集成一个或者多个文件上传插件,初始化时有些DOM容器是隐藏的,这时候经常会出现初始化失败的情况,虽然按钮样式改变了,但是点击就是没反应(有时候不经意点了哪个地方,或许会出现文件选择框 ...

  3. 为什么java中用枚举实现单例模式会更好

    代码简洁 这是迄今为止最大的优点,如果你曾经在Java5之前写过单例模式代码,那么你会知道即使是使用双检锁你有时候也会返回不止一个实例对象.虽然这种问题通过改善java内存模型和使用volatile变 ...

  4. MyEclipse的多模块Maven web(ssm框架整合)

    Maven的多模块可以让项目结构更明确,提高功能的内聚,降低项目的耦合度,真正的体现出分层这一概念. 我们在操作中,要明白为什么这样做,要了解到更深的层次,这样,我们就不限于个别软件了. 话不多说,直 ...

  5. 新概念英语(1-139)Is that you, John?

    Lesson 139 Is that you, John? 是你吗,约翰? Listen to the tape then answer this question. Which John Smith ...

  6. Python学习之条件判断和循环

    #coding= utf-8 # 条件判断和循环 # 如果if语句判断是True,就把缩进的两行print语句执行了,否则,什么也不做 age1 = 20 if age1 >= 18: prin ...

  7. django的models模型类的常用数据类型和选项

    django框架的models模块ORM框架,能够让我们通过编写类的方式,帮助我们自动生成数据库表. 生成的数据库表名为 应用模块名称_类名 数据库表中字段名 如果我们没有在参数中指定,就是我们写的类 ...

  8. leetcode算法:Distribute Candies

    Given an integer array with even length, where different numbers in this array represent different k ...

  9. [翻译] softmax和softmax_cross_entropy_with_logits的区别

    翻译自:https://stackoverflow.com/questions/34240703/whats-the-difference-between-softmax-and-softmax-cr ...

  10. python三元操作符

    #比较大小更简单了 x,y=3987,24361 small=(x if x<y else y) print(small)   #方法一:比较三个数的大小找出较大的一个 x,y,z=8,1,13 ...