Spring注解开发——22、自动装配-方法、构造器位置的自动装配

22.1 @Autowired 标注在方法上

  • 标注在方法上,Spring容器创建当前对象,就会调用方法,完成赋值
  • 方法使用的参数,自定义类型的值从IOC容器中获取
package com.suirui.springanno.autowiredDemo.entity;

import org.springframework.stereotype.Component;

@Component
public class Car {
    String label = "car1";

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }
}

package com.suirui.springanno.autowiredDemo.entity;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Boss {

    Car car;

    public Car getCar() {
        return car;
    }

    @Autowired
    //标注在方法上,Spring容器创建当前对象,就会调用方法,完成赋
    //方法使用的参数,自定义类型的值从IOC容器中获取
    public void setCar(Car car) {
        this.car = car;
    }

    public void print(){
        System.out.println("Boss car类注入" + car);
        if (car == null) {
            return;
        }
        System.out.println("car的Label: " + car.getLabel());

    }
}


package com.suirui.springanno.autowiredDemo;

import com.suirui.springanno.autowiredDemo.Service.BookService;
import com.suirui.springanno.autowiredDemo.config.MainConfigAutoWired;
import com.suirui.springanno.autowiredDemo.entity.Boss;
import com.suirui.springanno.autowiredDemo.entity.Car;
import com.suirui.springanno.propertyValues.entity.Person;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

public class MainTestAutoWired {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfigAutoWired.class);
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String s : beanDefinitionNames) {
            System.out.println(s);
        }

        Boss bean = ac.getBean(Boss.class);
        Car bean1 = ac.getBean(Car.class);
        System.out.println(bean.getCar() == bean1);
        bean.print();
    }
}

22.2 @Autowired 标注在构造器

  • 默认加在IOC容器中的组件,容器启动会调用无参构造器创建对象,再进行赋值操作
  • 会调用@Autowired 标注在构造器,构造器中的组件也是从IOC容器中获取
  • 如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,中的组件也是自动从IOC容器中获取
  • @Autowired 标注多个构造器会报错
package com.suirui.springanno.autowiredDemo.entity;

import org.springframework.stereotype.Component;

@Component
public class House {

    String label = "house1";

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }
}


package com.suirui.springanno.autowiredDemo.entity;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Boss {

    Car car;
    House house;

    public Boss() {
    }

    @Autowired
    public Boss(Car car) {
        this.car = car;
    }

    @Autowired
    public Boss(House house) {
        this.house = house;
    }

    public Car getCar() {
        return car;
    }

//    @Autowired
    //标注在方法上,Spring容器创建当前对象,就会调用方法,完成赋
    //方法使用的参数,自定义类型的值从IOC容器中获取
    public void setCar(Car car) {
        this.car = car;
    }

    public void print(){
        System.out.println("Boss car类注入" + car);
        System.out.println("Boss house类注入" + house);
        if (car == null) {
            return;
        }
        System.out.println("car的Label: " + car.getLabel());
        System.out.println("house的Label: " + house.getLabel());

    }
}

22.3 @Autowired 标注在参数上

  • 参数也是从IOC容器中获取
  • @Bean方式+方法参数;参数从容器中获取,可以省略@Autowired
package com.suirui.springanno.autowiredDemo.config;

import com.suirui.springanno.autowiredDemo.dao.BookDao;
import com.suirui.springanno.autowiredDemo.entity.Boss;
import com.suirui.springanno.autowiredDemo.entity.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration
@ComponentScan(value = "com.suirui.springanno.autowiredDemo")
public class MainConfigAutoWired {

//    @Bean(value = "bookDao2")
//    @Primary
//    public BookDao bookDao(){
//        BookDao b = new BookDao();
//        b.setLabel("2");
//        return  b;
//    }

    @Bean
    public Boss boss(Car car){
        Boss boss = new Boss();
        boss.setCar(car);
        return boss;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值