前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自动装配构造器&方法---Spring源码从入门到精通(十三)

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

作者头像
用户9919783
发布2022-07-26 11:41:30
1950
发布2022-07-26 11:41:30
举报
文章被收录于专栏:后端从入门到精通

上篇文章主要介绍了@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注入容器,方便配置文件扫描。

代码语言:javascript
复制
 
/**
 * @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

代码语言:javascript
复制
 
@Configuration
@ComponentScan(value = {"com.alibaba.controller", "com.alibaba.service", "com.alibaba.dao", "com.alibaba.bean"})
public class ConfigOfAutowired {
 
  
}

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

代码语言:javascript
复制
 @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+传参方法。

代码语言:javascript
复制
 
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 +
            '}';
    }
}
代码语言:javascript
复制
 
@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;
    }
}
代码语言:javascript
复制
 @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注解可以省略。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端从入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、在方法中自动装配
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档