Spring精华问答 | Spring Bean的自动装配是怎么回事?

    xiaoxiao2022-07-02  121

    戳蓝字“云计算”关注我们哦!

    Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。今天,就让我们来看看关于Spring更加有深度的问题吧。

    1

      Q:如何向Spring Bean中注入一个Java.util.Properties?

    A:第一种方法是使用如下面代码所示的<props> 标签:也可用”util:”命名空间来从properties文件中创建出一个propertiesbean,然后利用setter方法注入bean的引用。

    2

    Q:Spring Bean的自动装配是怎么回事?

    A:在Spring框架中,在配置文件中设定bean的依赖关系是一个很好的机制,Spring容器还可以自动装配合作关系bean之间的关联关系。这意味着Spring可以通过向Bean Factory中注入的方式自动搞定bean之间的依赖关系。自动装配可以设置在每个bean上,也可以设定在特定的bean上。

    下面的XML配置文件表明了如何根据名称将一个bean设置为自动装配:

    1

    <bean id="employeeDAO" class="com.howtodoinjava.EmployeeDAOImpl" autowire="byName" />

    除了bean配置文件中提供的自动装配模式,还可以使用@Autowired注解来自动装配指定的bean。在使用@Autowired注解之前需要在按照如下的配置方式在Spring配置文件进行配置才可以使用。

    1

    <context:annotation-config />

    也可以通过在配置文件中配置AutowiredAnnotationBeanPostProcessor 达到相同的效果。

    1

    <bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

    配置好以后就可以使用@Autowired来标注了。

    1

    2

    3

    4

    @Autowired

    public EmployeeDAOImpl ( EmployeeManager manager ) {

        this.manager = manager;

    }

    3

           Q:自动装配模式有什么区别?

           A:在Spring框架中共有5种自动装配,让我们逐一分析。

    no:这是Spring框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean定义中用标签明确的设置依赖关系。

    byName:该选项可以根据bean名称设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。

    byType:该选项可以根据bean类型设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的类型自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。

    constructor:造器的自动装配和byType模式类似,但是仅仅适用于与有构造器相同参数的bean,如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

    autodetect:该模式自动探测使用构造器自动装配或者byType自动装配。首先,首先会尝试找合适的带参数的构造器,如果找到的话就是用构造器自动装配,如果在bean内部没有找到相应的构造器或者是无参构造器,容器就会自动选择byTpe的自动装配方式。

    4

    Q:如何开启基于注解的自动装配?

    A:要使用 @Autowired,需要注册 AutowiredAnnotationBeanPostProcessor,可以有以下两种方式来实现:

    1、引入配置文件中的<bean>下引入 <context:annotation-config>

    1

    2

    3

    <beans>

        <context:annotation-config />

    </beans>

    2、在bean配置文件中直接引入AutowiredAnnotationBeanPostProcessor

    1

    2

    3

    <beans>

        <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

    </beans>

      Q:请举例解释@Autowired注解?

    A:@Autowired注解对自动装配何时何处被实现提供了更多细粒度的控制。@Autowired注解可以像@Required注解、构造器一样被用于在bean的设值方法上自动装配bean的属性,一个参数或者带有任意名称或带有多个参数的方法。

    比如,可以在设值方法上使用@Autowired注解来替代配置文件中的 <property>元素。当Spring容器在setter方法上找到@Autowired注解时,会尝试用byType 自动装配。

    当然我们也可以在构造方法上使用@Autowired 注解。带有@Autowired 注解的构造方法意味着在创建一个bean时将会被自动装配,即便在配置文件中使用<constructor-arg> 元素。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    public class TextEditor {

       private SpellChecker spellChecker;

     

       @Autowired

       public TextEditor(SpellChecker spellChecker){

          System.out.println("Inside TextEditor constructor." );

          this.spellChecker = spellChecker;

       }

     

       public void spellCheck(){

          spellChecker.checkSpelling();

       }

    }

    下面是没有构造参数的配置方式:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    <beans>

     

       <context:annotation-config/>

     

       <!-- Definition for textEditor bean without constructor-arg  -->

       <bean id="textEditor" class="com.howtodoinjava.TextEditor">

       </bean>

     

       <!-- Definition for spellChecker bean -->

       <bean id="spellChecker" class="com.howtodoinjava.SpellChecker">

       </bean>

     

    </beans>

    小伙伴们冲鸭,后台留言区等着你!

    关于Spring,今天你学到了什么?还有哪些不懂的?除此还对哪些话题感兴趣?快来留言区打卡啦!留言方式:打开第XX天,答:……

    同时欢迎大家搜集更多问题,投稿给我们!风里雨里留言区里等你~

    福利

    扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

    推荐阅读:

    图解分布式架构的发展和演进 | 技术干货

    Docker 系列学习文章 | 什么是容器云?

    任正非:华为海思芯片不是“备胎”!

    揭秘清华 AI 学堂班:姚期智担任首席教授,2019 年首批招收 30 人

    Google Android 向华为“闭源”!华为手机迎来至暗时刻!

    "两年前我对区块链的了解为零, 两年后我成了工程师" 我是如何得到第一份工作的?

    《使女的故事》大火,AI是背后最大推手?

    真香,朕在看了!
    最新回复(0)