Spring从两个角度来实现自动化装配:
组件扫描(component scanning):Spring会自动发现应用上下文中所创建的Bean
自动装配(autowiring):Spring自动满足Bean之间的依赖
组件扫描和自动装配组合在一起能将显式配置降低到最少
创建可被发现的Bean:
创建CD接口:
package main.java.Demo1;
/**
* @author myvina@qq.com
* @date 18-4-15 下午6:53
*/
public interface CompactDisc {
void play();
}
创建BeatlesCD类实现CD接口: package main.java.Demo1;
import org.springframework.stereotype.Component;
/**
* @author myvina@qq.com
* @date 18-4-15 下午8:50
*/
@Component
public class BeatlesCD implements CompactDisc {
@Override
public void play() {
System.out.println("Playing Beatles");
}
}
使用@Component注解表明该类会作为组件类.
不过组件类默认是不启用的.需要显式配置一下Spring,从而命令它去寻找带有@Component注解的类,并为其创建Bean,如下:
package main.java.Demo1;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @author myvina@qq.com
* @date 18-4-15 下午8:54
*/
@Configuration
@ComponentScan
public class CompactDiskConfig {
}
类CompactDiskConfig通过Java代码定义了Spring的装配规则.
使用@Configuration注解的类表示该文件是一个配置类.
使用@ComponentScan注解表示在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"
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="main.java.Demo1"/>
</beans>
下面来创建一个测试类: package main.java.Demo1;
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.assertNotNull;
/**
* @author myvina@qq.com
* @date 18-4-15 下午6:56
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CompactDiskConfig.class)
public class CDPlayerTest {
@Autowired
private BeatlesCD cd;
@Test
public void cdShouldNotNull(){
assertNotNull(cd);
}
}
测试结果如下: 四月 15, 2018 9:06:30 下午 org.springframework.test.context.support.DefaultTestContextBootstrapper getDefaultTestExecutionListenerClassNames
信息: Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]
四月 15, 2018 9:06:30 下午 org.springframework.test.context.support.DefaultTestContextBootstrapper getTestExecutionListeners
信息: Using TestExecutionListeners: [org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@2ed94a8b, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@38082d64, org.springframework.test.context.support.DirtiesContextTestExecutionListener@dfd3711, org.springframework.test.context.transaction.TransactionalTestExecutionListener@42d3bd8b, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@26ba2a48]
四月 15, 2018 9:06:31 下午 org.springframework.context.support.GenericApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.GenericApplicationContext@6cc4c815: startup date [Sun Apr 15 21:06:31 CST 2018]; root of context hierarchy
Process finished with exit code 0
无错误,表示运行成功.
为组件扫描的Bean命名:
@Component("name")将该组件命名为name
设置组件扫描的基础包:
@ComponentScan("packageName")设置需要扫描的基础包
还可设置扫描多个包:@ComponentScan(basePackages={"package1", "package2"},这样该配置类会扫描多个包:
除了可以设置为String类型之外,还可制定包中所包含的类或接口:@ComponentScan(basePackageClasses={class1, class2}
通过为Bean添加注解实现自动装配:
package main.java.Demo1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author myvina@qq.com
* @date 18-4-15 下午9:16
*/
@Component
public class CDPlayer {
private CompactDisc cd;
@Autowired
public CDPlayer(CompactDisc cd){
this.cd = cd;
}
public void play(){
cd.play();
}
}
@Autowired注解表明创建CDPlayer Bean的时候,会通过这个构造器来进行实例化并且会传入一个可设置给CompactDisc类型的Bean,该注解不仅能用在构造器上,还能用在属性的Setter方法上.
验证自动装配(紧接上一个Test):
package main.java.Demo1;
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.assertNotNull;
/**
* @author myvina@qq.com
* @date 18-4-15 下午6:56
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CompactDiskConfig.class)
public class CDPlayerTest {
@Autowired
private BeatlesCD cd;
@Test
public void cdShouldNotNull(){
assertNotNull(cd);
}
@Autowired
private CDPlayer cdPlayer;
@Test
public void cdPlayerPlay(){
cdPlayer.play();
}
}
运行结果如下:
四月 15, 2018 9:21:47 下午 org.springframework.test.context.support.DefaultTestContextBootstrapper getDefaultTestExecutionListenerClassNames
信息: Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]
四月 15, 2018 9:21:47 下午 org.springframework.test.context.support.DefaultTestContextBootstrapper getTestExecutionListeners
信息: Using TestExecutionListeners: [org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@38082d64, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@dfd3711, org.springframework.test.context.support.DirtiesContextTestExecutionListener@42d3bd8b, org.springframework.test.context.transaction.TransactionalTestExecutionListener@26ba2a48, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@5f2050f6]
四月 15, 2018 9:21:47 下午 org.springframework.context.support.GenericApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.GenericApplicationContext@3a82f6ef: startup date [Sun Apr 15 21:21:47 CST 2018]; root of context hierarchy
Playing Beatles
Process finished with exit code 0
以上就为Spring中自动化装配Bean的详解.