Spring in action 笔记(2) 装配 bean



Spring in action 笔记(2)

装配 bean

Spring提供了三种方式装配bean

  1. 在xml中配置
  2. 在java中配置
  3. 使用自动装配(推荐)
一、自动化装配

首选写个CompactDisc(压缩碟片)的接口,还有他的一个实现类SgtPeppers

package com.springinaction.ch02;

public interface CompactDisc {
    public void play();

    void destroy();
}

package com.springinaction.ch02;

import org.springframework.stereotype.Component;
//@Name("id")
/*注解 装配 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() {
        // TODO Auto-generated method stub
        System.out.println("Playing " + title + " by " + artist);
    }
    public void destroy(){

    }
}

SgtPeppers使用了@Component的注解,被这个注解标记说明这个类是一个组件,在自动装配时会扫描到这个类并用这个类创建所需要的bean,不过扫描是默认关闭的,需要配置开启

再来个CDPlayerConfig类,来作为配置

package com.springinaction.ch02;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class CdPlayConfig {

}


这个类中的@Configuration注解表示这个类是一个spring配置类,@ComponentScan就是开启自动扫描,默认会扫描与配置类相同的包,及这个包下的所有子包,查找带有@Component注解的类,也可以用xml开启

新建一个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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <context:component-scan base-package="com.springinaction.ch02"/>
</beans>

需要导入context注意上面,这样就配置好了自动装配

测试类

package com.springinaction.ch02;

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.*;

@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration("classpath:com/springinaction/ch02/cdPlayConfig.xml")
@ContextConfiguration(classes = com.springinaction.ch02.CdPlayConfig.class)
public class CDPlayerTest {
    @Autowired
    private CompactDisc cd;
    @Test
    public void cdShouldNotBeNull(){
        assertNotNull(cd);
    }


}

@ContextConfiguration是测试时选的配置文件

@RunWith是junit的一个注解,表示用SpringJUnit4ClassRunner来测试

@Autowired是spring的一个注解,用于自动装配,对于这个来说就是在容器中寻找可以转化成CompactDisc的bean然后装入CompactDisc中

package com.springinaction.ch02;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/*注解 装配 java类 + 自动*/
@Component
public class CDPlayer  implements MediaPlayer {
    private CompactDisc cd;

    @Autowired
    public CDPlayer(CompactDisc cd) {
        this.cd = cd;
    }

    public void setCd(CompactDisc cd) {
        this.cd = cd;
    }

    @Override
    public void play() {
        cd.play();
    }


}

@Autowired 不仅可以用于对属性装配,还可以用于 set和 构造函数

验证

package com.springinaction.ch02;

import org.junit.Rule;
import org.junit.Test;
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;

import static org.junit.Assert.*;

@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration("classpath:com/springinaction/ch02/cdPlayConfig.xml")
@ContextConfiguration(classes = com.springinaction.ch02.CdPlayConfig.class)
public class CDPlayerTest {
    @Rule
    public final SystemOutRule log=new SystemOutRule().enableLog();
    @Autowired
    private CompactDisc cd;

    @Autowired MediaPlayer mediaPlayer;
    @Test
    public void cdShouldNotBeNull(){
        assertNotNull(cd);
    }

    @Test
    public void testPlay(){
        mediaPlayer.play();
        assertEquals("Playing Sgt. Pepper's Lonely Hearts Club Band by The Beatles\n",log.getLog());
    }

}

SystemOutRule 是来自System-rule里面的一个类,上面使用的SystemOutRule().enableLog(); 是读取控制台的输出

System-rule: 链接: https://pan.baidu.com/s/1-moYKePNr2E9F7rTvsJD9Q 提取码: 7dhw

二、java类装配

创建配置类

package com.springinaction.ch02;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CdConfig {
    @Bean
    public CompactDisc compactDisc(){
        return new SgtPeppers();
    }
}

@Bean声明了一个Bean,Bena的id默认为返回的类名首字母小写,上面那个就是compactDisc,当然你也可以使用@Ben(name=‘compactDisc’)来配置
@Bean(initMethod=“方法”) 在创建时调用方法初始化
@Bean(destroyMethod = “方法”) 在bean销毁时调用方法

三、xml配置装配

首先新建一个Spring的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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
 

</beans>

声明一个Bean,并初始化

<?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" xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
       <util:list id="cdconfig">
           <value></value>
       </util:list>
       <bean id="compactDisc" class="com.springinaction.ch02.BlankDisc" c:_0="Sgt. Pepper's Lonely Hearts Club Band">
           <constructor-arg value="The Beatles"/>
           <constructor-arg ref="cdconfig"/>
           <!--<constructor-arg>-->
               <!--<list>-->
                   <!--<value></value>-->
               <!--</list>-->
           <!--</constructor-arg>-->
       </bean>

</beans>

这个里面的util是springxml中的一个工具 上面就是利用的util声明了一个id为cdconfig的list,然后声明了一个Bean constructor-arg是构造函数的参数, value是使用的字符串的值,ref是引用id为cdconfig的Bean也就是声明的那个list
xml 也可以配置initMethod 和 destroyMethod ,也java类配置相似,就不多说了

 <constructor-arg ref="cdconfig"/>

也可用c命名空间来代替,不过我们需要先导入xmlns:c=“http://www.springframework.org/schema/c

同时我们也可以使用set来初始化

<?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"
       xmlns:c="http://www.springframework.org/schema/c" xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
       <util:list id="cdconfig">
           <value></value>
       </util:list>
<bean id="compactDisc" class="com.springinaction.ch02.BlankDisc" p:title="Sgt. Pepper's Lonely Hearts Club Band">
        <property name="artist" value="The Beatles"/>
        <property name="tracks" ref="cdconfig"/>
        <!--<constructor-arg>-->
        <!--<list>-->
        <!--<value></value>-->
        <!--</list>-->
        <!--</constructor-arg>-->
    </bean>
</beans>
综合配置

java类的配置方式和xml配置方式可以混用

package com.springinaction.ch02;

import org.springframework.context.annotation.*;

@Configuration
//@ComponentScan
//@Import(com.springinaction.ch02.CdConfig.class)
@ImportResource("classpath:com/springinaction/ch02/cdConfig.xml")
public class CdPlayConfig {
    @Bean
    public MediaPlayer mediaPlayer(CompactDisc compactDisc){
        return new CDPlayer(compactDisc);
    }
}

@Import("com.springinaction.ch02.CdConfig.class“) 在CdPlayConfig导入com.springinaction.ch02.CdConfig.class配置类的配置

@ImportResource(“classpath:com/springinaction/ch02/cdConfig.xml”) 在CdPlayConfig导入com/springinaction/ch02/cdConfig.xml xml格式的配置文件

补充:

classpath:从class目录开始算起找到一个符合的文件

classpath*:从class目录开始算起找到多个符合的文件

<?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:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--<context:component-scan base-package="com.springinaction.ch02"/>-->
    <!--导入其他xml-->
    <!--<import resource="classpath:com/springinaction/ch02/cdConfig.xml"/>-->
    <!--导入java config-->
    <bean class="com.springinaction.ch02.CdConfig"/>
    <bean class="com.springinaction.ch02.CDPlayer" p:cd-ref="compactDisc"/>
</beans>

<bean class="com.springinaction.ch02.CdConfig"/>把配置文件申请为一个bean,也就是导入java类配置

<import resource="classpath:com/springinaction/ch02/cdConfig.xml"/>也就是导入xml配置

总结

初学spring,学的不清不楚的,看到第5章前面的都忘记了,还是要做笔记,必须抽空来复习

代码: https://pan.baidu.com/s/1Yc87bHYUUK3ge72DeUlhDQ 提取码: cbwe

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值