Bean装配方式详解

spring装配bean的三种方式:

  • 在XML中进行显示装配
  • 在XML中进行显示装配在Java中进行显示装配
  • 在XML中进行显示装配隐式的Bean发现和装配机制

一、自动化装配Bean

Spring从两个角度实现自动化装配:

  1. 组件扫描(ComponentScan)):spring会自动发现spring应用上下文中所创建的Bean
  2. 自动装配(Autowried):Spring自动满足Bean之间的依赖

第一方面:从组件扫描的角度

  • Spring会自动发现应用上下文所创建的bean
    创建接口:
public interface CompactDisc{
    void play();
}

创建类:

@Component
public class SgtPeppers implements CompactDisc{
    
    public void play(){
        Ststem.out.println("Hello world!");
    }
}

解释:@Component这个注解表示该类会作为组件类,并告知Spring要为这个类创建bean,但是组件扫描默认是不开启的,我们需要显示的配置一下Spring
创建配置类:

@ComponentScan
@Configuration
public class CDPlayerConfig{
}

解释:@ComponentScan会在Spring启用组件扫描,默认扫描与配置类相同的包,可以设置扫描的包,查找带有@Component注解的类
@Configuration表明这是一个配置类
通过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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 
       
       <context:component-scan base-package="com" /
</beans>

注意:如果你的应用程序中,所有的对象都是独立的,彼此之间没有任何依赖,那么使用组件扫描就可以,但是很多对象会依赖其他的对象完成任务,这样我们就需要一种方法将组件扫描的到的bean和他们的依赖装配在一起,所以要了解一下自动装配

第二方面:从自动装配方面

通过为bean添加注解实现自动装配,我们可以借助@Autowried注解

通过自动装配,将一个CompactDisc注入到CDPlayer中

@Component
public class CDPlayer implements MediaPlayer{
    private CompactDisc cd;
    @Autowried
    public CDPlayer(CompactDisc cd){
        this.cd = cd;
    }
    public void play(){
        cd.play();
    }   
}

@Autowried不仅可以用在构造器上,还可以用在属性的setter方法上,比如CDPlayer有一个setCompactDisc方法,可以采用如下的形式实现自动化装配

@Autowried
public  void setCompactDisc(CompactDisc cd){
    this.cd = cd;
}

解释:在Spring初始化bean后,他会尽可能去满足bean的依赖,在本例中,依赖是通过带有@Autowried注解的方法声明的。
不管是构造器,Setter方法还是其他的方法,Spring都会尝试满足方法参数上所声明的依赖,假如只有一个bean匹配依赖的话,那么这个bean就会被匹配进来
如果没有匹配的bean,那么在应用上下文创建的时候,Spring会抛出一个异常,为了避免这种异常,可以将@Autowried的required属性值设置为false

二、使用java显示创建Bean

尽管在很多情况下使用组件扫描和自动装配实现Spring的自动化配置是更为推荐的方式,但是有时候这种方案行不通,因此需要明确配置Spring,比如将第三方插件装配到你的应用中去,是没有办法在他的类上添加@Component和@Autowired注解的,因此必须采用显示装配的方法。

在显示装配的时候,javaConfig是更好的方案,因为它更为强大,类型安全,并且对重构友好。通常将JavaConfig代码放在单独的包中,使它与其他应用程序逻辑分离开来。

第一步:创建配置类
创建配置类的关键在于为其添加@Configuration注解,此注解表明这个类是一个配置类,该类包含在spring应用上下文中如何创建bean的细节.

@Configuration
public class CDPlayConfig{
}

第二步:声明简单的bean
@Bean注解会告诉Spring这个方法会返回一个对象,该对象要注册为Spring应用上下文中的Bean.
默认情况下Bean的ID与带@Bean注解的方法名是一样的,也可以通过name属性指定一个名字

下面的代码返回了所需类型的实例,声明了CompactDisc bean:

@Configuration
public class CDPlayConfig{
    //Bean(name="123")
    //SgtPeppers继承CompactDisc接口
    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();//返回此类的一个实例
    }
}

第三步:借助javaConfig实现依赖注入
将CompactDisc bean 注入到CDPlayer bean中

构造器注入:

@Configuration
public class CDPlayConfig{
    //Bean(name="123")
    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();//返回此类的一个实例
    }
    @Bean 
    public CDPlayer cdPlayer(){
        return new CDPlayer(sgtPeppsers());
    }
    //或者使用下面这种方法:
    /*
    当Spring调用cdPalyer() 创建CDPlayer bean的时候,他会自动装配一个CompactDisc到配置方法中
    public CDPlayer cdPlayer(CompactDisc compactDisc){
        return new CDPlayer(compactDisc);
    }
    */
}

Setter方法注入

@Configuration
public class CDPlayConfig{
    @bean 
    public CDplayer cdPlayer(CompactDisc compactDisc){
        CDPlayer cdPlayer = new CDPlayer(compactDisc);
        cdPlayer.setCompactDisc(compactDisc);
        return cdPlayer;
    }
}

三、使用XML显示配置Bean

spring最初,XML是最主要的配置方式,在XML中创建Bean需要使用<bean>元素

<?xml version="1.0" encoding="GBK"?>  
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns="http://www.springframework.org/schema/beans"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">  
    <!--配置bean-->
    <bean class="com.Hello"/>

这是最简单的XML方式的Bean声明,仅仅指定了该Bean属于的类,Bean的命名规则为全限定类名来命名,该Bean的名称为“com.Hello#0”,其中“#0”是一个计数,从0开始
也可以使用id属性来命名

<bean id="hello" class="com.Hello"/>

一般我们对需要引用的Bean指定名称,对不需要引用的,采用自动命名即可
采用XML配置Bean的缺点:在这个简单的Bean声明中,我们将Bean的类型以字符串的形式设置在了class属性中,但是不能保证class属性的值是真正的类型。

借助构造器注入初始化Bean

1. 元素:附加文件:https://blog.csdn.net/qq_41357573/article/details/84445743
2.使用spring3.0所应用的c:命名空间 在使用之前,必须在顶部声明其模式
xmlns:c="http://www.springframework.org/schema/c"
......

<bean id="hello" class="com.Hello" c:cd-ref="test">
<!--test为一个bean引用,而不是字面量-->
<!--只有一个构造器参数的时候,可以不使用表示参数-->
<bean id="hello" class="com.Hello" c:_-ref="test">

将字面量注入到构造器中

使用c:命名空间

<bean id="hello" class="com.Hello" c:cd-ref="test"
    c:_name="yq"
    c:_age=""23/>
<!--也可以使用下面这种方式,通过参数索引装配相同字面量-->
<bean id="hello" class="com.Hello" c:cd-ref="test"
    c:_0="yq"
    c:_1=""23/>
<!--如果只有一个构造器参数的话-->
<bean id="hello" class="com.Hello" c:cd-ref="test"
    c:_="yq"/>

装配集合

类:

......
//包含值
public people(String name;string age;List<String>kills){
    this.name = name;
    this.age = age;
    thsi.kills = kills;
} 

XML配置:

<!--首先使用List将其声明为一个列表-->
<bean id="people" class="类路径" 
    <constructor-arg value="yq"/>
    <constructor-arg value="23"/>
    <constructor-arg>
        <list>
            <value>1</value>
            <value>2</value>
            <value>3</value>
        </list>
    </constructor-arg>
</bean>

实现bean引用列表的装配:

<bean id="people" class="类路径" 
    <constructor-arg value="yq"/>
    <constructor-arg value="23"/>
    <constructor-arg>
        <list>
            <ref bean="a"/>
            <ref bean="b"/>
            <ref bean="c"/>
        </list>
    </constructor-arg>
</bean>
总结: 上述三种装配技术非常有用,但是在便利性方面,最强大的还是Spring的自动化装配置,自动化装配分为两个方面,一个方面是当所有的对象之间没有依赖时,所需要的仅是组件扫描而已,组件扫描分为java配置和XMl配置。另一方面,当对象会依赖其他对象才能完成任务时,这时就需要自动装配。

猜你喜欢

转载自blog.csdn.net/qq_41357573/article/details/84382815
今日推荐