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

 

@Qualifier

3  @Qualifier("bookDao");使用@Qualifier指定需要装配的组件的id,而不是使用属性名

配置类  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;
    }
    
}
复制代码

组件类  bean id 名 为id 小写  

UserDao

复制代码
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 + "]";
    }
    
    
    
    
    

}
复制代码

Service  @Autowired的规则是 取属性名小写的bean  userDao2     @Qualifier("userDao")  是取 bean id 叫 userDao 的bean

复制代码
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 userDao2;
    
    public void print(){
        System.out.println("userDao:"+userDao2);
    }

    @Override
    public String toString() {
        return "UserServiceImpl [userDao2=" + userDao2 + "]";
    }
    
}
复制代码

测试  发现取得bean 是按照 @Qualifier的规则

 

 

 @Primary

@Primary,让Spring进行自动装配的时候,默认使用首选的bean

配置类 直接在方法上面 标注  表明首选的bean 是 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 {

    @Primary
    @Bean("userDao2")
    public UserDao userDao(){
        
        UserDao user=new UserDao();
        user.setLable("2");
        return user;
    }
    
}
复制代码

组件类

UserDao

复制代码
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 + "]";
    }
    
    
    
    
    

}
复制代码

Service

@Autowired  的规则是属性名  取得是 叫做 userDao2 的bean  ,此时@Qualifier给注掉了  为了不影响测试
复制代码
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 + "]";
    }
    
}
复制代码

测试

 

 

 此时 是   @Qualifier 标注的bean 被自动装配了 

 @Primary & @Qualifier 优先级

@Qualifier  > @Primary

Service

上次测试信息 不变  将  @Qualifier  放开 

复制代码
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 + "]";
    }
    
}
复制代码

测试   取得的 

 @Qualifier("userDao")  名叫 userDao 的bean

 

本文作者:KwFruit

本文链接:https://www.cnblogs.com/mangoubiubiu/p/15101350.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   KwFruit  阅读(63)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起