按照名字注入类

按照名字注入类

@Component
public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringUtil.applicationContext == null) {
            SpringUtil.applicationContext = applicationContext;
        }
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }

}
@Autowired
ApplicationContext ac;

参考:
https://www.jianshu.com/p/3cd2d4e73eb7

Spring框架按名字进行依赖注入可通过`@Qualifier`注解与`@Autowired`注解配合使用来实现。`@Autowired`默认按注入,如果存在多个相同型的Bean,就可以使用`@Qualifier`注解指定具体的Bean名称。示例代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; // 定义一个接口 interface MyService { void doSomething(); } // 实现1 @Component("serviceImpl1") class MyServiceImpl1 implements MyService { @Override public void doSomething() { System.out.println("MyServiceImpl1 is doing something."); } } // 实现2 @Component("serviceImpl2") class MyServiceImpl2 implements MyService { @Override public void doSomething() { System.out.println("MyServiceImpl2 is doing something."); } } // 使用 @Component class MyClient { @Autowired @Qualifier("serviceImpl1") private MyService myService; public void performAction() { myService.doSomething(); } } ``` 在上述代码中,`MyClient`中使用`@Autowired`和`@Qualifier("serviceImpl1")`注解,Spring容器会根据`@Qualifier`指定的名字“serviceImpl1”来注入对应的`MyServiceImpl1`实例。 其原理是在Spring创建Bean的过程中,当执行到`populateBean`方法进行属性填充时,`AutowiredAnnotationBeanPostProcessor`后置处理器会处理`@Autowired`注解。该后置处理器首先查找需要注入的成员,当遇到`@Qualifier`注解时,会根据其指定的名字去Spring容器中查找对应的Bean。在查找时,Spring容器会维护一个Bean名称到Bean实例的映射关系,通过`@Qualifier`指定的名字作为键,从这个映射关系中找到对应的Bean实例,然后通过反射调用`java.lang.reflect.Field#set`方法将该实例注入到目标字段中。如果指定名字Bean不存在,会根据情况调用`doCreateBean`方法去创建这个Bean [^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值