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

简介: 自动装配构造器&方法---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

image.png


二、在方法中自动装配


上面那个例子也可以看到从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注解可以省略。

image.png

相关文章
|
16天前
|
人工智能 Java API
Spring AI 实战|Spring AI入门之DeepSeek调用
本文介绍了Spring AI框架如何帮助Java开发者轻松集成和使用大模型API。文章从Spring AI的初探开始,探讨了其核心能力及应用场景,包括手动与自动发起请求、流式响应实现打字机效果,以及兼容不同AI服务(如DeepSeek、通义千问)的方法。同时,还详细讲解了如何在生产环境中添加监控以优化性能和成本管理。通过Spring AI,开发者可以简化大模型调用流程,降低复杂度,为企业智能应用开发提供强大支持。最后,文章展望了Spring AI在未来AI时代的重要作用,鼓励开发者积极拥抱这一技术变革。
494 71
Spring AI 实战|Spring AI入门之DeepSeek调用
|
2月前
|
安全 Java 数据库
Spring Security 实战指南:从入门到精通
本文详细介绍了Spring Security在Java Web项目中的应用,涵盖登录、权限控制与安全防护等功能。通过Filter Chain过滤器链实现请求拦截与认证授权,核心组件包括AuthenticationProvider和UserDetailsService,负责用户信息加载与密码验证。文章还解析了项目结构,如SecurityConfig配置类、User实体类及自定义登录逻辑,并探讨了Method-Level Security、CSRF防护、Remember-Me等进阶功能。最后总结了Spring Security的核心机制与常见配置,帮助开发者构建健壮的安全系统。
175 0
|
2月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
269 70
|
9天前
|
Java 关系型数据库 MySQL
【Spring】【事务】初学者直呼学会了的Spring事务入门
本文深入解析了Spring事务的核心概念与使用方法。Spring事务是一种数据库事务管理机制,通过确保操作的原子性、一致性、隔离性和持久性(ACID),维护数据完整性。文章详细讲解了声明式事务(@Transactional注解)和编程式事务(TransactionTemplate、PlatformTransactionManager)的区别与用法,并探讨了事务传播行为(如REQUIRED、REQUIRES_NEW等)及隔离级别(如READ_COMMITTED、REPEATABLE_READ)。
74 1
|
2月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
198 5
|
2月前
|
Java Spring 容器
两种Spring Boot 项目启动自动执行方法的实现方式
在Spring Boot项目启动后执行特定代码的实际应用场景中,可通过实现`ApplicationRunner`或`CommandLineRunner`接口完成初始化操作,如系统常量或配置加载。两者均支持通过`@Order`注解控制执行顺序,值越小优先级越高。区别在于参数接收方式:`CommandLineRunner`使用字符串数组,而`ApplicationRunner`采用`ApplicationArguments`对象。注意,`@Order`仅影响Bean执行顺序,不影响加载顺序。
111 2
|
4月前
|
人工智能 自然语言处理 Java
Spring 集成 DeepSeek 的 3大方法(史上最全)
DeepSeek 的 API 接口和 OpenAI 是兼容的。我们可以自定义 http client,按照 OpenAI 的rest 接口格式,去访问 DeepSeek。自定义 Client 集成DeepSeek ,可以通过以下步骤实现。步骤 1:准备工作访问 DeepSeek 的开发者平台,注册并获取 API 密钥。DeepSeek 提供了与 OpenAI 兼容的 API 端点(例如),确保你已获取正确的 API 地址。
Spring 集成 DeepSeek 的 3大方法(史上最全)
|
2月前
|
存储 安全 Java
Spring Security 入门与详解
Spring Security 是 Spring 框架中的核心安全模块,提供认证、授权及防护功能。本文详解其核心概念,包括认证(Authentication)、授权(Authorization)和过滤器链(Security Filter Chain)。同时,通过代码示例介绍基本配置,如 PasswordEncoder、UserDetailsService 和自定义登录页面等。最后总结常见问题与解决方法,助你快速掌握 Spring Security 的使用与优化。
287 0
|
6月前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
247 73
|
3月前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。