基本介绍
上一篇博文我们已经讲了怎样使用@ComponentScan和@Autowired实现自动装配,这里将讲解使用java config实现bean装配的方式。之所以还需要使用java config装配,是因为当我们使用第三方库中的组件时,就不能再使用@Component和@Autowired了。
java config是配置代码,一般不应该出现任何业务逻辑,以使得相关人员对其功能不产生混淆。
javaConfig方式进行bean装配:@Bean
首先声明实体类接口DuFamily及其实现类SonOne和进行依赖注入测试的类FriendOfSon:
package com.example.springboot.demo.javaconfigsystem;
public interface DuFamily {
void lastName();
}
package com.example.springboot.demo.javaconfigsystem;
import org.springframework.stereotype.Component;
@Component//貌似可以去掉
public class SonOne implements DuFamily {
@Override
public void lastName() {
System.out.println("long");
}
}
package com.example.springboot.demo.javaconfigsystem;
import org.springframework.stereotype.Component;
@Component//貌似可以去掉
public class FriendOfSon {
private DuFamily duFamily;
public FriendOfSon(DuFamily duFamily) {
this.duFamily = duFamily;
}
}
配置类
package com.example.springboot.demo.javaconfigsystem;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DemoConfig {
/**
* 获取大儿子的bean示例
* fixme:返回值类型就是@Autowired对应的类型名称,用@Bean的话貌似SonOne的@Component注解也没什么用了
*/
@Bean
public DuFamily duFamily(){
return new SonOne();
}
/**
* 获取大儿子朋友bean的示例:
* 1.这个bean依赖大儿子的bean,注入依赖的bean有两种中方法:
* 1)调用duFamily方法获取SonOne实例 return new FriendOfSon(duFamily());
* 2)fixme 使用这种方法:构造器注入。也可以setter注入
*/
// @Bean
// public FriendOfSon friendOfSon(DuFamily duFamily){
// return new FriendOfSon(duFamily);
// }
/**
* 使用set方法注入
* @param duFamily
* @return
*/
@Bean
public FriendOfSon friendOfSon(DuFamily duFamily){
FriendOfSon friendOfSon=new FriendOfSon();
friendOfSon.setDuFamily(duFamily);
return friendOfSon;
}
}
测试类
package com.example.springboot.demo.soundsystem;
import com.example.springboot.demo.javaconfigsystem.DemoConfig;
import com.example.springboot.demo.javaconfigsystem.DuFamily;
import com.example.springboot.demo.javaconfigsystem.FriendOfSon;
import com.example.springboot.demo.javaconfigsystem.SonOne;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.assertNotNull;
/**
* 测试使用java的方式(@Bean)配置bean的装配
* @date 2017/12/11
*/
@RunWith(SpringJUnit4ClassRunner.class)//测试时创建spring的应用上下文
@ContextConfiguration(classes = DemoConfig.class)//从这个类里边找配置信息
public class JavaConfigTest {
@Autowired
private DuFamily duFamily;//与返回类型对齐,不是@Component注解的子类
@Autowired
FriendOfSon friendOfSon;
@Test
public void testJavaConfig(){
assertNotNull(friendOfSon);
duFamily.lastName();//调用儿子的方法
}
}