@ComponentScan(basePackageClasses={CDPlayer.class, DVDPlayer.class})

public class CDPlayerConfig { }

这些类所在的包将会作为组件扫描的基础包。**系统中大部分类还是存在相互依赖的现象,所以我们就需要了解自动装配。**  **简单来说,自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用上下文中寻找匹配某个bean需求的其他bean。为了声明要进行自动装配,我们可以借助Spring的@Autowired注解**。比如实现CD播放器的类,播放器接口是有一个play方法

package com.springinaction;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

@Component

public class CDPlayer implements MediaPlayer {

private CompactDisc compactDisc;@Autowiredpublic CDPlayer(CompactDisc compactDisc){this.compactDisc = compactDisc;}@Overridepublic void play() {compactDisc.play();}

}

以上使用的是自动装配构造器,还能用在属性Setter方法上

@Autowired

public void setCompactDisc(CompactDisc compactDisc){

this.compactDisc = compactDisc;

}

如果没有匹配的bean,那么在应用上下文创建时,Spring会抛出一个异常。为了避免异常的出现,你可以将@Autowired的required属性设置为false:

@Autowired(required=false)

public CDPlayer(CompactDisc compactDisc){

this.compactDisc = compactDisc;

}

如果有多个bean都能满足依赖关系的话,Spring将会抛出一个异常。  另:@Autowired可以用@Inject代替现在,我们已经在CDPlayer的构造器中添加了@Autowired注解,Spring将把一个可分配给CompactDisc类型的bean自动注入进来,为了验证,我们进行测试

package com.springinaction;

import static org.junit.Assert.*;

import org.junit.Test;

import org.junit.Rule;

import org.junit.contrib.java.lang.system.SystemOutRule;

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;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes=CDPlayerConfig.class)

public class CDPlayerTest {

@Rulepublic final SystemOutRule log = new SystemOutRule().enableLog();@Autowiredprivate CompactDisc sgtPeppers;@Autowiredprivate CDPlayer cdPlayer;@Testpublic void cdShouldNotBeNull(){assertNotNull(sgtPeppers);}@Testpublic void play(){cdPlayer.play();assertEquals("Playing Sgt. Pepper's Lonely Hearts Club Band " +"by The Beatles\n",log.getLog());}

}

测试成功![img](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy84ODEwMzk3LWE5ZDVkMTAwNjRmMGFlNDcucG5n?x-oss-process=image/format,png)[]( )2.3 通过Java代码装配bean------------------------------------------------------------------------------当自动化的方案行不通的时候,就必须采用显示装配的方式。显示装配有两种可选方案:JavaConfig和XML。其中JavaConfig是更好的方案,因为它更为强大、类型安全并且对重构友好。继续上面的示例代码,首先创建配置类

package com.springinaction;

import org.springframework.context.annotation.*;

@Configuration

public class CDPlayerConfig {

}

@Configuration注解表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。  我们移除之前的@ComponentScan,使用显示配置

@Bean

public CompactDisc sgtPeppers(){

return new SgtPeppers();

}

@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含了最终产生bean实例的逻辑。默认情况下,bean的ID与带有@Bean注解的方法名一样。在本例中,bean的名字将会是sgtPeppers。也可以重命名

@Bean(name=“lonelyHeartsClubBand”)

public CompactDisc sgtPeppers(){

return new SgtPeppers();

}

下面我们将CD注入到CDPlayer中

@Bean

public CDPlayer cdPlayer(CompactDisc compactDisc){

return new CDPlayer(compactDisc);

}

需要注意的有两点:1.  构造器中不能用new创建的对象(这个对象的类是已经在Spring中被声明的),因为Spring会拦截所有对已声明对象的调用,并确保直接返回该方法所创建的bean。这是由于Spring所创建的bean都是单例的。2.  compactDisc会在Spring中寻找已经实现CompactDisc的bean。[]( )2.4 通过XML装配bean---------------------------------------------------------------------------先来看最简单的SpringXML配置

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns=“http://www.springframework.org/schema/beans”

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context"><!-- configuration details go here -->
借助Spring Tool Suite创建XML配置文件创建和管理Spring XML配置文件的一种简便方式是使用Spring Tool Suite(https://spring.io/tools/sts)。我们来简单声明一个bean
下面我们来看一些特征1.  不再需要直接负责创建SgtPeppers的实例,而在基于JavaConfig的配置中需要。当Spring发现这个元素时,它将会调用SgtPeppers的默认构造器来创建bean。2.  这个bean中,我们将bean的类型以字符串的形式设置了class属性中。没有类型检查。XML声明DI时,会有很多种可选的配置方案和风格。具体到构造器注入,有两种基本的配置方案可供选择:*   `<constructor-arg>`元素*   使用Spring3.0所引入的c-命名空间先来看一下他们各组如何注入bean引用构造器注入bean引用
<constructor-arg ref="compactDisc"/>
当Spring遇到这个`<bean>`元素时,它会创建一个CDPlayer实例。`<constructor-arg>`元素会告知Spring要将一个ID为compactDisc的bean引用传递到CDPlayer的构造器中。作为替代方案,也可以使用Spring的c-命名空间。以下是XML的顶部声明其模式。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns=“http://www.springframework.org/schema/beans”

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">....
在c-命名空间和模式声明之后,我们就可以使用它来声明构造器参数了,如下所示:
c的属性的说明如下:![img](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy84ODEwMzk3LTg2MDVlYTNiNmQ2ZjVhOGUuanBn?x-oss-process=image/format,png)spring的c标签的构造器属性属性名以“c:”开头,也就是命名空间的前缀。接下来就是要装配的构造器参数名,在此之后是“-ref”,这是一个命名的约定,它会告诉Spring,正在装配的是一个bean的引用,这个bean的名字是compactDisc,而不是字面量“compactDisc”。还可以将其中引用参数的名称替换成位置信息:
其中“0”代表参数的索引。  下面我们看一下如何将字面量如何装配到对象中去。  我们先新建一个CompactDisc的实现:

package com.springinaction;

import java.util.List;

public class BlankDisc implements CompactDisc {

private String title;private String artist;public BlankDisc(String title, String artist){this.title = title;this.artist = artist;}@Overridepublic void play() {System.out.println("Playing " + title + " by " + artist);}

}

这个实现类中,cd名称和艺术家是可以从构造器注入的。比SgtPeppers的硬编码要灵活。现在我们将已有的SgtPeppers替换为这个类:
<constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band"/><constructor-arg value="The Beatles" />
还可以替换为c标签写法:
也可以用索引:
通常`<constructor-arg>`和c-命名空间的功能是相同的,但一种情况是`<constructor-arg>`能实现,但c-却做不到。现在我们将BlankDisc加入多磁道的属性,并在构造器中能注入。

package com.springinaction;

import java.util.List;

public class BlankDisc implements CompactDisc {

private String title;private String artist;private List<String> tracks;public BlankDisc(String title, String artist, List<String> tracks ){this.title = title;this.artist = artist;this.tracks = tracks;}@Overridepublic void play() {System.out.println("Playing " + title + " by " + artist);for (String track : tracks){System.out.println("-Track: " + track);}}

}

最简单的方式是将列表设置为null
<constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band"/><constructor-arg value="The Beatles" /><constructor-arg><null/></constructor-arg>
更好的解决方法是提供一个磁道名称的列表。  方案一:
<constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band"/><constructor-arg value="The Beatles" /><constructor-arg><list><value>Sgt. Pepper's Lonely Hearts Club Band</value><value>With a Little Help from My Friends</value><value>Lucy in the Sky with Diamonds</value><value>Getting Better</value><value>Fixing a Hole</value></list></constructor-arg>
方案二:  假如构造器的参数还有List,那就使用元素代替。
 <ref bean="sgtPeppers" /><ref bean="whiteAlbum" />.....
如果构造器的参数类型是Set,可以把替换为除了使用构造器注入,我们还可以使用属性的Setter方法进行注入。  假设注入的CDPlayer如下所示

package com.springinaction;

public class CDPlayer implements MediaPlayer {

private CompactDisc compactDisc;public void setCompactDisc(CompactDisc compactDisc){this.compactDisc = compactDisc;}@Overridepublic void play() {compactDisc.play();}

}

Spring的XML注入如下:
<property name="compactDisc" ref="sgtPeppers" />
如果运行测试的话,它应该就能通过了。  还有用p标签的方式替代,需要先声明:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns=“http://www.springframework.org/schema/beans”

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">.....
使用p-命名空间,装配如下:
p-命名空间的描述如下:![img](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy84ODEwMzk3LTM2NDA0YWI5ZTQ2MTE0NWQuanBn?x-oss-process=image/format,png)spring的p便签的setter方式注入介绍完bean注入,接下来介绍字面量注入属性  重新修改BlankDisc,使其所有属性都有setter方法

package com.springinaction;

import java.util.List;

public class BlankDisc implements CompactDisc {

private String title;private String artist;private List<String> tracks;public void setTitle(String title){this.title = title;}public void setArtist(String artist){this.artist = artist;}public void setTracks(List<String> tracks){this.tracks = tracks;}@Overridepublic void play() {System.out.println("Playing " + title + " by " + artist);for (String track : tracks){System.out.println("-Track: " + track);}}

}

### 架构学习资料?**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**![准备两个月,面试五分钟,Java中高级岗面试为何越来越难?](https://img-blog.csdnimg.cn/img_convert/6649d00f5c3ea47024a52d8692aa177d.png)![准备两个月,面试五分钟,Java中高级岗面试为何越来越难?](https://img-blog.csdnimg.cn/img_convert/b92a769559acad53cbaed8b442900cf1.png)![准备两个月,面试五分钟,Java中高级岗面试为何越来越难?](https://img-blog.csdnimg.cn/img_convert/03bdd347f0206b58937f9c0c2e288ac4.png)![准备两个月,面试五分钟,Java中高级岗面试为何越来越难?](https://img-blog.csdnimg.cn/img_convert/76adf9eeb334e3239848133cbe73d7f0.png)![准备两个月,面试五分钟,Java中高级岗面试为何越来越难?](https://img-blog.csdnimg.cn/img_convert/fddb5d689f6351e2b00f8e9cb94f9b41.png)> 由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
ing title){this.title = title;}public void setArtist(String artist){this.artist = artist;}public void setTracks(List<String> tracks){this.tracks = tracks;}@Overridepublic void play() {System.out.println("Playing " + title + " by " + artist);for (String track : tracks){System.out.println("-Track: " + track);}}} 

架构学习资料?

CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

[外链图片转存中…(img-Cw4TnJ28-1630847749092)]

[外链图片转存中…(img-yqm5Q86W-1630847749095)]

[外链图片转存中…(img-JEZtjjku-1630847749096)]

[外链图片转存中…(img-ct1pDouE-1630847749098)]

[外链图片转存中…(img-s1PwJp10-1630847749099)]

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

《Spring实战,【吐血整理】相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. 跨域解决方案(史上最易懂)
  2. grpc在java中使用
  3. sql 精读(二) 标准 SQL 中的编号函数
  4. linux桌面效率提高,ElementaryOS:使用这个轻量级 Linux 桌面提高工作效率
  5. Extension spartacussampledata doesnt specify a path and no scanned extension was matching the name
  6. CF1415D:XOR-gun(异或)
  7. MyBatis学习总结(21)——自定义MyBatis Generator插件
  8. 电子基础知识:常用电子元器件和基本工具
  9. 机器学习之数据预处理——降噪
  10. .net VB中字符串按照换行符号俩来进行分割
  11. 微信公众号如何排版好看?教你三招技巧
  12. 清华大学计算机夏文韬,太猛了--南京外国语学校2007届高三毕业生去向
  13. arduino 矩阵肩膀_表情矩阵——卖萌无需多言(arduino)
  14. 【计算机网络】第一章--计算机网络概述
  15. oracle12c 环境需求,Oracle12C之环境准备工作
  16. Friday BI Fly | 2016年12月02日晚8点半微信直播交流 地理大数据如何驱动智慧选址第42场...
  17. 阿里执行副主席蔡崇信投资NBA篮网队;工信部约谈运营商,不得限制用户资费选择丨价值早报
  18. 数据分析模型 第三章
  19. JVM仍然是君主制:Java主导列表,Kotlin不在决赛名单中
  20. 嵌入式linux驱动开发--设备资源描述

热门文章

  1. C语言编写万年历程序
  2. sun认证 java怎么考_Sun认证Java程序员考试技巧分享
  3. 【期末复习】微机原理与接口技术
  4. Elasticsearch常用搜索和分词器
  5. 网页中播放RTSP(1)
  6. mysql数据库实验4
  7. 看看雅虎助手是如何迫害“兔子”和“360安全卫士”的
  8. 《Netlogo多主体建模入门》学习笔记(2)
  9. 基于spark的微博数据分析
  10. AdventureWorks数据库数据字典研究