spring-配置bean(2、基于JavaConfig的配置)

来源:互联网 发布:淘宝新店流量扶持 编辑:程序博客网 时间:2024/06/05 08:09

上一篇文章中说了spring自动配置,接下来写下显示配置中的通过Java代码装配bean。
通过Java配置bean大多时候比XML配置bean更为方便,因为它就是一个普通的Java代码,只是因为这个代码是JavaConfig,所以它不包含任何逻辑关系,仅仅收集各个组件。

写几个代码来当例子
如在上一节中,我们说了JavaConfig形式如下,里面没有任何内容,仅仅包含了一个@Configuration和一个@ComponentScan来自动扫描

package test;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;@Configuration@ComponentScanpublic class CDPlayerConfig {}

那么此时我把@ComponentScan注解去掉,这样会导致这个Java类无法扫描bean,即无法自动配置bean了

package test;import org.springframework.context.annotation.Configuration;@Configurationpublic class CDPlayerConfig {}

那么无法自动配置bean,那么此时就只能手动配置bean了,显示地返回一个bean对象,此时要用到@Bean注解(可以说@Bean就是写在带有@Configuration中的注解,用于创建bean)。(sgtPeppers等代码请看第一节)。上一节中我说过,其实bean就是返回一个实例化对象,从而将”A a;” 变成等效于“A a=new A();”的效果。此例中就是如此,直接返回一个new SgtPeppers();

package test;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Bean;@Configurationpublic class CDPlayerConfig {    @Bean    public CompactDisc sgtPeppers(){        return new SgtPeppers();    }}

接下来假设有一个CDPlayer bean 依赖于CompactDisc bean。那么如何将它们装配在一起?
在JavaConfig中装配bean的最简单的方案就是直接引用创建了bean的方法(此例中即上面一个代码块中的 sgtPeppers()方法。它返回了一个对象,即创建了一个bean)

package test;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;@Configuration@ComponentScanpublic class CDPlayerConfig {    @Bean    public CompactDisc sgtPeppers(){        return new SgtPeppers();    }    //如下,直接引用SgtPeppers()方法    @Bean    public CDPlayer cdPlayer(){        return new CDPlayer(sgtPeppers());    }}

此例cdPlayer()像sgtPeppers()一样,使用了@Bean注解,并返回一个bean。但是这样还有种更好的引用bean的方法。即通过构造器来引用其他的bean。这种通过构造器的方式通常是最佳选择,因为这样不用强制把要引用的bean和本bean写在同一个JavaConfig中(如这个代码中,cdPlayer()可以写在其他的class里;但是上面的直接引用sgtPeppers()的要求两个方法写在一个class里)

package test;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;@Configuration@ComponentScanpublic class CDPlayerConfig {    @Bean    public CompactDisc sgtPeppers(){        return new SgtPeppers();    }    //如下,通过构造器来引用    @Bean    public CDPlayer cdPlayer(CompactDisc sgtPeppers){        return new CDPlayer(sgtPeppers);    }}

还有一种Setter方法。

package test;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;@Configuration@ComponentScanpublic class CDPlayerConfig {    @Bean    public CompactDisc sgtPeppers(){        return new SgtPeppers();    }    //如下,使用Setter方法    @Bean    public CDPlayer cdPlayer(CompactDisc sgtPeppers){            //建立CDPlayer对象        CDPlayer cdPlayer=new CDPlayer();        //通过setter方法注入,这个要单独在CDPlayer类中写setter方法        cdPlayer.setSgtPeppers(sgtPeppers);        //返回cdPlayer,此时该对象已经注入sgtPeppers,实现了实例化,是个bean了        return cdPlayer;    }}

总而言之,带有@Bean注解的方法可以采用任何有必要的Java功能来产生bean实例

原创粉丝点击