一、Spring配置的方式
spring容器用来创建应用程序中的bean,并通过DI来协调这些对象间的关系。
在bean进行装配时,spring提供了三种主要的装配机制。
①在XML中进行显式配置
②在Java中进行显式配置
③隐式的bean发现机制和自动装配
二、自动化装配bean
1、spring从两个角度来实现自动化装配
①组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean
②自动装配(autowiring):Spring自动满足bean之间的依赖
示例:
①:定义一个接口
package soundsystem; public interface CompactDisc { void play(); }
②创建实现类,并且加自动扫描的标签@Component,该标签会告知spring为这个类创建bean。
1 package soundsystem; 2 3 import org.springframework.stereotype.Component; 4 5 @Component 6 public class SgtPeppers implements CompactDisc { 7 8 public void play() { 9 System.out.println("继承接口!"); 10 } 11 12 }
③组件扫描默认是不启动的,我们需要显示的配置Spring。让它去寻找带有@Component注解的类,并为其创建bean。
方式一:Java代码启用组件扫描。
如果没有其他的配置,@ComponentScan默认会扫描与配置类相同的包,及其报下,所有子包。
package soundsystem; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan public class CDPlayerConfig { }
方式二:通过XML配置来启用组件扫描。
<context:component-scan base-package="soundsystem"/>
④:测试组件扫描能够发现CompactDisc
package test; import java.util.Date; 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 soundsystem.CDPlayerConfig; import soundsystem.SgtPeppers; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes=CDPlayerConfig.class) public class TEST { @Autowired private SgtPeppers sgtPeppers; @Test public void cdshouNotNull(){ System.out.println("null"); } }
2、为组件扫描的bean命名
Spring会自动将类名的第一个字母小写,作为相应bean的名字。
如果想要,自己为bean命名,则如下:
@Component("MyCd") public class SgtPeppers implements CompactDisc { public void play() { System.out.println("继承接口!"); }
3、设置组件扫描的基础包
@ComponentScan没有任何属性,它会以本包为基础包,来扫描组件
①:@ComponentScan("包名")
@ComponentScan(basePackages="包名")
@ComponentScan(basePackages={"包名1","包名2",....})
以上的包名为String类型,是类型不安全的。
②:@ComponentScan(basePackageClasses={bao1.class,bao2.class})
通过这种方式,这些类所在的包会作为组件扫描的基础包。
在使用这种方式时,可以在包中创建一个用来扫描的空标记接口。
三、Java代码装配bean
1、创建配置类,使用@Configuration标记。
package soundsystem; import org.springframework.context.annotation.Configuration; @Configuration public class CDPlayerConfig { }
2、声明bean,使用@Bean标记
@Bean会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean。
默认情况下,bean的ID是和带@Bean的方法名是一样的,在下例中,bean的名字是sgtPepper。
若想自己设置bean的名字,可以通过@Bean的name属性:@Bean(name="xxxx")
package soundsystem; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CDPlayerConfig { @Bean public CompactDisc sgtPepper(){ return new SgtPeppers(); } }
3、借助JavaConfig实现注入
Spring将会拦截所有对添加了@Bean标记的方法的调用,确保添加@Bean的方法只调用一次。
使用@Bean标记的方法,可以使用任何的java方式来产生bean。
四:XML配置bean。
五:导入和混合配置
1、JavaConfig中引用XML配置
①一个JavaConfig引用另一个JavaConfig,使用@Import(xxx.class)/@Import({xxx.class,yyy.class})
②一个JavaConfig引用XML配置,使用@ImportResource("classpath:xxx.xml")
2、XML配置中引用JavaConfig
应用<bean>标签,将JavaConfig引入即可
<bean class="soundsystem.CDConfig">