• Spring 装配bean的几种方式


    spring装配bean的分为以下三种方式:

    1.在XML中显示装配bean

      工作中最常见的就是隐示配置,但是有些情况下只能使用显示配置,比如引用第三方库,要想让spring管理这个bean,不可能修改它的源码,只能通过显示配置。

      话不多说,见例子

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:p="http://www.springframework.org/schema/p"
     5        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
     6 
     7     <!--使用bean标签去申明bean-->
     8     <bean id="waiter" class="xyz.mrwood.study.spring.example.Waiter" />
     9     <!--可以保用p标签来注入依赖的bean-->
    10     <bean id="store" class="xyz.mrwood.study.spring.example.Store" p:waiter-ref="waiter" />
    11 
    12 </beans>

    2.在JAVA中进行显示配置

      通过 @Configuration 和 @Bean来搭配完成。 

    @Configuration
    public class BeanConfig {
    
        /**
         * 申明bean
         * @return
         */
        @Bean
        public Waiter waiter() {
    
            return new Waiter();
        }
    
        @Bean
        public Store store() {
    
            Store store = new Store();
            store.setWaiter(waiter()); //通过调用bean的方法来注入
            return store;
        }
    }

    3.隐示配置,分为两步:组件扫描、自动装配。

      spring自动发现应用上下文创建的bean,分为两步:创建可被扫描的bean(@Component注解标记类),启动组件扫描(分为JAVA config配置、XML配置)

      注解标记类

     1 package xyz.mrwood.study.spring.example;
     2 
     3 import org.springframework.stereotype.Component;
     4 
     5 /**
     6  * 项目:study-spring-example
     7  * 包名:xyz.mrwood.study.spring.example
     8  * 功能:
     9  * 时间:2016-12-13 22:05
    10  * 作者:Mr.Kiwi
    11  */
    12 @Component
    13 public class Waiter {
    14 
    15     public void service(String name){
    16 
    17         System.out.println("service to " + name);
    18     }
    19 
    20 }

    启动扫描的JAVA Config配置。

    package xyz.mrwood.study.spring.example;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * 项目:study-spring-example
     * 包名:xyz.mrwood.study.spring.example
     * 功能:
     * 时间:2016-12-13 22:13
     * 作者:Mr.Kiwi
     */
    @Configuration
    @ComponentScan
    public class ApplicationConfig {
    }
    @Configuration这个注解是指定此类是一个配置类,
    @ComponentScan 可以指定扫描主键的范围,如果没有,那么默认当前类所在的包及其子包下所有的类。

    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="xyz.mrwood.study.spring.example" />
    
    </beans>
    @ComponentScan 的XML表现形式。

    自动装配

    Spring自动满足bean之间的依赖,通过autowired进行自动装配

    package xyz.mrwood.study.spring.example;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    /**
     * 项目:study-spring-example
     * 包名:xyz.mrwood.study.spring.example
     * 功能:
     * 时间:2016-12-13 22:08
     * 作者:Mr.Kiwi
     */
    @Component
    public class Store {
    
        @Autowired
        private Waiter waiter;
    
        public void service(){
    
            waiter.service("kiwi");
        }
    }

    依赖注入的两种方式:属性注入和构造器注入。

      属性注入

        使用property标签为属性注入value。

    <?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:util="http://www.springframework.org/schema/util"
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
         
        <!-- 配置一个 bean -->
        <bean id="helloWorld" class="com.jackie.spring.helloworld.HelloWorld">
            <!-- 为属性赋值 -->
            <property name="name" value="Jackie"></property>
        </bean>
    </beans>

      构造器注入

        使用标签constructor-arg 通过构造器注入,前提是POJO中必须有此构造器

    <bean id="car" class="com.jackie.spring.helloworld.Car">
        <constructor-arg value="DaZhong" index="1"></constructor-arg>
        <constructor-arg value="Shanghai" index="0"></constructor-arg>
        <constructor-arg value="250000" type="float"></constructor-arg>
    </bean>

    Spring的配置文件及其简洁,我们甚至看不到声明bean,只有Context:component-scang该标签意为spring会扫描包下面的所有相关类,相关类是指具有以下字样的注解

    @Component: 基本注解, 标识了一个受 Spring 管理的组件

    @Respository: 标识持久层组件

    @Service: 标识服务层(业务层)组件

    @Controller: 标识表现层组件

    标注了如上注解的类都是受Spring管辖的

    Spring 还支持 @Resource 和 @Inject 注解,这两个注解和 @Autowired 注解的功用类似

    岁月本长而忙者自促;天地本宽而卑者自隘;风花雪月本闲,而劳忧者自冗;天行健,君子以自强不息;地势坤,君子以厚德载物;宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒.不妄取,不妄予,不妄想,不妄求,与人方便,随遇而安
  • 相关阅读:
    LeetCode(13) - Roman to Integer
    LeetCode(12) - Integer to Roman
    LeetCode(11) - Container With Most Water
    LeetCode(10) - Regular Expression Matching
    asp.net Mvc 使用uploadify 上传文件 HTTP 302 Error
    DbEntry 4.2 建立关系时的一些问题
    Log4Net 日志文件分类保存
    JqGrid 隐藏水平滚动条完美解决方案
    WebSocket使用SuperWebSocket结合WindowsService实现实时消息
    LigerUI ligerComboBox 下拉框 表格 多选无效
  • 原文地址:https://www.cnblogs.com/vvning/p/7588369.html
Copyright © 2020-2023  润新知