七种代码实现Spring Bean 的装配

静态方法装配

@Data
@NoArgsConstructor
@AllArgsConstructor
@Mark
public class User {
          
   
    private Long id;
    private String name;

    public static User createUser() {
          
   
        User user = new User();
        user.setId(1L);
        user.setName("静态方法装配");
        return user;
    }
}

实例方法装配

public interface UserFactory {
          
   

    default User createUser() {
          
   
        User user = new User();
        user.setId(1L);
        user.setName("实例方法装配");
        return user;
    }
}

AutowireFactory装配

自动注入的是AutowireFactory,然后调用了这个bean的方法

// AutowireCapableBeanFactory
// 自动注入的是AutowireFactory,然后调用了这个bean的方法
AutowireCapableBeanFactory autowireCapableBeanFactory = xmlApplicationContext.getAutowireCapableBeanFactory();
UserFactory userFactory = autowireCapableBeanFactory.createBean(AutowireFactory.class);
System.out.println(userFactory.createUser());

public class AutowireFactory implements UserFactory {
          
   

    @Override
    public User createUser() {
          
   
        User user = new User();
        user.setId(1L);
        user.setName("AutowireFactory装配");
        return user;
    }
}

ServiceLoader装配

ServiceLoader也是个FactoryBean,但是类型是ServiceLoader,从META-INF/services里的配置文件读取实现类

public class ServiceLoaderUserFactory implements UserFactory {
          
   
实现实例方法装配
    @Override
    public User createUser() {
          
   
        User user = new User();
        user.setId(1L);
        user.setName("ServiceLoader装配");
        return user;
    }
}

自定义FactoryBean装配

public class UserFactoryBean implements FactoryBean {
          
   

    @Override
    public Object getObject() throws Exception {
          
   
        User user = new User();
        user.setId(1L);
        user.setName("FactoryBean装配");
        return user;
    }

    @Override
    public Class<?> getObjectType() {
          
   
        return User.class;
    }
}
public static void main(String[] args) {
          
   
        // 使用xml装配
        ApplicationContext xmlApplicationContext = new ClassPathXmlApplicationContext("classpath:/META-INF/bean-loader-context.xml");
        // 构造方法
        User userByConstructor = xmlApplicationContext.getBean("user-by-constructor", User.class);
        System.out.println(userByConstructor);
        // 使用静态方法装配
        User userByStaticMethod = xmlApplicationContext.getBean("user-by-static-method", User.class);
        System.out.println(userByStaticMethod);
        // 使用实例方法装配
        User userByInstanceMethod = xmlApplicationContext.getBean("user-by-instance-method", User.class);
        System.out.println(userByInstanceMethod);
        // 自定义factoryBean
        User userByFactoryBean = xmlApplicationContext.getBean("user-by-factory-bean", User.class);
        System.out.println(userByFactoryBean);
        // ServiceLoader
        ServiceLoader<?> serviceLoader = xmlApplicationContext.getBean("userFactoryServiceLoader", ServiceLoader.class);
        for (Object o : serviceLoader) {
          
   
            UserFactory userFactory = (UserFactory) o;
            System.out.println(userFactory.createUser());
        }
        // AutowireCapableBeanFactory
        AutowireCapableBeanFactory autowireCapableBeanFactory = xmlApplicationContext.getAutowireCapableBeanFactory();
        UserFactory userFactory = autowireCapableBeanFactory.createBean(AutowireFactory.class);
        System.out.println(userFactory.createUser());
    }
经验分享 程序员 微信小程序 职场和发展