Spring In Action学习笔记:Bean的简单装配

来源:互联网 发布:js调用servlet 编辑:程序博客网 时间:2024/05/20 20:45

装配Bean


Spring提供了三种主要的Bean装配机制
- 在xml中进行显示配置(便利的命名空间)
- 在Java中进行显示配置(相对于xml是类型安全的)
- 隐式的bean发现机制和自动装配


自动化装配bean

Spring从两个角度来实现自动化装配
- 组件扫描 : Spring会自动发现应用上下文中所创建的bean
- 自动装配 : Spring自动满足bean之间的依赖

创建可被发现的bean
package soundsystem;public interface CompactDisc{    void play();}---------------------@Compent //表明该类作为组件类并告知Spring为这类创建beanpublic 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);    }}--------------------------------组件扫描默认是不启用的 需要@ComponentScan注解 或在xml中配置package soundsystem;@Configuration@ComponentScan(basePackages={"...."})//basePackages指定要扫描的包,不指定的话默认为本类所在包public class CDPlayerConfig{}然后通过AnnotationConfigApplicationCotext加载CDPlayerConfig.class 即可xml启动...<beans ....>    <context:component-scan base-package="" />    ....</beans>
为组件扫描的bean命名

@Component注解可给bean设置类似xml中的ID

@Component("lonelyHeartsClub")public classSgtPeppers{}不指定ID会默认为类名的第一个字母变为小写作为ID还有一种bean的命名方式 @Named("")
通过为bean添加注解实现自动装配

自动装配是让Spring自动满足bean依赖的一种方法 可以借助@Autowired注解

@Componentpublic class CDPlayer{    private CompactDisc cd;    @Autowired    public CDPlayer(CompactDisc cd){        this.cd = cd;    }}@Autowired注解不仅能用在构造器上,还能用在属性的setter方法上 甚至用在类的任何方法上,因为setter方法并没有什么特别的@Autowired(required=false)required属性为false时 当自动装配没有匹配的bean时 这个bean处于未装配状态(容易出现NUllPointerException)也可以用@Inject

通过Java代码装配bean

优点是类型安全,重构友好

JavaConfig类的关键在于@Configuration 注解,以及@Bean注解

在JavaConfig中声明bean要编写一个方法创建所需类型的实例,并添加@Bean注解

@Configurationpublic class CDPlayerConfig{    @Bean //可通过name属性指定不同名字    public CompactDisc sgtPeppers(){        return new SgtPeppers();    }    @Bean    public CDPlayer cdPlayer(){        return new CDPlayer(sgtPeppers());//引用创建bean的方法注入    }}Spring会拦截所有对添加了@Bean注解的方法的调用,并确保直接返回该方法所创建的bean比如     @Bean    public CDPlayer cdPlayer(){        return new CDPlayer(sgtPeppers());//引用创建bean的方法注入    }     @Bean    public CDPlayer anotherCDPlayer(){        return new CDPlayer(sgtPeppers());//引用创建bean的方法注入    }anotherCDPlayer 和之前的cdPlayer bean 完全一样

通过xml装配bean

简单声明

<bean id="compactDisc" class="soundsystem.SgtPeppers" />

不明确指定ID时 会默认根据全限定类名命名
如”soundsystem.SgtPeppers#0” #0表示计数,用来区分相同类型的其他bean

当Spring发现这个元素时,他将会调用SgtPeppers的默认构造器来创建bean

借助构造器初始化bean
  • 元素
  • 使用c命名空间

c命名空间声明

<beans  ...    xmlns:c="http://www.springframework.org.schema/c"    ...>    <bean id="cdPlayer" class="soundsystem.CDPlayer">        <constructor-arg ref="compactDisc" />    </bean>    等价于    <bean id="cdPlayer" class="soundsystem.CDPlayer"        c:cd-ref="compactDisc";    >    </bean>cd 表示构造器参数名 -ref表示要注入bean引用,也可以用参数的顺序来表示 如 c:_0-ref  只有一个参数时还可以c:_-ref将一个ID为compactDisc的bean引用传递到CDPlayer的构造器中

将字面量注入到构造器

当构造器为public BlankDisc(String title,String artist){    this.title = title;    this.artist = artist;}<bean id=".." class="..">    <constructor-arg value="Sgt.Pepper's.."/>    <constructor-arg value="The Beatles" />c命名空间<bean id=".." class=".."    c:_0=".."    c:_1=".." />
装配集合

装配集合是可以但C命名空间做不到的

当构造器为public BlankDisc(String title,String artist,List<String> tracks){    this.title = title;    this.artist = artist;    this.tracks = tracks;}bean id=".." class="..">    <constructor-arg value="Sgt.Pepper's.."/>    <constructor-arg value="The Beatles" />    <constructor-arg>        <list>            <value>Sgt.Pepper...</value>            <value>....</value>            ...        </list>    </constructor-arg>如果list中是其他bean的引用的话bean id=".." class="..">    <constructor-arg value="Sgt.Pepper's.."/>    <constructor-arg value="The Beatles" />    <constructor-arg>        <list>            <ref bean="beanid" />            ...        </list>    </constructor-arg>也可以按同样的方式使用<set>
属性注入
public class CDPlayer{    private CompactDisc cd;    @Autowired    public void setCDPlayer(CompactDisc cd){        this.cd = cd;    }}<bean id = "cdPlayer" class="...">    <property name="compactDisc" ref="compactDisc" /></bean><property>元素为属性的set方法提供的功能与<constructor-arg>为构造器提供的功能一样<property>可用p命名空间代替<bean id = "cdPlayer" class="..."    p:cd-ref=""></bean>cd 是属性的名字属性也可以注入字面量 以及list<bean id = "cdPlayer" class="..."    p:title="Sgt.Pepper...."    p:artist="...."></bean><bean id = "cdPlayer" class="...">    <property name="title" value="Sgt.Pepper...." />    <property name="artist" value="..."/>    <property name="tracks">        <list>            <value>....</value>            ...        </list>    </property></bean></bean>
util命名空间

功能之一 提供元素,他会创建一个列表的bean,供引用

<util:list id="trackList">    <value>Sgt.....</value>    .....</util:lsit><bean id="..." class="..."    p:title = "..."    p:artist = "..."    p:tracks-ref="trackList" />

导入和混合配置

在JavaConfig中引用xml配置
使用@ImportResource(“classpath:cdconfig.xml”)

在JavaConfig中导入其他Java配置
@Import(CDConfig.class)

在Jxml中导入JavaCOnfig

<bean class = "***.CDConfig" />用<import resoune="***.xml"/> 导入其他xml配置 
0 0
原创粉丝点击