美文网首页
a02-1 装配Bean-自动化装配(Spring实战)

a02-1 装配Bean-自动化装配(Spring实战)

作者: brusion | 来源:发表于2018-08-07 10:30 被阅读0次
    • 创建对象之间的协作关系称为装配,这也就是依赖注入的本质

    本篇内容

    • 1、Spring自动化装配
    • 2、实现组件扫描
    • 3、bean实现自动化装配

    1、Spring在装配方式有三种:

    • 1、在Xml中进行显示配置
    • 2、在java中进行显示配置
    • 3、隐式的bean发现机制和自动化装配

    2、自动化装配bean

    • 1、组件扫描:Spring会自动发现应用上下文所创建的bean
    • 2、自动装配:Spring自动满足bean之间的依赖

    一、自动化装配

    1、定义接口

    public interface CompactDisc {
        void play();
    }
    

    2、定义实现类

    @Component
    public class CDPlayer implements CompactDisc {
        public void play() {
            System.out.println("CD-Player  playing ... ... ");
        }
    }
    
    • 注解说明
    • @Component:表明该类会作为组件类并告知Spring要为这个类创建bean

    3、定义配置类

    • 定义Spring装配规则
    @Configuration
    @ComponentScan
    public class CDConfig {
    }
    
    • 说明:
    • @ComponentScan:这个注解能够在Spring中启用组件扫描,默认会扫描与配置相同的包

    4、测试类

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = CDConfig.class)
    public class CDPlayerTest {
        @Autowired
        private CompactDisc compactDisc;
        @Test
        public void getBean() {
            compactDisc.play();
        }
    }
    
    • 注解说明:
    • 1、使用SpringJUnit4ClassRunner便于在测试的时候自动创建Spring的应用上下文
    • 2、@ContextConfiguration:需要加载的配置
    • 3、@Autowired将对象注入到代码中

    5、为组件扫描的bean命名

    • Spring应用上下文中所有的bean都有一个给定的ID,spring会根据类名给对象一个id,类名字母为小写
    • 给类配置固定的id
    5.1、使用@component
    @Component("pagger")
    public class CDPlayer implement CompactDisc{}
    
    5.2、使用@Named
    @Named("pagger")
    public class CDPlayer implement CompactDis{}
    

    二、设置组件扫描的基础包

    @Configuration
    @ComponentScan(“com.demo”)
    public class CDPlayerConfig{}
    
    • 说明:
    • 1、@ComponentScan(“com.demo”):指定了扫描的基础包名称
    • 2、@ComponentScan(basePackages=“com.demo”)使用这种方式更加清晰表示为包名

    1、设置多个包扫描地址:

    • basePackages是复数知道可以设置多个包名,但是设置多个包名是不安全的行为
    
    @ComponentScan(basePackages={“com.demo.service”,“com.demo.dao”})
    
    

    2、指定包中的类或接口

    
    @ComponentScan(basePackageClasses={UserDao.class,UserService.class})
    
    
    

    三、给bean实现自动装配

    • 自动装配就是让Spring自动满足bean依赖的方法,在满足依赖的过程中会在Spring应用中寻找匹配某个bean需求的其他bean。

    1、创建接口

    public interface CompactDisc {
        void play();
    }
    

    2、创建实现类

    @Component
    public class SgtPepper implements CompactDisc {
        public void play() {
            System.out.println("Sgt Pepper play ... ... ");
        }
    }
    

    3、创建实现类

    @Component
    public class CDPlayer {
        private CompactDisc compactDisc;
        @Autowired
        public CDPlayer(CompactDisc compactDisc) {
            this.compactDisc = compactDisc;
        }
        public void play() {
            compactDisc.play();
        }
    }
    

    4、创建配置类

    @Configuration
    @ComponentScan
    public class CDConfig {
    }
    

    5、测试类

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = CDConfig.class)
    public class CDPlayerTest {
        
        @Autowired
        private CompactDisc compactDisc;
        @Autowired
        private CDPlayer cdPlayer;
        @Test
        public void showBean(){
            compactDisc.play();
        }
        @Test
        public void getBean() {
            cdPlayer.play();
        }
    }
    

    6、CDPlayer其他方式注入

        @Autowired
        public void setCompactDisc(CompactDisc compactDisc) {
            this.compactDisc = compactDisc;
        }
    
        @Autowired
        public void initCompactDisc(CompactDisc compactDisc) {
            this.compactDisc = compactDisc;
        }
    

    7、注意

    • 1、如果没有匹配的bean在应用上下文创建时会抛出异常,为了避免异常可以给@Autowired添加属性
    @Autowired(required=false)
    
    • 2、使用@Inject注解代替Autowired
    • Autowired是spring特有的注解,Inject是java规范的注解

    代码地址:

    
    https://github.com/brusion/brusion-code/tree/master/demo-java/03%20-%20demo%20-%20spring/spring-demo-study/01-di 
    
    

    相关文章

      网友评论

          本文标题:a02-1 装配Bean-自动化装配(Spring实战)

          本文链接:https://www.haomeiwen.com/subject/txjovftx.html