(八)装配Bean(2)

二、在Java类中进行显式的装配

  • 显式配置有两种:

     1. 一种是在java(本文讲解)

     2. 另一种是xml配置文件(第一章有讲)

案例一: 使用java显式装配+@autowired自动装配的方式

  • 定义接口 CD.java
package bean;

public interface CD {
    void play();
}
  • 接口的实现类1  CD1.java
package bean;

import org.springframework.stereotype.Component;

public class CD1 implements CD {

    @Override
    public void play() {
        System.out.println("我是CD11");
    }

}
  • 接口的实现类2  CD2.java
package bean;

import org.springframework.stereotype.Component;

public class CD2 implements CD {

    @Override
    public void play() {
        System.out.println("我是CD22");
    }

}
  • CDPlayer .java
package bean;

import org.springframework.beans.factory.annotation.Autowired;

public class CDPlayer {
    @Autowired
    private CD cd1;

    public void play() {

        cd1.play();
    }

}
  • 编写java显式配置类 CDConfig.java
package bean;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration  //指定这个雷氏一个配置类,相当于spring xml配置文件中的<beans>标签
public class CDConfig {
    
    @Bean  //该注解会告诉spring该方法会返回一个对象,且该对象会注册为spring应用杀光你下文的bean。 默认下,
            //bean的id与该方法的方法名一样,@Bean(name="")进行修改id名
    public CD cd1(){
        return new CD1();
    }
    
    @Bean    //该注解会告诉spring该方法会返回一个对象,且该对象会注册为spring应用杀光你下文的bean。 默认下,
            //bean的id与该方法的方法名一样,@Bean(name="")进行修改id名
    public CD cd2(){
        return new CD2();
    }
    
    @Bean    //该注解会告诉spring该方法会返回一个对象,且该对象会注册为spring应用杀光你下文的bean。 默认下,
            //bean的id与该方法的方法名一样,@Bean(name="")进行修改id名
    public CDPlayer cdPlayer(){
        return new CDPlayer();
    }
    
}
  • 编写测试类
package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import bean.CDConfig;
import bean.CDPlayer;

public class Test {
    public static void main(String[] args) {
        
        ApplicationContext context=new AnnotationConfigApplicationContext(CDConfig.class);
        CDPlayer cdplayer=(CDPlayer)context.getBean("cdPlayer");
        cdplayer.play();
        
        
    }
}

结果:



案例二: 使用java显式装配+javaConfig手动注入的方式

  • 定义接口CD.java
package interfacepackage;

public interface CD {
    void play();
}
  • 定义接口player.java
package interfacepackage;

//定义一个播放器接口
public interface player {
    void play();
}
  • 定义播放器接口的实现类  CDPlayer .java
package bean;

import interfacepackage.CD;
import interfacepackage.player;

//创建一个CD播放器,需要一个CD才能播放
public class CDPlayer implements player {

    private CD cd;

    public CDPlayer(CD cd) {
        this.cd = cd;
    }

    @Override
    public void play() {

        cd.play();
    }

}
  • 定义CD接口的实现类 Music_CD.java
package bean;

import interfacepackage.CD;

//创建一个音乐CD
public class Music_CD implements CD {

    @Override
    public void play() {
        System.out.println("我是音乐CD");

    }

}
  • 定义CD接口的实现类 Movie_CD.java
package bean;

import interfacepackage.CD;

//创建一个电影CD
public class Movie_CD implements CD {

    @Override
    public void play() {
        System.out.println("我是电影CD");

    }

}
  • 定义java配置类 CDPlayerConfig.java
package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import bean.CDPlayer;
import bean.Movie_CD;
import bean.Music_CD;

//该配置使用java显式配置
@Configuration
public class CDPlayerConfig {

    @Bean()  //该注解告诉spring该方法会返回一个对象,且该对象会被注册为spring应用上下文的bean。
                //默认下,该bean的id与方法名一样,可通过@Bean(name="") 设置bean的id名
    public Music_CD musci_cd() {

        return new Music_CD();
    }

    @Bean
    public Movie_CD movie_cd() {
        return new Movie_CD();
    }

    @Bean
    public CDPlayer cdPlayer() {
        return new CDPlayer(movie_cd());   //要创建CDPlayer对象其构造方法必须传入一个CD对象,调用movie_cd()
                                            //创建一个Movie_CD对象,也可以调用musci_cd()方法
    }

}
  • 编写测试类Test.java
package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import config.CDPlayerConfig;
import bean.CDPlayer;

public class Test {
    public static void main(String[] args) {
        
        ApplicationContext context=new AnnotationConfigApplicationContext(CDPlayerConfig.class);
        CDPlayer cdplayer=(CDPlayer)context.getBean("cdPlayer");
        cdplayer.play();
        
        
    }
}

结果:

  •  注意 : 默认情况下,spring的bean都是单例的,在java配置类中,

如果有多个CDPlayer类调用movie_cd()方法来获取Movie_cd对象,都是同一个Movie_cd对象。

  •  一般情况下,我们不用上图所示的方法来实现依赖。改造上图代码,即修改java配置类 CDPlayerConfig.java 其他文件都不变
package config;

import interfacepackage.CD;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import bean.CDPlayer;
import bean.Movie_CD;
import bean.Music_CD;

//该配置使用java显式配置
@Configuration
public class CDPlayerConfig {

    @Bean()  //该注解告诉spring该方法会返回一个对象,且该对象会被注册为spring应用上下文的bean。
                //默认下,该bean的id与方法名一样,可通过@Bean(name="") 设置bean的id名
    public Music_CD musci_cd() {

        return new Music_CD();
    }

    @Bean
    public Movie_CD  cd() {
        return new Movie_CD();
    }

    @Bean
    public CDPlayer cdPlayer(CD cd) {
        return new CDPlayer(cd);   //cdPlayer方法请求一个参数为CD类型的参数,当spring调用cdPlayer方法创建CDPlayer
                            //对象的时候,会自动装配一个CD到配置方法之中。
    }

}
原文地址:https://www.cnblogs.com/shyroke/p/6847344.html