Spring框架的配置扩展是提高应用程序灵活性和可维护性的关键部分。通过不同的配置方法,我们可以更好地管理数据源、拆分配置文件、自动装配Bean以及控制Bean的作用域
1. 配置数据源
数据源配置是Spring应用程序中的关键部分,它直接影响到数据库操作的性能和管理
(1) 使用 properties
文件配置数据源
通过properties
文件配置数据源是最常见和简单的方式。这种方式可以集中管理数据库连接属性,易于维护和修改
- 步骤:
- 创建一个
application.properties
或database.properties
文件,用于存储数据库连接信息 - 在文件中定义数据源相关的属性:
url=jdbc:mysql://localhost:3306/数据库 username=root password=123456 driver=com.mysql.cj.jdbc.Driver
- 在Spring配置中,通过引入properties文件,并通过${}取值定义
DataSource
bean:<!-- 引入ProPerties文件--> <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <property name="location"> <value>classpath:database.properties</value> </property> </bean> <--Spring配置数据源--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </bean>
- 创建一个
(2) 使用 JNDI 配置数据源
Java Naming and Directory Interface (JNDI) 提供了一种标准的方式来配置和访问数据源。通常用于应用服务器中(如Tomcat、JBoss)来管理数据源连接
- 步骤:
- 在应用服务器中配置JNDI数据源。例如,在Tomcat中,你可以在
context.xml
中添加如下配置:<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource" maxTotal="20" maxIdle="10" maxWaitMillis="10000" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb" username="root" password="secret"/>
- 在Spring配置中,通过上下文路径定义一个
DataSource
bean,并通过JNDI查找数据源:<!-- JNDI--> <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jdbc/cvs_db</value> </property> </bean>
- 在应用服务器中配置JNDI数据源。例如,在Tomcat中,你可以在
2. 拆分Spring配置文件
在大型应用程序中,配置文件可能会变得非常庞大和复杂。通过拆分配置文件,可以提高可读性和维护性
- 步骤:
- 将不同的配置(如数据源配置、事务管理、Web配置等)拆分到不同的XML文件或Java配置类中
- 使用
<import>
标签在XML中导入其他配置文件:<import resource="classpath:applicationContext-dao.xml"/> <import resource="classpath:applicationContext-service.xml"/>
- 对于Java配置类,可以在主配置类中通过
@Import
注解导入其他配置类:@Configuration @Import({DataSourceConfig.class, ServiceConfig.class}) public class AppConfig { }
3. Bean的自动装配
自动装配是Spring的一个重要特性,用于简化Bean的依赖注入
随着业务发展,项目不断膨胀,工作量大大提升,此时就可以使用自动装配的方式来解决问题了,直接在Spring配置文件中配置:
<bean id="sysUserMapper" class="com.ktjy.mapper.impl.SysUserMapperImpl" autowire="byType" scope="singleton"/>
<bean id="sysUserService" class="com.ktjy.service.impl.SysUserServiceImpl" autowire="byName" scope="prototype"/>
autowire
属性
autowire
属性指定了Spring如何自动装配Bean的依赖关系。它有几个取值选项,每个选项都定义了不同的装配策略:
-
no
(默认值)- 描述:不进行自动装配,所有的依赖关系必须通过显式的
<property>
或<constructor-arg>
标签来设置 - 用例:用于需要完全控制依赖注入的情况
- 描述:不进行自动装配,所有的依赖关系必须通过显式的
-
byType
- 描述:根据Bean的类型进行自动装配。Spring会查找容器中匹配的Bean类型,并将其注入到目标Bean中
- 用例:当希望按照类型进行注入,并且有且只有一个符合类型的Bean时使用
-
byName
- 描述:根据Bean的名称进行自动装配。Spring会查找容器中与
<property>
指定的名称匹配的Bean,并将其注入到目标Bean中 - 用例:当Bean的名称确定且唯一时使用,适用于需要按照名称注入的情况
- 描述:根据Bean的名称进行自动装配。Spring会查找容器中与
-
constructor
- 描述:根据构造函数参数类型进行自动装配。Spring会根据构造函数参数的类型查找匹配的Bean进行注入
- 用例:用于构造函数注入,适合需要通过构造函数注入依赖的情况
-
autodetect
- 描述:Spring会首先尝试通过构造函数进行自动装配,如果没有找到合适的构造函数,则尝试使用按类型装配
- 用例:不常用,适合需要自动选择最佳装配方式的情况
4. Bean的作用域
Bean的作用域定义了Bean的生命周期和可见性
(1) 使用注解指定Bean的作用域
Spring支持多种Bean作用域,包括:
-
单例(Singleton):默认作用域,一个Spring容器中只存在一个Bean实例
@Component @Scope("singleton") public class MyService { }
-
原型(Prototype):每次请求都会创建一个新的Bean实例
@Component @Scope("prototype") public class MyService { }
-
请求(Request):每个HTTP请求都会创建一个新的Bean实例(用于Web应用)
@Component @Scope("request") public class MyService { }
-
会话(Session):每个HTTP会话都会创建一个新的Bean实例(用于Web应用)
@Component @Scope("session") public class MyService { }
-
应用(Application):在ServletContext范围内只有一个Bean实例(通常在Web应用中用于跨多个请求共享状态)
@Component @Scope("application") public class MyService { }
合理配置Bean的作用域,可以优化资源使用和性能,确保应用程序的正确性和效率