Spring @Autowired

@Autowired

@Autowired 默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring 将其注入到 @Autowired 标注的变量中。

如果容器中没有一个和标注变量类型匹配的 Bean,Spring容器启动时将报 NoSuchBeanDefinitionException 的异常。如果希望 Spring 即使找不到匹配的 Bean 完成注入也不用抛出异常,那么可以使用 @Autowired(required=false)进行标注。

@Service
public class LogonService implements BeanNameAware{
    @Autowired(required=false)
    private LogDao logDao;
        ...
}

 

如果容器中有一个以上匹配的Bean时,则可以通过 @Qualifier 注解限定Bean的名称。

@Service
public class LogonService implements BeanNameAware{
    @Autowired(required=false)
    private LogDao logDao;    //①注入名为UserDao,类型为UserDao的Bean
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;
}

 

@Autowired 可以对类成员变量及方法的入参进行标注,下面我们在类的方法上使用@Autowired注解。

package com.baobaotao.anno;

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class LogonService implements BeanNameAware{
    
    private LogDao logDao;
    private UserDao userDao;
    
    
    @Autowired
    public void setLogDao(LogDao logDao) {
        this.logDao = logDao;
    }
    
    @Autowired
    @Qualifier("userDao")
    public void setUserDao(UserDao userDao) {
        System.out.println("auto inject");
        this.userDao = userDao;
    }
    
}

 

1.@Autowired 注入是按照类型注入的,只要配置文件中的bean类型和需要的bean类型是一致的,这时候注入就没问题。但是如果相同类型的bean不止一个,此时注入就会出现问题,Spring容器无法启动。 
2.@Resource 标签是按照bean的名字来进行注入的,如果我们没有在使用@Resource时指定bean的名字,同时Spring容器中又没有该名字的bean,这时候@Resource就会退化为@Autowired即按照类型注入,这样就有可能违背了使用@Resource的初衷。所以建议在使用@Resource时都显示指定一下bean的名字@Resource(name="xxx")

 

REF

https://www.cnblogs.com/wuchanming/p/5426746.html

posted @ 2021-12-31 18:40  emanlee  阅读(73)  评论(0编辑  收藏  举报