Spring中bean的三种装配机制之一—java configure

基本介绍

  上一篇博文我们已经讲了怎样使用@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();//调用儿子的方法
    }
}

git地址:https://github.com/dugenkui03/spring-bean-wiring-demo

你可能感兴趣的:(框架,java,spring)