代码的注释中由详细的解释
首先是基础类:
package com.wpw.spring4.test.assemble;
public interface Animal {
public void play();
}
package com.wpw.spring4.test.assemble;
import org.springframework.stereotype.Component;
/**
*
* @Component 注解表明该类会作为组件类,并告知Spring要为这个类创建bean。
* 可以设置@Component的value来为其设置ID。如果没有设置,Spring会将类名的第一个字母变为小写作为ID
* @Component 可以用java依赖注入规范中提供的@Named注解代替
*
*
*
*/
@Component
public class Cat implements Animal {
@Override
public void play() {
System.out.println("I am a cat");
}
}
package com.wpw.spring4.test.assemble;
public class SimCard {
public void sendMsg() {
System.out.println("I am a SimCard");
}
}
package com.wpw.spring4.test.assemble;
public class Phone {
private SimCard simCard;
public Phone(SimCard simCard) {
this.simCard = simCard;
}
public void call() {
simCard.sendMsg();
}
}
javaConfg类
package com.wpw.spring4.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.wpw.spring4.test.assemble.PackageScan;
import com.wpw.spring4.test.assemble.Phone;
/**
* @Configuration 注解表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。
*
* @ComponentScan 注解能够在spring中启用组件扫描,如果没有其他配置的话,默认会扫描与配置类相同的包,
* Spring将会扫描这个包以及这个包下的所有子包,查找带有@Component注解的类。
* 如果我们想要将配置类放在单独的包中,使其与其他应用代码分开,需要配置@ComponentScan的属性
* 1.value:知道包的名称。
* 2.basePackages:指定多个包的名称,以逗号分隔。例如:basePackages={"com.aa","com.bb"}
* 3.basePackageClasses:指定包中包含的类或者接口。例如:basePackageClasses={A.class, B.class}
*/
import com.wpw.spring4.test.assemble.SimCard;
@Configuration
@ComponentScan(basePackageClasses = {PackageScan.class})//PackageScan为一个空接口,只是为了标记扫描的包
public class AssembleConfig {
/**
* 简单的bean
* @Bean 注解会告诉Spring这个方法返回一个对象,该对象要注册为Spring应用上下文中的bean
* 默认情况下,bean的ID与方法名是一样的
*/
@Bean
public SimCard simCard() {
return new SimCard();
}
/**
* simCard方法上添加了@Bean注解,Spring将会拦截所有对它的调用,并确保直接返回该方法所创建的bean,而不是每次都对其进行实际调用
* 默认情况下,spring中的bean都是单例的
*/
@Bean
public Phone phone() {
return new Phone(simCard());
}
/**
* 当Spring调用phone2方法创建bean的时候,它会自动装配一个SimCard到配置方法中
* 通过这种方式引入其他bean是最佳方式
*/
@Bean
public Phone phone2(SimCard simCard) {
return new Phone(simCard);
}
}
测试类:
package com.wpw.spring4.test.assemble;
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 com.wpw.spring4.config.AssembleConfig;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=AssembleConfig.class)
public class AssembleTest {
@Autowired
private Animal cat;
@Autowired
private SimCard simCard;
@Autowired
private Phone phone;
@Test
public void test1() {
cat.play();
}
@Test
public void test2() {
simCard.sendMsg();
}
@Test
public void test3() {
phone.call();
}
}