程序的耦合

  耦合:程序间的依赖关系

    包括:

      类之间的依赖

      方法间的依赖

  解耦:

    降低程序间的依赖关系

  在实际开发中:

    应该做到,编译期不依赖,运行时才依赖

  解耦思路:

    第一步:使用反射来创建对象,而避免使用new关键词

    第二步:通过读取配置文件来获取要创建的对象全限定类名


创建BeanFactory  

 /**
* 一个创建Bean对象的工厂
*
* Bean:在计算机英语中,有可重用组件的含义
* JavaBean:用java语言编写的可重用组件
* javabean > 实体类
*
* 它就是创建我们的service的dao对象的
* 第一个:需要一个配置文件来配置我们的service和dao
* 配置的内容:唯一标识=全限定类名
* 第二个:通过读取配置文件中配置的内容,反射创建对象
*
* 配置文件可以是xml也可以是properties
*
*/
public class BeanFactory { //定义一个Properties对象
private static Properties props; //使用静态代码块为Properties对象赋值
static {
try {
//实例化对象
props = new Properties();
//获取properties文件的流对象,创建在resources文件夹下的properties文件会成为类根路径下的文件,不用写包名
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
props.load(in);
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化properties失败");
}
} /**
* 根据Bean的名称获取bean对象
* @param beanName
* @return
*/
public static Object getBean(String beanName){
Object bean = null;
try{
String beanPath = props.getProperty(beanName);
System.out.println(beanPath);
bean = Class.forName(beanPath).newInstance();
}catch (Exception e){
e.printStackTrace();
}
return bean;
} }

调用BeanFactory,反射创建对象

 /**
* 账户业务层实现类
*/
public class AccountServiceImpl implements IAccountService { //private IAccountDao accountDao = new AccountDaoImpl();
private IAccountDao accountDao = (IAccountDao) BeanFactory.getBean("accountDao"); public void saveAccount(){
accountDao.saveAccount();
}
}
 /**
* 模拟一个表现层,用于调用业务层
*/
public class Client { public static void main(String[] args) {
// IAccountService accountService = new AccountServiceImpl();
IAccountService accountService = (IAccountService) BeanFactory.getBean("accountService");
accountService.saveAccount();
}
}

最新文章

  1. POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次
  2. git 使用 总结
  3. SQL优化注意事项
  4. Atitti.java android反编译解决方案-----虚拟机方案
  5. ActiveMQ学习(三)——MQ的通讯模式
  6. automapper初步
  7. windows 下双网卡在不同网络切换设置
  8. C# IList<T>转为DataTable
  9. 引用js或css后加?v= 版本号的用法(转)
  10. backboneJS 使用心得(2)view和model事件的多次绑定(转载)
  11. stylus or less ?
  12. 转 通过 spring 容器内建的 profile 功能实现开发环境、测试环境、生产环境配置自动切换
  13. python--DenyHttp项目(2)--ACM监考服务器端
  14. 根据Dockerfile创建docker dotnet coer 镜像
  15. angular.isString()
  16. SX_WIN10X64LTSB2016_EN_LITE英文精简版
  17. cmd下的一些小技巧
  18. iOS -- Effective Objective-C 阅读笔记 (1)
  19. 判断当前的Activity的是否处于栈顶
  20. 改BUG方法

热门文章

  1. ASP.Net调整允许上传文件的大小
  2. cocos2dx触摸响应
  3. php中heredoc使用方法
  4. 2019-11-7-C#-dotnet-线程不安全的弱引用缓存
  5. (转) Vultr能Ping但是SSH无法连接
  6. 几道关于this的经典练习题的理解与分析
  7. linux 系统优化初始化配置
  8. MongDB4.1-入门学习之下载安装配置
  9. leetcode-80-删除排序数组中的重复项②
  10. 廖雪峰Java14Java操作XML和JSON-2JSON-1Json介绍