Spring配置bean可选方案
1、XML中进行显式配置
2、Java中进行显式配置
3、隐式的bean发现机制和自动装配
建议是尽可能使用自动配置,减少显式配置;当需要显式配置,推荐使用类型安全的JavaConfig;最后再使用XML配置
自动化装配bean
Spring通过2个角度完成自动化装配:
组件扫描(Component Scanning):Spring自动发现应用上下文中所创建的bean
自动装配(Autowiring):Spring自动满足bean之间的依赖
@ComponentScan
Spring组件扫描默认是关闭的,可以通过Java设置或者是XML设置来开启
会搜索配置类所在的包以及子包
Java配置形式:
package soundsystem; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan public class CDPlayerConfig { }
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" xmlns:c="http://www.springframework.org/schema/c" 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="soundsystem" /> </beans>
指定组件扫描的基础包
可以通过类名,或者包中的类或接口
@ComponentScan("soundsystem") @ComponentScan(basePackages = "soundsystem") @ComponentScan(basePackages = { "soundsystem", "video" }) @ComponentScan(basePackages = { CDPlayer.class, MediaPlayer.class })
推荐在包中创建标识接口,这样在重构系统的时候,不会对这个配置造成影响
@Component
标明这个类是一个组建类,告知Spring要为这个类创建bean
也可以用@Named注解(Java依赖规范/Java Dependency Injection 提供)代替,但一般不推荐
package soundsystem; public interface CompactDisc { void play(); }
package soundsystem; import org.springframework.stereotype.Component; @Component public class SgtPeppers implements CompactDisc { private String title = "Sgt. Pepper‘s Lonely Hearts Club Band"; private String artist = "The Beatles"; public void play() { System.out.println("Playing " + title + " by " + artist); } }
可以为bean命名id(默认自动生成id,是类名首字母小写)
@Component("myName")
@Autowired
可以用在类中任何方法内(包括构造方法、setter)
这样,调用这个方法的时候,Spring就会去查找适合方法参数的bean并装配到方法中
如果找不到,或者有多个符合,则会报错
可以通过@Autowired(required=false)使找不到时不报错,那么传入的参数值为null,需要自己手动处理代码
可以使用@Inject(Java依赖规范/Java Dependency Injection 提供)代替,但一般不推荐
package soundsystem; import org.springframework.beans.factory.annotation.Autowired; public class CDPlayer implements MediaPlayer { private CompactDisc cd; @Autowired public CDPlayer(CompactDisc cd) { this.cd = cd; } public void play() { cd.play(); } }