zoukankan      html  css  js  c++  java
  • spring装配bean有几种方式?

    一 前言

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

    关于xml配置不会在本篇说明,有兴趣的读者可以自行了解学习;

    知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)

    二 自动装配bean

    自动装配Bean主要通过如下两个方式实现自动装备bean

    1. 组件扫描(component scanning):Spring会自动扫描发现上下文中所创建的bean;对应java配置@ComponentScan注解,其会默认会扫描与配置类相同的包和其子包;如果是xml就是<context:component-scan>
    2. 自动装配(autowiring):Spring自动化管理bean之间的依赖关系;java配置@Autowiring注解,相当于java规范中的@Inject注解;其可以使用在任何类的任何方法上;不建议将required属性设置为false,否则如果在bean未装配的情况下就会报空指针异常;
    3. @Component注解:赋予spring上下文组件类一个ID;如果不指定value默认就是将类名的第一个字母变为小写形式;其相当于java规范中的@Name注解;

    敲黑板了

    理下思路我们可以通过@Component注解使用在多个类上实现多个bean;然后通过@Autowiring使用在方法上实现bean之间的依赖注入;最后通过@ComponentScan将所有bean扫入spring应用上下文;当然里面还有许多使用的小细节,要不然很容易出错;

    实现如下

    2.1 棉被类

    /**
     * @Author lsc
     * <p>棉被 </p>
     */
    @Component
    public class Quilt {
    
        // 质量
        private String quality;
    
        public void product(){
            System.out.println("生产与中国");
        }
    
    // 省略set/get
    }
    

    2.2 被单类

    /**
     * @Author lsc
     * <p> 被单</p>
     */
    @Component//相当于@Component("sheet")
    public class Sheet {
    
        // 颜色
        private String color;
        // 长度
        private String length;
    
    
        private Quilt quilt;
        // 使用构造器注入方式将Quilt注入到Sheet,你也可以使用set方式;原则上还可以其它方法
        public Sheet(Quilt quilt){
            this.quilt = quilt;
        }
    // 省略set/get
    
    }
    

    2.3被单配置类

    /**
     * @Author lsc
     * <p>被单配置类 </p>
     */
    @Configuration//告诉spring这是一个配置类
    @ComponentScan//这边的包是com.zszxz.auto 相当于@ComponentScan(basePackages = {"com.zszxz.auto"})
    public class SheetConfig {
    }
    

    2.4 测试类

    /**
     * @Author lsc
     * <p> </p>
     */
    @RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文
    @ContextConfiguration(classes= SheetConfig.class)//加载配置类
    public class SheetTest {
    
        @Autowired
        Sheet sheet;
    
        @Test
        public void sheetTest(){
            // 生产与中国
            sheet.getQuilt().product();
        }
    }
    

    三 java配置

    java配置只需要通过如下注解即可完成,通常使用在引入第三方类时;

    1. @Configuration注解:告诉spring这是一个配置类
    2. @Bean注解:告诉spring这是一个bean,使用在方法上,默认bean的名称就是方法名也就是前面提到的bean的ID;

    思路:@Configuration注解声明的配置类中使用注解@Bean,就实现了java配置;

    3.1 棉类

    /**
     * @Author lsc
     * <p>棉 </p>
     */
    public class Cotton {
    
        // 质量
        private String quality;
    
        public void product(){
            System.out.println("cotton生产与中国");
        }
        //  省略set/get
    }
    

    3.2 毛毯

    /**
     * @Author lsc
     * <p> 毛毯</p>
     */
    public class Blanket {
    
        // 颜色
        private String color;
        // 长度
        private String length;
    
        // 构造器注入
        private Cotton cotton;
        @Autowired
        public Blanket(Cotton cotton){
            this.cotton = cotton;
        }
        //  省略set/get
    }    
    

    3.3 毛毯配置类

    /**
     * @Author lsc
     * <p>毛毯配置类 </p>
     */
    @Configuration//告诉spring这是一个配置类,spring会扫描其所有配置纳入spring容器
    public class BlanketConfig {
    
        // 将Cotton注入到spring应用上下文
        @Bean
        public Cotton cotton(){
            return new Cotton();
        }
    
        // 将 Cotton注入到Blanket注入到spring应用上下文
        @Bean
        public Blanket blanket(Cotton cotton){
            return new Blanket(cotton);
        }
    }
    

    3.4 测试类

    /**
     * @Author lsc
     * <p> </p>
     */
    @RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文
    @ContextConfiguration(classes= BlanketConfig.class)//加载配置类
    public class BlanketTest {
    
        @Autowired
        Blanket blanket;
    
        @Test
        public void sheetTest(){
            // cotton生产与中国
            blanket.getCotton().product();
        }
    }
    

    四 配置结合

    使用 @Import 注解能将一个配置类导入另一个配置类, 通常用来合并配置类,下面的示例使用方式更加优雅;

    使用示例

    /**
     * @Author lsc
     * <p> </p>
     */
    @Configuration
    @Import({SheetConfig.class, BlanketConfig.class})
    public class MergeConfig {
    }
    

    测试示例

    /**
     * @Author lsc
     * <p> </p>
     */
    
    @RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文
    @ContextConfiguration(classes= MergeConfig.class)//加载配置类
    public class MergeTest {
        @Autowired
        Blanket blanket;
    
        @Test
        public void sheetTest(){
            // cotton生产与中国
            blanket.getCotton().product();
        }
    }
    

    更多精彩原创内容关注公众号:知识追寻者

  • 相关阅读:
    计算机操作系统实验之_进程观测_实验报告
    KVO(NSKeyValueObserving 键 值编码)与KVC(NSKeyValueCoding 键值观察机制)详解
    用arrayWithObject:初始化,参数为空数组NSArray时出现的异常
    用QtCreator实现可扩展对话框实验
    xcode4 设置调试错误信息小结
    从“Qt信号槽机制”到”iOS(MVC)中的Target——Action机制”
    Qt源码分析之信号和槽机制
    objectivec 学习之NSMutableDictionary介绍
    iOS面试题汇总 (1)
    报告论文:关于一个小型学生信息管理系统研究
  • 原文地址:https://www.cnblogs.com/zszxz/p/12684496.html
Copyright © 2011-2022 走看看