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

装配Bean


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


自动化装配bean

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

创建可被发现的bean
package soundsystem;
public interface CompactDisc{

    void play();
}

---------------------
@Compent //表明该类作为组件类并告知Spring为这类创建bean
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);
    }
}

--------------------------------
组件扫描默认是不启用的 需要@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注解

@Component
public 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注解


@Configuration
public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值