Spring(3): Bean

1. Spring的三种bean装配机制

  1. 在XML中进行显式配置;
  2. 在Java中进行显式配置
  3. 隐式的bean发现机制和自动装配。

1.1 自动化装配bean

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

代码:

1.1.1 创建2个接口及其实现类

Interface:CompactDisc

public interface CompactDisc {
    void play();
}

Interface:MediaPlayer

public interface MediaPlayer {
    void play();
}

Class:Roar

@Component
public class Roar implements CompactDisc {
    public void play() {
        String title = "Roar";
        String artist = "Katy Perry";
        System.out.println("Playing " + title + " by " + artist);
    }
}

Class:CDPlayer

@Component
public class CDPlayer implements MediaPlayer {
    private CompactDisc cd;

    /**
     * 1.构造器注入
     */
    //    @Autowired
    //    public CDPlayer(CompactDisc cd) {
    //        this.cd = cd;
    //    }

    /**
     * 2.设值注入
     */
    @Autowired
    public void setCd(CompactDisc cd) {
        this.cd = cd;
    }

    public void play() {
        cd.play();
    }
}

说明:
@Component:表明该类为组件类,并告知Spring为该类创建bean。
@Autowired:Spring会进行自动装配。

bean注入的两种形式:
①构造器注入:当Spring创建CDPlayer bean的时候,通过构造器来进行实例化并且会传入一个可设置给CompactDisc类型的bean。
②Setter设值注入:当Spring创建CDPlayer bean的时候,通过类方法setCd()来进行实例化并且会传入一个可设置给CompactDisc类型的bean。

1.1.2 bean的自动装配

@Configuration
@ComponentScan(basePackageClasses = {CompactDisc.class})
public class BeanAutoConfig {
}

说明:
@ComponentScan:默认会扫描与配置类相同的包。通过basePackageClasses可以设置类所在的包作为组件扫描的基础包。

1.1.3 创建测试类Test

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = BeanAutoConfig.class)
public class CDPlayerTest {
    @Autowired
    private CompactDisc cd;

    @Autowired
    private MediaPlayer mediaPlayer;

    @Test
    public void cdShouldNotBeNull() {
        assertNotNull(cd);
    }

    @Test
    public void testPlay() {
        mediaPlayer.play();
    }
}

说明:
@ContextConfiguration:引入配置文件。

1.2 通过Java配置装配bean

Java配置的核心就是@Configuration注解的类和@Bean注解的方法。
@Configuration:表示该类为Bean的配置类,注解的类表示它的主要目的是作为bean定义的来源。
@Bean:注解用来指定一个方法实例,配置和初始化一个新对象交给Spring IOC容器管理。

代码:

1.2.1 基于Java配置的config类

@Configuration
public class BeanJavaConfig {
    @Bean
    public CompactDisc compactDisc() {
        return new Roar();
    }

    /**
     * 1.构造器注入
     */
    //    @Bean
    //    public CDPlayer cdPlayer(CompactDisc compactDisc) {
    //        return new CDPlayer(compactDisc);
    //    }

    /**
     * 2.Setter设值注入
     */
    @Bean
    public CDPlayer cdPlayer(CompactDisc compactDisc) {
        CDPlayer cdPlayer = new CDPlayer();
        cdPlayer.setCd(compactDisc);
        return cdPlayer;
    }
}

说明:
@Bean:告诉Spring这个方法将会返回一个对象,并注册该对象为Spring应用上下文中的bean。

1.2.2 测试Test类

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = BeanJavaConfig.class)
public class CDPlayerJavaTest {

    @Autowired
    private CDPlayer player;

    @Test
    public void testPlay() {
        player.play();
    }

}

1.3 通过XML配置装配Bean

在XML文件中通过元素声明一个bean。

1.3.1 构造器注入初始化bean

(一)构造器注入bean引用
<constructor-arg>:构造器注入初始化bean。
ref:表明正在装配的是一个引用。

XML配置文件代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="compactDisc" class="com.chen.beanXML.Roar"/>

    <!--构造器注入bean-->
    <bean id="cdPlayer" class="com.chen.beanXML.CDPlayer">
        <constructor-arg ref="compactDisc"/>
    </bean>

</beans>

(二)将字面量注入到构造器中
value:表明给定的值要以字面量的形式注入到构造器中。

XML配置文件代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--将字面量注入构造器-->
    <bean id="compactDisc" class="com.chen.beanXML.BlankDisc">
        <constructor-arg value="Bleeding Love"/>
        <constructor-arg value="Leona Lewis"/>
    </bean>

    <bean id="cdPlayer" class="com.chen.beanXML.CDPlayer">
        <constructor-arg ref="compactDisc"/>
    </bean>

</beans>

(三)装配集合
value:表明给定的值要以字面量的形式注入到构造器中。
<list>:是元素<constructor-arg>的子元素,表明一个包含值得列表将会传递到构造器中。

XML配置文件代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--装配集合-->
    <bean id="compactDisc" class="com.chen.beanXML.BlankDisc">
        <constructor-arg value="Bleeding Love"/>
        <constructor-arg value="Leona Lewis"/>
        <constructor-arg>
            <list>
                <value>Bleeding Love</value>
                <value>Forgiveness</value>
                <value>A Moment Like This</value>
            </list>
        </constructor-arg>
    </bean>

    <bean id="cdPlayer" class="com.chen.beanXML.CDPlayer">
        <constructor-arg ref="compactDisc"/>
    </bean>

</beans>

测试Test类代码:

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration
public class CDPlayerXMLByArgTest {

    @Test
    public void play() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
        CDPlayer player = ctx.getBean(CDPlayer.class);
        player.play();
    }

}

1.3.2 设置属性注入bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="compactDisc" class="com.chen.beanXML.BlankDisc">
        <property name="title" value="Bleeding Love"/>
        <property name="artist" value="Leona Lewis"/>
        <property name="tracks">
            <list>
                <value>Bleeding Love</value>
                <value>Forgiveness</value>
                <value>A Moment Like This</value>
            </list>
        </property>
    </bean>

    <!--设置属性注入bean-->
    <bean id="cdPlayer" class="com.chen.beanXML.CDPlayer">
        <property name="cd" ref="compactDisc"/>
    </bean>

</beans>

2. Bean属性

  • id/name:唯一标识。
  • class:具体实例化的类。
  • scope:作用域。
  • constructor-arg:用来注入依赖关系。
  • properties:用来注入依赖关系。
  • autowiring mode:用来注入依赖关系。
  • lazy-initialization mode:延迟初始化的bean告诉IoC容器在它第一次被请求时,而不是在启动时去创建一个bean实例。
  • initialization:在bean的所有必需的属性被容器设置后,调用回调方法。
  • destruction:当包含该bean的容器被销毁时,使用回调方法。

3. Bean的作用域

  • 单例(singleton):一个Bean容器中只存在一份(默认)。
  • 原型(prototype):每次请求创建新的实例,destory方式不生效。
  • 请求(request):该作用域将 bean 的定义限制为 HTTP 会话。只在 web-aware Spring ApplicationContext 的上下文中有效,每次http请求创建一个实例且仅在当前request内有效。
  • 会话(session):该作用域将 bean 的定义限制为 HTTP 会话。只在 web-aware Spring ApplicationContext 的上下文中有效。
  • 全局会话(global-session):该作用域将 bean 的定义限制为全局 HTTP 会话。只在 web-aware Spring ApplicationContext 的上下文中有效。

源代码:
https://github.com/leifchen/hello-spring
自动装配 bean 代码包:com.chen.beanauto
通过 Java 配置装配 bean 代码包:com.chen.beanjava
通过 XML 配置装配 Bean 代码包:com.chen.beanxml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值