Spring注解开发(四):自动装配

一、前言

本文章是在学习尚硅谷雷丰阳老师的Spring注解驱动的教程视频中,所记录的简单笔记以及代码实现!

雷丰阳老师的视频很赞,建议大家可以去学习一下!

小伙伴在学习Spring框架的时候,有没有被各种xml配置文件所烦扰呢?比如:组件的注册,依赖的注入,组件的生命周期,属性赋值,自动装配等等…

相关博客:

  1. Spring注解开发(一):组件注册
  2. Spring注解开发(二):组件生命周期
  3. Spring注解开发(三):属性赋值
  4. Spring注解开发(四):自动装配

二、注解的相关知识与代码实现

自动装配:Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值!

(一)@Autowired、@Qualifier

  1. 自动注入,默认优先按照类型去容器中找对应的组件。

  2. 如果容器中存在多个相同类型的组件,再将属性的名称作为组件的id去容器中查找。

  3. 若想指定需要装配的组件的id,不想使用属性名的形式,使用@Qualifier注解指定组件id。

  4. 自动装配默认容器中已经存在该组件,没有则会报错。但可以使用@Autowired(required=false)去使用该类型属性。

  5. @Primary注解,没有明确指定哪个组件让Spring进行自动装配的时候,首选的组件。当组件注册时,使用该注解时则获取容器中同类型的多个组件时会首选该组件。

  6. Spring提供的注解,常和@Qualifier使用。

  7. @Autowired注解可以在构造器,参数,方法,属性上使用!都是从IOC容器中获取属性对应的组件!

1. 属性
//代码解释,使用自动装配过程!

//声明controller,service
@Controller
public class PersonController {
    
}

@Service
public class PersonService {
    //定义一个属性,区分同类型的组件
    private int type = 0;

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "PersonService{" +
                "type=" + type +
                '}';
    }
}

//定义配置类,自动扫描包
@Configuration
@ComponentScan({"com.study.controller", "com.study.service", "com.study.dao"})
public class MainConfigOfAutowired {
}

//测试
public class MainTest {


    public static void main(String[] args) {

        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);

        //获取controller组件,并打印
        PersonController bean = applicationContext.getBean(PersonController.class);

        System.out.println(bean);

    }
}
结果:
PersonController{personService=PersonService{type=0}} //自动装配成功


===========================================================================

//测试自动装配按照类型装配,当同类型组件有多个时,按照组件id装配

//修改配置类,使用@Bean注解注册personcontroller类型组件
@Configuration
@ComponentScan({"com.study.controller", "com.study.service", "com.study.dao"})
public class MainConfigOfAutowired {

    //指定组件id为personService1
    @Bean("personService1")
    public PersonService personService() {
        PersonService personService = new PersonService();
        //设置type为1,区分同类型的组件
        personService.setType(1);
        return personService;
    }

}

//修改personController中的属性personService为personService1时
@Autowired
private PersonService personService1;

得到的结果是:PersonController{personService1=PersonService{type=1}}
//说明:@Autowired自动装配当有多个同类型组件时,是按照id查找组件

===========================================================================


//使用@Qualifier注解指定id
@Qualifier("personService")
@Autowired
private PersonService personService1;

得到的结果是:PersonController{personService1=PersonService{type=0}}
//说明:使用@Qualifier指定组件id时,则@Autowired按照属性名称查找组件则不生效!属性名称==>组件id



2. 方法

@Autowired一般标注在装配的组件的set方法上。

Spring容器创建当前对象,就会调用set方法,set方法的参数组件会从IOC容器中获取!

private PersonService personService1;

@Autowired
public void setPersonService(PersonService personService1) {
    this.personService1 = personService1;
}
3. 构造器

容器启动的时候调用构造器创建对象,再进行初始化赋值!

  1. 使用构造器来进行装配的时候,@Autowired注解可以省略不写!参数的组件还是可以自动从IOC容器中获取得到!
@Autowired
public PersonController(PersonService personService1) {
    this.personService1 = personService1;
}

4. 参数
public PersonController(@Autowired PersonService personService1) {
    this.personService1 = personService1;
}

结果都是:PersonController{personService=PersonService{type=1}}

(二)@Resource

和@Autowired注解一样可以完成自动装配功能!

  1. 默认是按照组件的名称id进行装配的!

  2. Java规范的注解,不支持@Primary注解!

//使用@Resource注解自动装配
@Resource
private PersonService personService1;

结果:PersonController{personService=PersonService{type=1}}
//说明:@Resource注解查找组件是按照组件名称id,进行装配!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值