七种代码实现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());
}
