Spring实战第四版第二章

装配Bean

Spring配置的可选方案

1.在xml中进行显示配置

2.在Java中进行显示配置

3.隐式的bean发现机制和自动装配

选择哪种装配bean的方案应该看个人和应用场景,建议显示配置越少越好,若是实在需要,可以使用JavaConfig将会比XML中的配置较好

 

自动化装配bean

此前需要先导入spring中所需要的jar包,可自行去官网下载

spring中是两个方面中进行自动化配置

  • 组件扫描(component scanning): Spring会自动发现应用上下文中所创建的bean

  • 自动装配(autowring): Spring自动满足bean之间的以来

    创建可被发现的bean

    CompactDisc接口

    //接口
    public interface CompactDisc {
        void play();
    }
    ​

    SgtPeppers实现类byCompactDisc

    //实现类
    @Component
    public class SgtPeppers implements CompactDisc{
        private String title = "Sgt. Peppers Lonely Hearts Club Band";
        private String artist =  "The Beatles";
        @Override
        public void play() {
            System.out.println("Playing" + title + " by "+artist);  
        }
    ​
    }

    CDPlayerConfig主配置类

    @Configuration //标注了这是一个配置类,等同于xml配置
    @ComponentScan  //这是一个扫描包的类,若是没有指定包,会扫描此类所在的包
    public class CDPlayerConfig {
        
    }

    测试类CDPlayerTest

    @RunWith(SpringJUnit4ClassRunner.class)//此标签用于spring自动创建上下文
    @ContextConfiguration(classes=CDPlayerConfig.class)//告诉spring要加载此配置类
    public class CDPlayerTest {
        
        @Autowired
        private CompactDisc cd;
        
        @Test
        public void cdShouldNotBeNull() {
            assertNotNull(cd);  //用来测试此类是否为空
        }
    }

    由此,一个简单bean创建即实现了.

为组建扫描的bean命名

@Named和Spring的@Component功能相同。@Named可以有值,如果没有值生成的Bean名称默认和类名相同。 不建议使用,有兴趣可以自行搜查下.

 

设置组件的扫描包

设置指定的包名

@Configuration //标注了这是一个配置类,等同于xml配置
//这是一个扫描包的类,若是没有指定包,会扫描此类所在的包,可加载多个包,basePackages为复数形式
@ComponentScan (basePackages={"soundsystem","packageName"}) 
public class CDPlayerConfig {
​
}

 

设置扫描指定的类所在的包

@Configuration //标注了这是一个配置类,等同于xml配置
//这是一个扫描包的标签,若是没有指定包,会扫描此类所在的包,可加载多个包,basePackages为复数形式
//当属性为basePackageClasses,此时扫描的是指定类所在的包
@ComponentScan (basePackageClasses= {SgtPeppers.class,CDPlayerTest.class}) 
public class CDPlayerConfig {
​
}

 

通过为bean添加注解实现自动装配功能

 

@Autowired 可以放入 构造方法以及setter方法中,将bean注入

CDPlayer类

@Component
public class CDPlayer implements MediaPlayer{
    
    private CompactDisc cd;
    //构造方法注入
    @Autowired
    public CDPlayer(CompactDisc cd) {
        this.cd = cd;
    }
​
    @Override
    public void play() {
        cd.play();  
    }   
    
    //setter方法注入
    @Autowired
    public void setCompactDisc(CompactDisc cd) {
        this.cd = cd;
    }
}
//MediaPlayer接口
public interface MediaPlayer {
    void play();
}

验证自动装配

此代码可自行编写~~~

 

2.3通过Java代码专配bean

尽管我们能通过包的扫描形成自动装配,但有些情况我们不得不显示的声明bean,例如mybatis中的dataSource

2.3.1创建配置类

如前面CDPlayerConfig类

2.3.2声明简单的bean

public class CDPlayerConfig {
​
    //或者使用@Bean("name")在此中写入名字
    @Bean//默认使用方法名的名字
    public CompactDisc sgtPeppers() {
        return new SgtPeppers();
    }
}

2.3.3借助JavaConfig实现注入

在CDPlayerConfig类中加入这两个方法

@Bean
    public CDPlayer cdPlayer() {
        return new CDPlayer(sgtPeppers());
    }
    
    @Bean
    public CDPlayer anotherCdPlayer() {
        return new CDPlayer(sgtPeppers());
    }

我们可以看到,对sgtPeppers就像其他Java方法调用一样,但是在Spring中,sgtPeppers是单例,若是在sgtPeppers()中没有显示声明此bean该为多例,spring会拦截其他的sgtPeppers对象,保证返回的是同一个对象.

spring中更加推崇使用接口如

@Bean
    public CDPlayer cdPlayer(CompactDisc compactDisc) {
        return new CDPlayer(compactDisc);
    }
    
    @Bean
    public CDPlayer anotherCdPlayer(CompactDisc compactDisc) {
        return new CDPlayer(compactDisc);
    }

通常通过此方式是引用其他的bean是最佳的选择,他不会要求将CompactDisc声明在同意配置类,以及XML自动扫描和装配bean之中,只要功能完整健全即可.

 

2.4通过xml装配bean

在以前我们都是使用xml文件进行配置,但现在逐渐被Java配置类取代了

2.4.1创建XML配置规范

在xml中,你需要有个<beans>元素为根,并且导入约束

 

2.4.2声明一个简单的<bean>

<bean id="" class=""></bean>

放入xml中,id为唯一名字,class是全限定类名(加包的前缀

 

2.4.3借助构造器注入初始化的bean

<bean id="" class=""  >
  <!-- ref可以引入其他的bean, value为设置的值,两者一般不共存 -->
        <constructor-arg ref="" value=""></constructor-arg>
  
  <!-- 此传入的是一个null值-->
  <constructor-arg ref="" value=""><null/></constructor-arg>
    </bean>

c标签可自行在网上搜

 

在xml构造器注入中,也可以注入集合参数

<constructor-arg>
  <!-- 可以将list换成set,区别是spring导入的是java.util.list还是java.util.set -->
            <list>
              <!-- value可以变换为ref -->
                <value></value>
                <value></value>
            </list>
        </constructor-arg>

 

2.4.4设置属性

<bean id="id名" class="全限定类名"  >
    <!-- value可以换成ref,使用方法如上 -->
        <property name="属性名字" value="属性值"></property>
    </bean>

 

2.5导入和混合配置

不同情况下用不同的配置方式,会事半功倍,spring配置也是如此,有时用JavaConfig可能相对于xml反而没那么好

2.5.1在JavaConfig中引入XML配置

 

使用@ImportResource注解,引入的是根类路径下的spring文件夹中的springbean.xml

@ImportResource("classpath:spring/springbean.xml")
public class CDPlayerConfig {
​
    
}

 

2.5.2在XML配置中引用JavaConfig

在自己的application.xml中使用<import>以及<bean>元素引用

<!--  此元素只能引用其他spring的xml配置文件 -->
<import resource=""/>
    <!-- 将JavaConfig类的全限定名写入其中,将会引用-->
    <bean class=""/>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值