Spring推荐面向接口编程,这样可以很好的解耦具体的实现类。

CompactDisc.class 文件:

public interface CompactDisc {

    void play();
}

SgtPeppers.class 文件:

import org.springframework.stereotype.Component;

/*
* 使用注解 @Component 生命该类为一个组件,并告知Spring要为这个类创建bean实例
* Spring 应用上下文中所有的 bean 都有一个 ID 。
* 如果没有明确设置 ID ,Spring 会根据类名(将类名首字母小写)为其指定一个 ID。
*
* 明确设置 ID ,只需要将自定义的 ID 名传递给 @Component 注解即可,如:
* @Component("lonelyHeartsClub")
*
* 也可以使用 @Named 注解来设置 ID,如:
* @Named("lonelyHeartsClub")
* 该注解来源于 java 依赖注入规范
* */
@Component
public class SgtPeppers implements CompactDisc { private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "The Beatles"; @Override
public void play() {
System.out.println("Playing " + title + " by " + artist);
}
}

CDPlayerConfig.class 文件:

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; /*
* Spring 的组件扫描默认是不启用的,需要显式配置启用组件扫描去寻找被 @Component 注解修饰的组件类,并为其创建 bean 实例。
* */ // 标记类 CDPlayerConfig 是 Spring 的配置类,通过 java 代码定义 Spring 的装配规则。
@Configuration
/*
* 声明启用 Spring 的组件扫描。
*
* 默认组件扫描包:
* 默认扫描配置类所在的包,及其子包,查找被 @Component 注解标记的类,并为其创建 bean 实例。
*
* 显式指定组件扫描包:
* 如果我们想要将配置类放在单独的包中,使其与其他的应用代码区分开来,这时默认的扫描包就不能满足需求了。
* 这时可以通过设置 @ComponentScan 注解的 value 属性值,来明确指定需要扫描的包,如:
* @ComponentScan("需要扫描的包名")
*
* 如果想更清晰的表明设置的是基础扫描包,可以使用 basePackages 属性,如:
* @ComponentScan(basePackages={"包名1","包名2",...})
*
* 上面才用 String 类型设置扫描包的方式是类型不安全的,如果重构代码,指定的基础包就很可能会出错。
* Spring 提供了另一种设置扫描包的方式:使用 basePackageClasses 属性,将要扫描的包指定为该包中所包含的类或接口,如:
* @ComponentScan(basePackageClasses={CompactDisc.class, SgtPeppers.class})
* 被指定的类或接口所在的包,将会作为组件扫描的基础包。
* 实践技巧:可以在需要扫描的包中创建一个用来进行扫描的空的标记接口,通过标记接口的方式,可以避免引用任何实际的程序代码,避免重构造成影响。
*
* 在XML中启用组件扫描:
* 在 XML 中启用组件扫描,使用 context 命名空间的 <context:component-scan> 元素,如:
* <context:component-scan base-package="需要被扫描的包名">
* */
@ComponentScan
public class CDPlayerConfig {
}

CDPlayerTest.class 文件:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import static org.junit.Assert.assertNotNull; // 使用 Spring 的 SpringJUnit4ClassRunner ,以便在测试开始的时候自动创建 Spring 的应用上下文。
@RunWith(SpringJUnit4ClassRunner.class)
// 声明需要加载的配置类
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest { /*
* 自动装配,就是让 Spring 自动满足 bean 依赖的一种方法。
* 使用 @Autowired 标记的属性,Spring 会自动将所需的依赖值注入进来。
*
* 如果有且只有一个 bean 匹配依赖需求,Spring 会自动将这个 bean 装配进来;
* 如果没有匹配的 bean ,那么在应用上下文创建时,Spring 会抛出一个异常。
* 为了避免次异常,可以将 @Autowired 注解的 required 属性设置为 false ,如:
* @Autowired(required=false)
* 此时 Spring 会尝试进行自动装配,但如果没有匹配的 bean ,Spring 将会让这个 bean 处于未转配的状态。
*
* 如果有多个 bean 都能满足依赖关系的话,Spring 也会抛出一个异常,因为没有明确指定选择哪个 bean 进行装配。
*
* @Autowired 是 Spring 特有的注解,我们也可以使用 @Inject 注解代替(@Inject 来源于 java 依赖注解规范)
* */
@Autowired
private CompactDisc cd; /*
* @Autowired 注解不仅能用在构造器上,还可以用在属性的 setter 方法上。
* */
@Autowired
public void setCd(CompactDisc cd) {
this.cd = cd;
} /*
* 实际上 @Autowired 注解可以用在类的任何方法上。
* */
public void insertDisc(CompactDisc cd) {
this.cd = cd;
} @Test
public void cdShouldNotBeNull() {
assertNotNull(cd);
}
}

Spring自动装配bean的更多相关文章

  1. Spring 自动装配 Bean

    Spring3系列8- Spring 自动装配 Bean 1.      Auto-Wiring ‘no’ 2.      Auto-Wiring ‘byName’ 3.      Auto-Wiri ...

  2. Spring自动装配Bean详解

    1.      Auto-Wiring ‘no’ 2.      Auto-Wiring ‘byName’ 3.      Auto-Wiring ‘byType 4.      Auto-Wirin ...

  3. Spring自动装配Bean的五种方式

    在Spring中,支持 5 自动装配模式. no – 缺省情况下,自动配置是通过“ref”属性手动设定,在项目中最常用byName – 根据属性名称自动装配.如果一个bean的名称和其他bean属性的 ...

  4. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring自动装配Bean

    除了使用 XML 和 Annotation 的方式装配 Bean 以外,还有一种常用的装配方式——自动装配.自动装配就是指 Spring 容器可以自动装配(autowire)相互协作的 Bean 之间 ...

  5. spring 自动装配 bean 有哪些方式?

    Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系.作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起. spring中bean装配有两种方式 ...

  6. Spring3系列8- Spring 自动装配 Bean

    Spring3系列8- Spring 自动装配 Bean 1.      Auto-Wiring ‘no’ 2.      Auto-Wiring ‘byName’ 3.      Auto-Wiri ...

  7. Spring入门(5)-自动装配Bean属性

    Spring入门(5)-自动装配Bean属性 本文介绍如何装配Bean属性. 0. 目录 ByName ByType constructor 默认自动装配 混合使用自动装配和显示装配 1. ByNam ...

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

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

  9. Spring的自动装配Bean

    spring的自动装配功能的定义:无须在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>.<constructor-arg>).IOC容器会 ...

随机推荐

  1. chrome浏览器设置12px以下字体大小

    内容很简单 在 body 上添加一个 css 属性即可. .body { -webkit-text-size-adjust: none; } 结束,晚安!

  2. Spring Cloud学习路线

    学习本学习路线学习完,大家将会对微服务.Spring Cloud.Docker.Kubernetes有一个系统.全面的认识.通过学习,将能掌握相关的知识体系,并能够投入到项目实战中去. 本学习路线采用 ...

  3. 利用C语言编辑画图程序的实现方法

    不知道大家在进行开发县级电网调度自动化系统的时候,是否都会遇到一个问题就是:要绘制一个电力系统一次接线图.大家都应该知道其实电力系统的一次接线图是较为复杂的,如果想要使用一般的编程方法来进行绘制的话, ...

  4. Linux教程之:Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)

    Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use) 使用命令关闭占用80端口的程序 sudo fuser - ...

  5. 怎样下载YouTube 4K视频

    随着科技的进步,人们生活水平的提高,视频的清晰度也越来越高,以前那个观看模糊视频的时代已经一去不复返了.从最开始的720P和1080P高清视频,再到2K,进而到如今的4K(即3840×2160)极清视 ...

  6. sublime打开txt文件乱码的问题

    我们使用Sublime打开TXT文件的时候,会经常因为编码的问题造成乱码. 这是因为TXT记事本的默认保存编码格式是GBK,而Sublime text不支持GB2312和GBK编码. 我们可以通过安装 ...

  7. ssd论文解读

    https://www.sohu.com/a/168738025_717210 https://www.cnblogs.com/lillylin/p/6207292.html https://blog ...

  8. Spring 学习之依赖注入

    什么是依赖关系? 纵观所有的Java 应用,从基于Applet的小应用到多层次结构的企业级别的应用,他们都是一种典型的依赖性应用,也就是由一些互相协作的对象构成的,Spring把这种互相协作的关系称之 ...

  9. Kettle报表自动化

    来自我们牛逼哄哄的东哥的笔记 1.   2. 3. 选择数据库链接 贴报表SQL 4. 文件名:选择路径,excel文件由kettle自动创建,自己只需输入创建文件的名称. 拓展名:后缀写上 5. 此 ...

  10. html5 canvas中CanvasGradient对象用法

    html5 中canvas提供了强大的渲染样式,可以实现一些比较复杂的样式设置,今天学习了CanvasGradient对象可以实现一个颜色的渐变 CanvasGradient对象可以实现两种不同形式的 ...