自动装配构造器&方法---Spring源码从入门到精通(十三)

上篇文章主要介绍了@Resource和@inject:

1)、这两个都是java的jre规范,之前的@Autowired是spring规范。

2)、@Resource(name="")可以用name指定加载的组件名称,和@Autowired不同,@Autowired默认按类型加载,必须和@Qualifier一起才可以指定名字。

3)、@Resource不可以和@Parimary连用,也不可以用@Autowired(required=false)。

4)、@Inject必须导入mvn包,也不可以用@Autowired(required=false)。

有需要的同学可以点击链接查看:

Spring源码从入门到精通---@Resource&@Inject(十二)

这篇文章主要介绍构造器和方法的自动装配:

@Autowired可以修饰:构造器Construct,参数parameter,方法method,注解属性annotation_type,field。不管在哪修饰,都是从IOC容器中取。

1)、放在方法上,可以放在set方法上测试(get不可以),常用的用法则是@Bean+方法参数,可以省略@Autowired,方法参数在IOC容器中获取组件。

2)、标注在构造器上,若只有一个有参构造器,则可以省略@Autowired。

3)、标注在参数上。

我们日常用常用的两个方法都是默认不写@Autowired的,但都是因为此注解,才获取到ioc容器中的bean。

一、在构造器中自动装配

写一个boss,boss里面定义一个之前写的car对象,注意car和boss都需要加上compoment注入容器,方便配置文件扫描。


/**
 * @author keying
 * 默认加载ioc容器中的组件,容器启动会调用无参构造器创建对象,在进行初始化赋值。
 */
@Component
public class Boss {

    private Car car;

    public Car getCar() {
        return car;
    }

    //@Autowired
    public Boss(@Autowired Car car) {
        System.out.println("构造器用的组件:" + car);
        this.car = car;
    }

    //@Autowired
    public void setCar(Car car) {
        System.out.println("方法上用的组件:" + car);
        this.car = car;
    }

    @Override
    public String toString() {
        return "Boss{" +
            "car=" + car +
            '}';
    }
}


@Component
public class Car {

    public Car(){
        System.out.println("car ... construct");
    }

    private void init(){
        System.out.println("car ... init");
    }

    private void destory(){
        System.out.println("car ... destory");
    }
}



配置文件加上@ComponentScan注解加上新的扫描包:com.alibaba.bean


@Configuration
@ComponentScan(value = {"com.alibaba.controller", "com.alibaba.service", "com.alibaba.dao", "com.alibaba.bean"})
public class ConfigOfAutowired {

  
}

写一个junitTest,获取Boss中的car,打印的看是否就是容器中的car。

 @Test
    public void test1() {
        //getBeanNames(applicationContext);

        //BookService bookService = applicationContext.getBean(BookService.class);
        //BookDao bookDao = applicationContext.getBean(BookDao.class);
        //System.out.println("bookService:" + bookService);
        //System.out.println("bookDao:" + bookDao);
        System.out.println("=============从容器中获取Boss中的car========");
        Boss boss = applicationContext.getBean(Boss.class);
        System.out.println("boss:" + boss);
        Car car = applicationContext.getBean(Car.class);
        System.out.println("car:" + car);
      

        applicationContext.close();
    }

从控制台打印结果可以看到,从boss中获取的car对象和IOC容器中是同一个对象@662ac478

二、在方法中自动装配

上面那个例子也可以看到从set方法中自动装配,这种因为很少见,所以就不仔细介绍,下面介绍bean注解注入对象,在方法上自动装配。

吧car类放入color类,并且这次color不用component注解注入容器,采用配置类里的@bean+传参方法。


public class Color {

    private Car car;

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    @Override
    public String toString() {
        return "Color{" +
            "car=" + car +
            '}';
    }
}

@Configuration
@ComponentScan(value = {"com.alibaba.controller", "com.alibaba.service", "com.alibaba.dao", "com.alibaba.bean"})
public class ConfigOfAutowired {

    /**
     * 没选择Compoment注入,选择Bean注入,并且参数会直接从IOC容器中获取
     *
     * @return color
     */
    @Bean
    public Color color(Car car) {
        Color color = new Color();
        color.setCar(car);
        return color;
    }
}
 @Test
    public void test1() {
        //getBeanNames(applicationContext);

        //BookService bookService = applicationContext.getBean(BookService.class);
        //BookDao bookDao = applicationContext.getBean(BookDao.class);
        //System.out.println("bookService:" + bookService);
        //System.out.println("bookDao:" + bookDao);
        System.out.println("=============从容器中获取Boss中的car========");
        Boss boss = applicationContext.getBean(Boss.class);
        System.out.println("boss:" + boss);
        Car car = applicationContext.getBean(Car.class);
        System.out.println("car:" + car);
        System.out.println("=============从Color中获取car");
        Color color = applicationContext.getBean(Color.class);
        System.out.println("color:" + color);

        applicationContext.close();
    }

junitTest运行之后打印可以看到,所有地方获取的car都是ioc容器中的,并且@Autowired注解可以省略。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端从入门到精通

你的鼓励是我最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值