主要内容:
- 声明Bean
- 构造器注入和Setter方法注入
- 装配Bean
- 控制bean的创建和销毁
Spring装配Bean的3种机制
- 在XML中进行显式配置
- 在Java中进行显式配置
- 隐式的bean发现机制和自动装配
1、自动化装配Bean,
组件扫描:spring会自动发现应用上下文所创建的Bean
自动化装配:Spring自动满足bean之间的依赖
例:CD需要插入Cd播放器中,那么cd才可以播放或者或者说注入,以spring编写
定义Cd的概念,实现CompactDisc接口
package nh.spring.ioc.beans; /** * Created by niuh on 11/2/2016. */ public interface CompactDisc { void play(); }
Cd可以有很多实现类,比如某人的某个专辑,用@Component注解完成实现类
package nh.spring.ioc.beans; import org.springframework.stereotype.Component; /** * Created by niuh on 11/2/2016. */ @Component public class sgtPappers implements CompactDisc { private String title = "nice!!!!!!!"; private String artist = "heng"; @Override public void play() { System.out.print("title is " + title + " by " + artist); } }
@Component注解,表面该类是个组件类,告知Spring要为这个类自动创建bean,不过默认组件扫描是不启用的,利用@ComponentScan启用组件扫描
package nh.spring.ioc.beans; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /** * Created by niuh on 11/2/2016. * */ @Configuration @ComponentScan public class CdPlayConfig { }
整理一下,类CdPlayConfig在实例化时,通过java定义的spring装配规则,@ComponentScan注解在Spring中启用组件扫描,默认扫描与配置类相同的包,以及子包。查找所有带有@Component注解的类,这样就能找到CompactDisc,并为其创建一个Bean,完成组件扫描与自动装配。
在上面代码中Spring应用上下文会为Bean自动分配一个id,规则为首字母小写,如果期望可以自定义id,则如下:
@Component("myId")
也可以使用java依赖注入中提供@Named设置ID
@Named("myId")
通过ComponentScan的basePackages属性设置自动扫描的包
@ComponentScan(basePackages = "nh.spring.ioc")
最后通过注解为bean实现自动装配
package nh.spring.ioc.beans; import org.springframework.beans.factory.annotation.Autowired; /** * Created by niuh on 11/2/2016. */ public class CDplay implements MediaPlayer { private CompactDisc cd; @Autowired public CDplay(CompactDisc cd) { this.cd = cd; } @Override public void play() { cd.play(); } }
使用Spring应用上下文寻找匹配摸个bean需求的其他bean,例子中表面Spring创建Cdplay时,会通过构造器来进行实例化并要找到一个CompactDisc类型的bean;