Spring中bean底层读取配置文件的原理

新建接口UserService

/** 

* @author 作者 Your-Name: 

* @version 创建时间:2019年8月26日 下午1:39:59 

* 类说明 

*/ 
package com.sumeng.server;

/**
 * @author Administrator
 *
 */
public interface UserService {
	public void save();
}

新建UserServiceImpl

/** 

* @author 作者 Your-Name: 

* @version 创建时间:2019年8月26日 下午1:39:07 

* 类说明 

*/ 
package com.sumeng.serverImpl;

import com.sumeng.dao.UserDao;
import com.sumeng.server.UserInfo;

import maven.BeanFactroy;

/**
 * @author Administrator
 *
 */
public class UserServerImpl implements UserInfo{
	//这里UserDao相当bean.proper中key所队形的value
	private UserDao user = (UserDao)BeanFactroy.getBean("userDao");
	@Override
	public void save() {
		user.save();
	}

}

新建接口UserDao

/** 

* @author 作者 Your-Name: 

* @version 创建时间:2019年8月26日 下午1:44:19 

* 类说明 

*/ 
package com.sumeng.dao;

/**
 * @author Administrator
 *
 */
public interface UserDao {

	public void save();
}

新建UserDaoImpl

/** 

* @author 作者 Your-Name: 

* @version 创建时间:2019年8月26日 下午1:43:45 

* 类说明 

*/ 
package com.sumeng.daoImpl;

import com.sumeng.dao.UserDao;

/**
 * @author Administrator
 *
 */
public class UserDaoImpl implements UserDao{

	/* (非 Javadoc)
	 * @see com.sumeng.dao.UserDao#save()
	 */
	@Override
	public void save() {
		System.out.println("用户保存方法!!!");
		
	}

}

创建文件bean.properties

userService = com.sumeng.serverImpl.UserServerImpl
userDao = com.sumeng.daoImpl.UserDaoImpl

新建BeanFactroy(多列模式)

/** 

* @author 作者 Your-Name: 

* @version 创建时间:2019年8月26日 下午2:02:22 

* 类说明 

*/ 
package maven;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @author Administrator
 *
 */
public class BeanFactroy {
	private static Properties pr;
	
	static{
		pr = new Properties();
		
		InputStream in = BeanFactroy.class.getClassLoader().getResourceAsStream("bean.properties");
		try {
			pr.load(in);
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException();
		}
	
	}
	//获取对象
	public static Object getBean(String beanName){
		//根据beanNam获取全类名
		String className = pr.getProperty(beanName);
		//获取到全类名之后再通过反射创建
		Object obj = null;
		try {
			Class clazz = Class.forName(className);//要有无参构造方法
			obj = clazz.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return obj;
		
	}
}

新建BeanFactroy(单列模式)

/** 

* @author 作者 Your-Name: 

* @version 创建时间:2019年8月26日 下午2:02:22 

* 类说明 

*/ 
package maven;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

/**
 * @author Administrator
 *
 */
public class BeanFactroy {
	private static Properties pr;
	
	private static Map<String,Object> beans;
	
	static{
		pr = new Properties();
		InputStream in = BeanFactroy.class.getClassLoader().getResourceAsStream("bean.properties");
		try {
			pr.load(in);
			//加载完配置文件后 直接将配置文件中的信息创建为对象  存入到map中
			beans = new HashMap<String,Object>();
			//存储配置文件中的key
			Set<Object> keySet = pr.keySet();
			for (Object obj : keySet) {
				//配置文件中所有的key
				String key = (String)obj;
				//根据key获取到value  
				String className = pr.getProperty(key);
				//得到字节码文件
				Class clazz = Class.forName(className);
				//创建对象
				Object bean = clazz.newInstance();
				beans.put(key, bean);
				
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException();
		}
	
	}
	//获取对象
	public static Object getBean(String beanName){
		return beans.get(beanName);	
	}
}

测试类

/** 

* @author 作者 Your-Name: 

* @version 创建时间:2019年8月26日 下午1:33:25 

* 类说明 

*/ 
package maven;

import com.sumeng.server.UserInfo;
import com.sumeng.serverImpl.UserServerImpl;

/**
 * @author Administrator
 *
 */
public class JdbcDemo {

	public static void main(String[] args) {
		UserInfo user = (UserInfo)BeanFactroy.getBean("userService");
		user.save();
	}
}

结果图

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值