Spring注解驱动开发——自动装配 @Autowired @Qualifier @Primary

Posted mangoubiubiu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring注解驱动开发——自动装配 @Autowired @Qualifier @Primary相关的知识,希望对你有一定的参考价值。

 自动装配;
 Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值;
        1)丶@Autowired: 自动注入
           1 默认优先按照类型去容器中找队应的组件:applica.getBean(UserDao.class);找到就赋值
           2 如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
                                   applica.getBean("userDao");
           3 @Qualifier("bookDao");使用@Qualifier指定需要装配的组件的id,而不是使用属性名
           4 自动装配默认一定要将属性赋值好,没有就会报错;
             可以使用@Autowired(required=false);作为非必需的
           5 @Primary,让Spring进行自动装配的时候,默认使用首选的bean
            也可以继续使用@Qualifier指定需要装配的bean的名字
            UserService{
                  @Autowired
                 UserDao userDao;
           }

@Autowired

           1 默认优先按照类型去容器中找队应的组件:applica.getBean(UserServiceImpl.class);找到就赋值

配置类

package com.mongoubiubiu.conf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import com.mongoubiubiu.dao.UserDao;
import com.mongoubiubiu.service.serviceImpl.UserServiceImpl;


@Configuration
@ComponentScan({"com.mongoubiubiu.service","com.mongoubiubiu.dao","com.mongoubiubiu.controller"})
public class MainConfigOfAutowired {


    
}

组件类

package com.mongoubiubiu.service.serviceImpl;

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

import com.mongoubiubiu.dao.UserDao;
import com.mongoubiubiu.service.UserService;

@Service
public class UserServiceImpl implements UserService {
 
    
    @Autowired
    private UserDao userDao;
    
    public void print(){
        System.out.println("userDao:"+userDao);
    }

    @Override
    public String toString() {
        return "UserServiceImpl [userDao2=" + userDao + "]";
    }
    
}
package com.mongoubiubiu.dao;

import org.springframework.stereotype.Repository;

//名字默认是类名小写
@Repository
public class UserDao {
    
    
    
    

}

测试类

package com.mongougbiubiu.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;

import com.mongoubiubiu.conf.MainConfigOfAutowired;
import com.mongoubiubiu.conf.MainConfigOfLifeCycle;
import com.mongoubiubiu.dao.UserDao;
import com.mongoubiubiu.service.UserService;
import com.mongoubiubiu.service.serviceImpl.UserServiceImpl;

public class IOCTest_Autowired {
    
    
    @Test
    public void Test01(){
        //创建ioc 容器
        AnnotationConfigApplicationContext applica=    new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);
        UserService userService=applica.getBean(UserServiceImpl.class);

         userService.print();

        System.out.println(userService);
    } 

}

结果

 

 因为userDao上有@Repository  加载配置类的时候 又用@ComponentScan 扫描过该包 所以userDao 被注册到了容器中, bean  id 为类名首字母小写。

此时再获取bean  发现和 @Autowired自动装配的bean 为同一对象

 

 

 

  2 如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找applica.getBean("userDao");

配置类

      配置类里注册一个UserDao 此时bean  id 为 userDao2

package com.mongoubiubiu.conf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import com.mongoubiubiu.dao.UserDao;
import com.mongoubiubiu.service.serviceImpl.UserServiceImpl;

@Configuration
@ComponentScan({"com.mongoubiubiu.service","com.mongoubiubiu.dao","com.mongoubiubiu.controller"})
public class MainConfigOfAutowired {

    @Bean("userDao2")
    public UserDao userDao(){
        
        UserDao user=new UserDao();
        user.setLable("2");
        return user;
    }
    
}

组件类

package com.mongoubiubiu.dao;

import org.springframework.stereotype.Repository;

//名字默认是类名小写
@Repository
public class UserDao {
    
    public String lable="1";

    public String getLable() {
        return lable;
    }

    public void setLable(String lable) {
        this.lable = lable;
    }

    @Override
    public String toString() {
        return "UserDao [lable=" + lable + "]";
    }
    
    
    
    
    

}
package com.mongoubiubiu.service.serviceImpl;

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

import com.mongoubiubiu.dao.UserDao;
import com.mongoubiubiu.service.UserService;

@Service
public class UserServiceImpl implements UserService {
 
    
    //@Qualifier("userDao")
    @Autowired
    private UserDao userDao;
    
    public void print(){
        System.out.println("userDao:"+userDao);
    }

    @Override
    public String toString() {
        return "UserServiceImpl [userDao2=" + userDao + "]";
    }
    
}

测试类

package com.mongougbiubiu.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;

import com.mongoubiubiu.conf.MainConfigOfAutowired;
import com.mongoubiubiu.conf.MainConfigOfLifeCycle;
import com.mongoubiubiu.dao.UserDao;
import com.mongoubiubiu.service.UserService;
import com.mongoubiubiu.service.serviceImpl.UserServiceImpl;

public class IOCTest_Autowired {
    
    
    @Test
    public void Test01(){
        //创建ioc 容器
        AnnotationConfigApplicationContext applica=    new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);
        UserService userService=applica.getBean(UserServiceImpl.class);

        System.out.println(userService);
    } 

}

结果

 

 

 发现自动装配的是  @Repository 标注的 类  lable 1 

再次改变 service 

 

 

 再次测试

 

 

 

是lable 2  可见优先注入的是和 bean id 写的一样的 属性名。

  3    自动装配默认一定要将属性赋值好,没有就会报错;可以使用@Autowired(required=false);作为非必需的

配置类

         不然userDao 注入到容器中

 

 组件类

        也不让userDao 注入到容器中、

 

 测试类

和上边一样

结果

 

 报错

 

 加上 required=false  测试

 

 不会抛异常。@Autowired 默认是required = true


             

以上是关于Spring注解驱动开发——自动装配 @Autowired @Qualifier @Primary的主要内容,如果未能解决你的问题,请参考以下文章

Spring注解驱动开发第20讲——使用@Autowired@Qualifier@Primary这三大注解自动装配组件,你会了吗?

Springbean的自动装配,使用注解开发,使用Java的方式配置Spring

Spring入门篇——第4章 Spring Bean装配(下)

Spring 框架学习---- bean自动装配注解开发

Spring的自动装配及注解开发(“最易懂得Spring学习”)

Spring学习Bean自动装配与注解开发