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

引用外部属性文件:

当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中所有非字面量属性,但是有时候并不需要为全部属性赋值,所以,以上两种方式都不使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章