Spring学习(四)引用外部属性文件、自动装配

本文介绍在Spring框架中如何使用属性文件进行bean配置,包括通过properties文件配置数据库连接信息的方法,以及如何利用自动装配简化bean属性的设置。探讨了不同自动装配模式的适用场景和限制。

引用外部属性文件:

当bean的配置信息逐渐增多时,查找和修改一些bean的配置信息变得更加困难。这时,可以将一部分信息提取到bean配置文件的外部,以properties格式的属性文件保存起来,同时在bean的配置文件中引用properties属性文件中的内容,从而实现一部分属性值在发生变化时只修改properties文件即可。这种技术多用于连接数据库的基本信息的配置

以连接数据库的基本信息的配置为例:

①导入druid的jar包和mysql驱动

 

②新建datesource.xml文件

 

	<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource" p:driverClassName="com.mysql.jdbc.Driver"
	p:url="jdbc:mysql://localhost:3306/test" p:username="ztt" p:password=123">
	</bean>

测试类:

package com.ztt.spring;

import java.sql.SQLException;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.alibaba.druid.pool.DruidDataSource;

public class Test {
	public static void main(String[] args) throws SQLException{
		ApplicationContext ac = new ClassPathXmlApplicationContext("datasource.xml");
		DruidDataSource bean = ac.getBean("datasource",DruidDataSource.class);
		System.out.println(bean.getConnection());
	}
}

运行结果:

com.mysql.jdbc.JDBC4Connection@5b6feec0

或者以properties方式配置,新建一个db.properties文件:

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/test
jdbc.username = ztt
jdbc.password = 123

①通过bean标签加载资源文件,${}从spring加载的资源文件中通过键获得值

	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="db.properties"></property>
	</bean>
	
	<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="${jdbc.driver}"></property>
		<property name="url" value="${jdbc.url}"></property>
		<property name="username" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>

②通过context标签加载资源文件,设置资源文件路径(需引入context标签)

	<context:property-placeholder location="db.properties"/>
	<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="${jdbc.driver}"></property>
		<property name="url" value="${jdbc.url}"></property>
		<property name="username" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>

自动装配(属性必须是非字面量的属性):

概念:

①以value或ref的方式明确指定属性值都是手动装配

②根据指定的装配规则,不需要明确指定,Spring自动将匹配的属性值注入bean中

装配模式(autowire属性,取值有byType和byName):

①根据类型(byType)自动装配:将类型匹配的bean作为属性注入到另一个bean中,若IOC容器中有多个与目标bean类型一致的bean,Spring将无法判断哪个bean最适合该属性,所以不能执行自动装配

②根据名称(byName)自动装配:必须将目标bean的名称和属性名设置的完全相同

③通过构造器自动装配:当bean中存在多个构造器时,此种自动装配方式将会很复杂,不推荐使用

示例:

根据类型(byType),需注意类型兼容问题,bean管理的对象可以给父类赋值,也可以给实现的接口赋值:

	<bean id="ccc" class="com.ztt.spring.Car" p:brand="Audi" p:price="888888"></bean>
	<bean id="person" class="com.ztt.spring.Person" autowire="byType">
		<property name="name" value="ztt"></property>
		<property name="age" value="18"></property>
	</bean>

根据名称(byName):

	<bean id="car" class="com.ztt.spring.Car" p:brand="Audi" p:price="888888"></bean>
	<bean id="person" class="com.ztt.spring.Person" autowire="byName">
		<property name="name" value="ztt"></property>
		<property name="age" value="18"></property>
	</bean>

因为Person类中有一个属性名为car,所以必须有一个id为car的bean

问题:

当设置autowire属性,会作用于该bean中所有非字面量属性,但是有时候并不需要为全部属性赋值,所以,以上两种方式都不使用

<think>嗯,用户问的是Spring自动装配Spring Boot自动装配的区别,以及它们的原理和配置。首先,我需要回忆一下两者的基本概念。Spring框架的自动装配应该是指通过XML或者注解的方式来自动注入依赖,而Spring Boot的自动装配可能更高级,利用条件化配置之的机制。 记得Spring自动装配主要在应用上下文中处理bean的依赖,比如使用@Autowired注解或者XML中的autowire属性。而Spring Boot可能是在这个基础上做了扩展,比如通过@EnableAutoConfiguration和spring.factories文件来加载配置。这样Boot可以自动配置很多默认的设置,减少手动配置。 然后,要区分它们的原理。Spring自动装配可能依赖于组件扫描和显式的配置,而Boot可能使用条件注解(比如@ConditionalOnClass)来判断路径下是否有特定的,从而决定是否装配某个bean。这样Boot能够根据依赖自动配置,比如当引入Spring Data JPA的starter时,自动配置数据源和EntityManager。 配置方式上,Spring可能需要写很多的XML或者Java配置,而Boot通过starter依赖和application.properties/yaml文件简化配置。另外,Spring Boot的自动装配是通过Spring Factories Loader机制,也就是在META-INF/spring.factories中定义的配置来实现的,而Spring本身可能没有这种机制。 还需要考虑它们的应用场景。Spring自动装配适用于需要精细控制bean装配的情况,而Boot的自动装配适合快速启动项目,减少样板配置。可能还要提到Spring Boot的自动装配是建立在Spring框架的基础上的,是对其的优化和扩展,比如通过条件化配置和starter POMs。 还要确认一下引用资料,用户提供的引用中提到Spring Boot通过SPI方式优化了自动装配,而Spring Framework本身已经有自动装配功能。需要结合这些引用内容来组织回答,确保准确。 可能需要分点比较,比如定义与定位、核心原理、配置方式、应用场景,每个部分对比两者的不同。同时,要确保使用正确的中文术语,比如“条件化配置”、“SPI机制”、“starter依赖”等。 最后,生成相关问题的时候,要围绕自动装配的深层原理、优化方法、实际应用等,帮助用户进一步理解。比如问条件化装配的原理,或者如何自定义自动配置。</think>### Spring自动装配 vs Spring Boot自动装配对比分析 #### 一、**定义与定位** 1. **Spring自动装配** 是Spring Framework的核心功能,通过依赖注入(DI)实现组件间的自动关联,基于XML配置或注解(如`@Autowired`)显式声明依赖关系。例如: ```xml <bean id="service" class="com.example.Service" autowire="byType"/> ``` 或通过注解: ```java @Autowired private Dependency dependency; ``` 其核心目标是减少手动配置,但需开发者主动定义Bean及其依赖[^1]。 2. **Spring Boot自动装配** 在Spring Framework的基础上,通过**条件化配置**和**约定优于配置**原则,自动加载默认配置。例如,引入`spring-boot-starter-web`依赖后,自动配置Tomcat、Spring MVC等组件。其核心目标是实现**零配置启动**,通过`@EnableAutoConfiguration`触发[^2]。 --- #### 二、**核心原理对比** | 特性 | Spring自动装配 | Spring Boot自动装配 | |---------------------|----------------------------------------|---------------------------------------------| | **实现机制** | 基于Bean定义和显式依赖注入 | 基于条件注解(如`@ConditionalOnClass`)和SPI机制 | | **配置加载方式** | 手动定义XML/Java配置或组件扫描 | 通过`META-INF/spring.factories`自动加载配置 | | **依赖管理** | 需手动管理依赖版本 | 通过Starter POM统一管理依赖和版本 | | **灵活性** | 高(需精细控制Bean) | 中(默认配置可覆盖) | --- #### 三、**配置方式差异** 1. **Spring自动装配** - **XML配置**:显式定义Bean及其依赖关系。 - **注解驱动**:使用`@ComponentScan` + `@Autowired`组合。 - 需要开发者主动编写配置或XML文件。 2. **Spring Boot自动装配** - **条件化配置**:通过`@Conditional`系列注解动态判断是否加载Bean(例如:仅当路径存在`DataSource`时配置数据库连接池)。 - **Starter依赖**:例如`spring-boot-starter-data-jpa`自动引入Hibernate、JPA相关依赖。 - **外部化配置**:通过`application.properties`/`application.yml`覆盖默认配置。 --- #### 、**应用场景** - **Spring自动装配**:适用于需要**精细控制Bean生命周期和依赖关系**的场景,如定制化企业级应用。 - **Spring Boot自动装配**:适用于**快速构建微服务或标准化应用**,例如REST API开发、云原生应用[^2]。 --- #### 五、**关键代码示例** Spring Boot自动配置片段: ```java @Configuration @ConditionalOnClass(DataSource.class) public class DataSourceAutoConfiguration { @Bean @ConditionalOnMissingBean public DataSource dataSource() { return new HikariDataSource(); } } ``` 此配置仅在路径存在`DataSource`时生效,且未手动定义`DataSource` Bean时自动创建。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值