通过@PropertySource可以指定读取的配置文件,通过@Value注解获取值,具体用法见案例代码中的注释!

这里我们以初始化数据源dataSource为例来演示

工程目录


阿里巴巴开源的Durid数据源配置文件

=========================druidConfig.properties================================

driverClassName=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/schooldb
duridUserName=root
password=123456
#配置监控统计拦截的filters,去掉后监控界面sql无法统计
filters=stat
#配置初始化大小 
initialSize=6
#配置初始化最大连接数 
maxActive=20
#配置最小空闲连接数 
minIdle=3
#配置获取连接等待超时的时间,1分钟 
maxWait=60000
#检测连接是否有效的SQL 
validationQuery=SELECT 'x'
#申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效 
testWhileIdle=true
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 
testOnBorrow=false
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 
testOnReturn=false
#启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true 
maxPoolPreparedStatementPerConnectionSize=20
#对于长时间不使用的连接强制关闭 
removeAbandoned=true
#超过30秒的空闲连接就可以被关闭了,单位是秒 
removeAbandonedTimeout=30
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 
timeBetweenEvictionRunsMillis=10000
#配置一个连接在池中最小生存的时间,单位是毫秒 
minEvictableIdleTimeMillis=30000
配置类

===============================SpringConfig.java=========================

package com.wx.config;

import java.sql.SQLException;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import com.alibaba.druid.pool.DruidDataSource;
import com.wx.dao.IUserDao;
import com.wx.dao.UserDaoImpl;

//通过该注解来表明该类是一个Spring的配置,相当于一个传统的ApplicationContext.xml
@Configuration
// 相当于配置文件里面的<context:component-scan/>标签
@ComponentScan(basePackages = "com.wx.dao,com.wx.biz")
//@PropertySource用来读取外部资源文件
//ignoreResourceNotFound表示忽略没读到的资源文件
@PropertySource(value = { "classpath:druidConfig.properties",
		"classpath:jdbc.properties" }, ignoreResourceNotFound = true)
public class SpringConfig {
	//Value注解用来获取属性的值
	@Value("${driverClassName}")
	private String driverClassName;
	@Value("${url}")
	private String url;
	@Value("${duridUserName}")
	private String username;
	@Value("${password}")
	private String password;
	@Value("${filters}")
	private String filters;
	@Value("${initialSize}")
	private int initialSize;
	@Value("${maxActive}")
	private int maxActive;
	@Value("${minIdle}")
	private int minIdle;
	@Value("${maxWait}")
	private int maxWait;
	@Value("${validationQuery}")
	private String validationQuery;
	@Value("${testWhileIdle}")
	private boolean testWhileIdle;
	@Value("${testOnBorrow}")
	private boolean testOnBorrow;
	@Value("${testOnReturn}")
	private boolean testOnReturn;
	@Value("${maxPoolPreparedStatementPerConnectionSize}")
	private int maxPoolPreparedStatementPerConnectionSize;
	@Value("${removeAbandoned}")
	private boolean removeAbandoned;
	@Value("${removeAbandonedTimeout}")
	private int removeAbandonedTimeout;
	@Value("${timeBetweenEvictionRunsMillis}")
	private int timeBetweenEvictionRunsMillis;
	@Value("${minEvictableIdleTimeMillis}")
	private int minEvictableIdleTimeMillis;
	
	@Bean(initMethod="init",destroyMethod="close")
	public DruidDataSource dataSource(){
		DruidDataSource dataSource=new DruidDataSource();
		try {
			dataSource.setUrl(url);
			dataSource.setDriverClassName(driverClassName);
			dataSource.setUsername(username);
			dataSource.setPassword(password);
			dataSource.setFilters(filters);
			dataSource.setInitialSize(initialSize);
			dataSource.setMaxActive(maxActive);
			dataSource.setMinIdle(minIdle);
			dataSource.setMaxWait(maxWait);
			dataSource.setValidationQuery(validationQuery);
			dataSource.setTestWhileIdle(testWhileIdle);
			dataSource.setTestOnBorrow(testOnBorrow);
			dataSource.setTestOnReturn(testOnReturn);
			dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
			dataSource.setRemoveAbandoned(removeAbandoned);
			dataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout);
			dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
			dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
			System.out.println("数据源初始化成功!");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return dataSource;
	}
}
特别注意:资源文件中的duridUserName=root   不能写成userName=root,否则会取到操作系统的登录用户名!

pom配置

==========================pom.xml==================================

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.wx</groupId>
	<artifactId>bootpre02</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.3.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.3.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.3.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>4.3.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		<dependency>
		<!-- 阿里巴巴druid数据源 -->
	    <groupId>com.alibaba</groupId>
		    <artifactId>druid</artifactId>
		    <version>1.0.9</version>
		</dependency>
		<dependency>
	    	<groupId>mysql</groupId>
	    	<artifactId>mysql-connector-java</artifactId>
	    <version>5.1.26</version>
	</dependency>
	</dependencies>
	<build>
		<finalName>${project.artifactId}</finalName>
		<plugins>
			<!-- 资源文件拷贝插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<configuration>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<!-- java编译插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>

	</build>

</project>


实体类

==============================UserEntity.java=====================

package com.wx.entitys;

import java.io.Serializable;

public class UserEntity implements Serializable {
	private static final long serialVersionUID = 1034088741557780953L;
	private Integer userId;
	private String userName;
	private String passWord;
	private String email;
	
	
	public UserEntity() {
	}
	public UserEntity(String userName, String passWord) {
		super();
		this.userName = userName;
		this.passWord = passWord;
	}
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassWord() {
		return passWord;
	}
	public void setPassWord(String passWord) {
		this.passWord = passWord;
	}
	
	public void setEmail(String email) {
		this.email = email;
	}
	
	public String getEmail() {
		return email;
	}
}
dao层代码

=========================================UserDaoImpl.java==========================

package com.wx.dao;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.wx.entitys.UserEntity;

@Component("userDao")
public class UserDaoImpl implements IUserDao {
	
	@Autowired
	private DataSource dataSource;
	
	public List<UserEntity> queryUserList(){
        List<UserEntity> userList = new ArrayList<UserEntity>();
        Connection conn=null;
        try {
			conn=dataSource.getConnection();
			PreparedStatement psmt=conn.prepareStatement("select * from users");
			ResultSet rs=psmt.executeQuery();
			UserEntity user=null;
			while(rs.next()){
				user=new UserEntity();
				user.setUserId(rs.getInt("userId"));
				user.setUserName(rs.getString("userName"));
				user.setPassWord(rs.getString("passWord"));
				user.setEmail(rs.getString("email"));
				userList.add(user);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(conn!=null){
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
        return userList;
    }

}
业务层代码

=============================UserBiz.java=========================

package com.wx.biz;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.wx.dao.IUserDao;
import com.wx.entitys.UserEntity;

@Service
public class UserBiz {
	//Autowired默认根据类型进行装配,Qualifier根据名称装配
	@Autowired
	@Qualifier("userDao")
	private IUserDao userDao;
	
	public List<UserEntity> queryUserList(){
		return userDao.queryUserList();
	}
}

测试类

==================TestConfig01.java==============================

package com.wx.test;

import java.util.List;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.wx.biz.UserBiz;
import com.wx.config.SpringConfig;
import com.wx.entitys.UserEntity;

public class TestConfig01 {
	public static void main(String[] args) {
		//通过java配置来实例化spring容器
		AnnotationConfigApplicationContext ctx=
				new AnnotationConfigApplicationContext(SpringConfig.class);
		//在spring容器中获取bean对象
		//名称userBiz是注解根据类UserBiz自动生成的
		UserBiz userBiz=(UserBiz)ctx.getBean("userBiz");
		//或者采取下面的方式
		//UserBiz userBiz=(UserBiz)ctx.getBean(UserBiz.class);
		List<UserEntity> userList=userBiz.queryUserList();
		for(UserEntity user:userList){
			System.out.print(user.getUserId());
			System.out.print("\t"+user.getUserName());
			System.out.print("\t"+user.getPassWord());
			System.out.println("\t"+user.getEmail());
		}
		try {
			Thread.sleep(100000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//销毁容器
		ctx.destroy();
	}
}
运行结果如下图



可以从sqlyog界面观察数据源是否正常启动

如果本文帮助到了您,请点个赞吧!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐