Spring in action 笔记(2)
装配 bean
装配 bean
Spring提供了三种方式装配bean
- 在xml中配置
- 在java中配置
- 使用自动装配(推荐)
一、自动化装配
首选写个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