美文网首页
a02-2装配bean-java代码装配(spring实战)

a02-2装配bean-java代码装配(spring实战)

作者: brusion | 来源:发表于2018-08-07 10:31 被阅读0次
    • 通过java代码显示装配bean

    本篇内容

    • 1、通过java配置代码方式获取bean对象
    • 2、通过java配置代码引用方式获取对象
    • 3、验证通过Spring中@Bean注解返回的对象是单例
    • 4、采用构造器方式注入Bean
    • 5、采用Setter()方式注入Bean

    一、基础配置

    1、创建接口

    public interface CompactDisc {
    ​
        void play();
    }
    

    2、创建实现类

    @Component
    public class SgtPepper implements CompactDisc {
        public void play() {
            System.out.println(" sgt-pepper play ... ... ");
        }
    }
    
    public class CDPlayer {
    ​
    ​
        private CompactDisc compactDisc;
    ​
        public CDPlayer(CompactDisc compactDisc) {
            this.compactDisc = compactDisc;
        }
    ​
    ​
        public void play() {
            compactDisc.play();
        }
    ​
        public void setCompactDisc(CompactDisc compactDisc) {
            this.compactDisc = compactDisc;
        }
    ​
        public CompactDisc getCompactDisc() {
            return compactDisc;
        }
    }
    

    3、创建配置文件

    @Configuration
    public class CDConfig {
        
    }
    
    • 注解说明:
    • @Configuration:表示当前类是一个配置类此类应该包含在Spring应用上下文中如何创建Bean细节
    • 注意:采用显示配置方式所以不用@ComponentScan注解

    二、在配置文件中添加获取Bean的方法

    1、配置类修改

    @Configuration
    public class CDConfig {
    ​
        @Bean
        public CompactDisc sgtPepper() {
            return new SgtPepper();
        }
    }
    

    2、测试类

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

    3、修改bean的ID值

    • 默认情况下,bean的ID与带有@Bean注解的方法名是一样的
    @Configuration
    public class PlayConfig {
    ​
        @Bean(name = "longSgtPepper")
        public CompactDisc sgtPepper() {
            return new SgtPepper();
        }
    }
    

    注解说明:

    • 1、@Bean注解告诉Spring此方法将会返回一个对象,此对象要注册为Spring应用上下文中的ben。
    • 2、name = "longSgtPepper":将返回的bean对象声明为一个自定义的名称

    三、引用创建Bean

    1、修改配置文件

    @Configuration
    public class CDConfig {
    ​
        @Bean
        public CompactDisc sgtPepper() {
            return new SgtPepper();
        }
    ​
        @Bean
        public CDPlayer cdPlayer() {
            return new CDPlayer(sgtPepper());
        }
    }
    

    2、测试类

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = CDConfig.class)
    public class CDPlayerTest {
    ​
        @Autowired
        private CDConfig cdConfig;
    ​
        @Test
        public void getCDPlayer(){
            CDPlayer cdPlayer = cdConfig.cdPlayer();
            cdPlayer.play();
        }
    }
    

    说明:

    • 1、new CDPlayer(sgtPeppers()):此方法中返回的Bean对象会与sgtPeppers()中的对象一样
    • 2、因为sgtPeppers()添加了bean注解Spring会拦截所有对此方法的调用,并确保直接返回此方法所创建的bean,不是每次都对此方法进行实际调用

    四、验证通过Spring中@Bean注解返回的对象是单例

    1、配置类修改

    @Configuration
    public class CDConfig {
    ​
        @Bean
        public CompactDisc sgtPepper() {
            return new SgtPepper();
        }
    ​
        @Bean
        public CDPlayer cdPlayer() {
            return new CDPlayer(sgtPepper());
        }
    ​
        @Bean
        public CDPlayer anotherPlayer() {
            return new CDPlayer(sgtPepper());
        }
    }
    
    • Spring中的bean都是单例的,所以在每次调用bean注解的方法是都会得到相同的bean

    2、测试类

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = CDConfig.class)
    public class CDPlayerTest {
    ​
        @Autowired
        private CDConfig cdConfig;
    ​
        @Test
        public void getBean() {
            CompactDisc compactDisc = cdConfig.sgtPepper();
            compactDisc.play();
        }
    ​
        @Test
        public void equalsBean() {
            CompactDisc compactDisc = cdConfig.sgtPepper();
            CDPlayer cdPlayer = cdConfig.anotherPlayer();
            CompactDisc compactDisc1 = cdPlayer.getCompactDisc();
            if (compactDisc.equals(compactDisc1)) {
                System.out.println("对象相等");
            }
        }
    }
    

    五、采用构造器方式注入bean

    1、配置类

    @Configuration
    public class CDConfig {
        
        @Bean
        public CDPlayer cdPlayer(CompactDisc compactDisc) {
            return new CDPlayer(compactDisc);
        }
    ​
    }
    

    说明:

    • 调用new CDPlayer();时会自动装配一个CompactDisc对象,方法体会用一个合适的方法类使用bean对象

    六、采用setter方式

    1、配置类

    @Configuration
    public class CDConfig {
        
        @Bean
        public CDPlayer anotherPlayer(CompactDisc compactDisc) {
            CDPlayer cdPlayer = new CDPlayer(compactDisc);
            cdPlayer.setCompactDisc(compactDisc);
            return cdPlayer;
        }
    }
    

    2、测试类

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = CDConfig.class)
    public class CDPlayerTest {
    ​
        @Autowired
        private CDConfig cdConfig;
    ​
        @Test
        public void equalsCDPlayer() {
            CDPlayer cdPlayer = cdConfig.cdPlayer(cdConfig.sgtPepper());
            CompactDisc compactDisc = cdPlayer.getCompactDisc();
            cdPlayer.play();
    ​
            CDPlayer cdPlayer1 = cdConfig.cdPlayer();
            CompactDisc compactDisc1 = cdPlayer1.getCompactDisc();
            cdPlayer1.play();
            if (compactDisc.equals(compactDisc1)) {
                System.out.println("对象相等");
            }
        }
    ​
    }
    

    代码地址:

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

    相关文章

      网友评论

          本文标题:a02-2装配bean-java代码装配(spring实战)

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