spring学习笔记之一:构建spring demo

知识储备

  • spring有两个很大的特点:面向切面编程(AOP)和依赖注入(DI),现在只了解DI简单介绍DI
  • 应用场景:类A的某个属性是B类对象,这种情况实例化类的时候必须要创建这个B对象,也就意味着需要向A类中引入另一个类B
import B;
class A {
    private B b;
    public A(){
        b= new B()
    }
}

---->使用上述方式缺点明显在于:

  • AB耦合度很高
  • 并且对A做单元测试的时候,没有办法mock B
  • 因此DI引入。

DI简单理解

  1. 依赖注入是什么:创建一个需要依赖其他类B的对象A,DI会将A依赖的B给,而不是让A自己去获取
  2. DI实际功能:DI帮助我们创建了对象并且管理依赖关系。当我们将类的创建和装配交给别的类管理时候,我们只需要简单的使用例如@Inject@Autowired这些注解直接注入对象即可。
  3. 如何实现DI:XML或者创建ApplicationContext类(这个后面会详细解析)
  4. DI
  5. 但是上一条的前提是要求我们的类比如A使用构造器注入方式
class A {
    private B b;
    public A(B b){
        this.b = b;
    }
}
  • 装配:创建应用组件之间协作的行为(比如我要创建一个A的bean但是我需要B那么创建A的Bean的过程就是装配)

注意点:使用IDEA+gradle当你引入新的depend的时候要点击下方的import否则包不会引入--->也就等同于如果不npm install 那么就不会引入库

spring的配置

  • 作用:1.告诉spring那些类需要Bean2.告诉spring针对那些有依赖的类,如何创建他的Bean
  • 方式:1.使用xml文件配置 2. 使用javaConfig类配置 3.隐式的bean发现机制和自动赚

一: spring的自动化配置

自动化配置分成两个方向:

  • 1.组件扫描:扫描就是找到需要创建Bean的类并且将Bean创建好放入到spring的上下文
  • 2.自动装配:类似于上文中的A类bean的创建需要依赖B的bean这时候创建A的Bean将B的bean注入A就是自动装配
自动化扫描
  • what:就是通过为类添加注解,告诉spring那些类需要创建Bean
  • how:1.为需要bean的类添加@Component/@Service/@等注解,作用是告诉spring这些类是需要创建Bean的(类似于在某个方法上添加@Bean注解)。 2.添加configuration类:作用是告诉spring去找类似于@Component这类创建Bean
    3.简单的在你的运行类中加载spring的时候让他去执行configuration类即可
  • example:https://github.com/iepgnahz/auto-configuration.git commitId 2f6775f2660787fcfacc6e8c62032bbead5f7e25
自动化扫描中遇到的bug
  • Q1:我想通过测试自动注入的cd是否存在,来确定我们使用的@Component和@ComponentScan是否可以spring创建CD的bean,但是测试中我只添加了@Runwith注解立刻就爆出没办法创建Test bean,为什么?
  • A1:虽然我们创建了config类,但是在运行测试的时候并没有让测试执行config类,因此,我们需要在运行类的定义处添加注解@ContextConfiguration提醒运行类执行config类
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
//@SpringBootTest  //你会发现使用这个注解不需要上面那个注解也可以成功运行,我认为是这个注解自动去扫描了@Component类并且为你创建了Bean
public class AutoConfigApplicationTests {
    @Autowired
    private CompactDisc cd;

    @Test
    public void play_should_print_CD_info() throws Exception {
        assertThat(cd).isNotNull();
    }   //这测试仅仅是用来确定cd 可以自动扫描并创建bean(仅仅使用两个注解)

}

  • Q2:为什么当我们只添加上面代码中的@SpringBootTest就可以运行成功?
  • A2:我猜测是springBoot自动帮我们创建了Config类并让spring执行,找到所有带有@Component@Service等的类并未他们创建Bean
自动化装配
  • why/what:某个类A其中有个属性是B对象,当创建A的bean的时候需要到spring上下文中找B的bean才能创建成功,希望B的bean可以自动注入A的Bean中就是自动化装配
  • how:使用@Autowired注解自动注入B入A
class A{

    private B b;

    @Autowired
    public A(B b){
    this.b =b
    }  //这是构造方法注入,推荐使用这种方式,这样可以方便的对A做单元测试,因为可以在使用A的构造方法同时注入一个mock的B bean
    
}
class A{
    @Autowired
    private B b;
    //这是直接注入
    
}

@Autowired可以用在属性的声明之前还可以用在各种带有Bean参数的方法前,诸如构造方法,setB方法,但是要求参数必须是可以注入的Bean

自动化装配demo中遇到的bug
  • Q1:想要对CDplayer类做一个单元测试,因此需要Mock掉使用的CompactDisc的对象测试CDPlayer的playCD方法,然而playCD是一个没有返回值的方法,那我该如何测试呢?并且其中调用了CompactDisc的play方法也是没有返回值的,那么该如何mock?
  • A1:针对没有返回值函数的测试,我们使用verify测试一下函数是否被调用即可。

  • Q2:那么verify该如何使用呢?
  • A2:verify可以用来测试某一个被mock的对象中的方法是否被调用或者调用几次或者使用什么参数调用,但是注意:verify的第一个参数就是那个被mock的对象,并且verify只能检测被mock掉的对象中方法的调用情况,没有被mock的对象没办法测试

  • Q3.无法确定veriy能够处理的对象有哪些呢?因为我记得在nodejs中只有把对象spy了才能够监测他,在java中不需要吗?
  • A3:verify既可以处理Mock的对象也可以处理spy对象
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容