zoukankan      html  css  js  c++  java
  • 利用Java代码在某些时刻创建Spring上下文

    上一篇中,描述了如何使用Spring隐式的创建bean,但当我们需要引进第三方类库添加到我们的逻辑上时,@Conponent与@Autowired是无法添加到类上的,这时,自动装配便不适用了,我们需要利用Java代码来显式实现bean

    继上次的CD例程,两个接口,MediaPlayer/CompactDisc,其中MediaPlayer的实现为CDPlayer,CompactDisc的实现为CompactDisc_guangliang/CompactDisc_wangfei/CompactDisc_zhoujielun/CompactDisc_xusong。(之所以这么多是为了理解Spring的单次bean多次使用机制,通俗讲就是Spring为每一个bean只创建一个对象)代码可由上篇改动而来,这次去掉了创建注解与扫描注解。部分代码如下,其他实现与之类似:
    package com.spring.javabeans.cd;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class CDPlayer implements MediaPlayer{
    	private CompactDisc cd;
    	
    	@Autowired//表明Spring初始化后尽可能地去满足bean的依赖,在这里它注入了一个CompactDisc的对象
    	public CDPlayer(CompactDisc cd){
    		this.cd=cd;
    	}
    	@Override
    	public void player() {
    		System.out.println("使用CD播放!");
    	}
    }
    

     @Autowired只表明在调用构造器时Spring为其注入一个需要的bean

    package com.spring.javabeans.cd;
    
    public class CompactDisc_guangliang implements CompactDisc{
    	private String title="童话";
    	private String artist="光良";
    	
    	@Override
    	public void play(){
    		System.out.println("播放:"+title+"来自艺术家:"+artist);
    	}
    }
    

     去除了@Component之后,CompactDisc变成一个普通类,在这里,Spring不对其负责。

    接下来写配置类。代码如下:
    package com.spring.javabeans.cd;
    
    import org.springframework.context.annotation.Bean;
    
    //通过java代码定义spring的装配机制
    public class CDPlayerConfig {
    	@Bean
    	public CompactDisc randomBeatlesCD(){
    		int key=(int)Math.floor(Math.random()*4);
    		if(key==0){
    			return new CompactDisc_zhoujielun();
    		}
    		else if(key==1){
    			return new CompactDisc_xusong();
    		}
    		else if(key==2){
    			return new CompactDisc_guangliang();
    		}
    		else{
    			return new CompactDisc_wangfei();
    		}
    	}
    	
    	@Bean
    	public CDPlayer cdplayer(CompactDisc cd){
    		return new CDPlayer(cd);
    	}
    }
    

     @bean表明了Spring需要在这里创建一个bean。

    同样,我们用一个建一个JUnit4测试。代码如下:
    package com.spring.javabeans.cd;
    
    import static org.junit.Assert.*;
    import org.junit.runner.RunWith;
    import org.junit.Test;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes=CDPlayerConfig.class)
    public class CDTest {
    	@Autowired
    	private MediaPlayer player;
    	@Autowired
    	private CompactDisc cd;
    	@Test
    	public void test1() {
    		assertNotNull(player);
    		assertNotNull(cd);
    	}
    	@Test
    	public void test2(){
    		player.player();
    		cd.play();
    	}
    
    }
    

    @Autowired表明了依赖注入关系。

    热爱分享拒绝拿来主义,博客精神永存——cvrigo

    2016-11-09 13:40:56

    支持原创,支持转载,拒绝抄袭
  • 相关阅读:
    特殊类
    Statement和PrepareStatement有什么区别?
    关于${pageContext.request.contextPath }对于工程中的那个目录
    IDEA JSP中报错cannot resolve method println的解决方案
    关于${pageContext.request.contextPath}的理解
    IDEA中引用不到HttpServlet的解决方案
    Serializable接口的意义和用法
    idea Cannot resolve method (最新2020解决办法)
    IDEA Artifacts:Error during artifact deployment问题解决(狂神SSM整合里,报404错误方案)
    IDEA设置自动导入包方法
  • 原文地址:https://www.cnblogs.com/cvirgo/p/6046646.html
Copyright © 2011-2022 走看看