(八)装配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到配置方法之中。 } }