03

/**
*   Java连接mysql数据库
*/
package com.test;
import java.sql.*;
public class Test{/*** 程序的耦合*       耦合:程序间的依赖关系*             包括:类之间的依赖关系*                  方法之间的依赖关系*         解耦:降低程序间的依赖关系*       实际开发中,应当做到编译器不依赖,运行期才依赖*      解耦的思路:*          第一步:使用反射机制来创建对象,而避免使用new关键字*          第二步:通过读取配置文件爱你来获取要创建的对象全限定名*/public static void main(String[] args) throws Exception{//1.注册驱动//   DriverManager.registerDriver(new com.mysql.jdbc.Driver());//使用反射创建对象,仅依赖字符串,而不依赖具体的对象,但是字符串写死了,若想其他的数据库不方便Class.forName("com.mysql.jdbc.Driver");//2.获取连接Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/xiaonei","root","tingwei");//3.获取操作数据库预处理对象PreparedStatement pstm=conn.prepareStatement("select * from stu");//4.执行sqlResultSet rs=pstm.executeQuery();//5.遍历获取结果while(rs.next()){System.out.println(rs.getString("sname")+" "+rs.getFloat("score"));}//6.释放资源rs.close();pstm.close();conn.close();}
}

04

/*** 展示表现层业务层持久层的强依赖关系*/
package com.test;
/*** 模拟一个表现层,用户调用业务层* @author Administrator**/
public class Test{public static void main(String[] args){IAccountService as=new AccountServiceImp();as.saveAccount();}
}interface IAccountService{/*** 模拟保存账户*/void saveAccount();
}/*** 业务层实现类*/
class AccountServiceImp implements IAccountService{private IAccountDao accountDao=new AccountDaoImp();public void saveAccount(){accountDao.saveAccount();}
}
/*** 账户的持久层接口*/
interface IAccountDao{/*** 模拟保存账户*/void saveAccount();
}/** 账户的持久层实现类,若没有编译器马上报错*/
class AccountDaoImp implements IAccountDao{public void saveAccount(){System.out.println("保存了账户");}
}

0506编写工厂类和配置文件

/*** 展示表现层业务层持久层的强依赖关系*/
package com.test;import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;/*** 模拟一个表现层,用户调用业务层* @author Administrator**/
public class Test{public static void main(String[] args){//IAccountService as=new AccountServiceImp();IAccountService as=(IAccountService)BeanFactory.getBean("accountServerice");as.saveAccount();}
}
/*** 创建bean对象的工厂* Bean 在计算机术语中,含义为可重用组件* JavaBean,用java语言编写的可重用组件*        JavaBean >实体类*       具体到项目中,就是service和dao对象*      第一个:配置一个文件来配置service和dao,配置的内容是唯一标识的权限定内名*        第二个:通过读取配置文件内容,反射创建对象* *      配置文件可以是propertie也可以使xml*/
class BeanFactory{private static Properties props;static{try {props=new Properties();//InputStream in=new FileInputStream();InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");props.load(in);} catch (Exception e) {// TODO: handle exceptionthrow 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) {// TODO: handle exceptione.printStackTrace();}return bean;}
}
interface IAccountService{/*** 模拟保存账户*/void saveAccount();
}/*** 业务层实现类*/
class AccountServiceImp implements IAccountService{//private IAccountDao accountDao=new AccountDaoImp();private IAccountDao accountDao = (IAccountDao)BeanFactory.getBean("accountDao");private int i=1;public void saveAccount(){accountDao.saveAccount();System.out.println(i);i++;}
}
/*** 账户的持久层接口*/
interface IAccountDao{/*** 模拟保存账户*/void saveAccount();
}/** 账户的持久层实现类,若没有编译器也不会报错*/
class AccountDaoImp implements IAccountDao{public void saveAccount(){System.out.println("保存了账户");}
}

com.test.AccountServiceImp
com.test.AccountDaoImp
com.test.AccountServiceImp@1a8c4e7
保存了账户
1
com.test.AccountServiceImp
com.test.AccountDaoImp
com.test.AccountServiceImp@1172e08
保存了账户
1
com.test.AccountServiceImp
com.test.AccountDaoImp
com.test.AccountServiceImp@cf2c80
保存了账户
1

07分析工厂模式中存在的问题并改造,单例


/*** 展示表现层业务层持久层的强依赖关系*/
package com.test;import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;/*** 模拟一个表现层,用户调用业务层* @author Administrator**/
public class Test{public static void main(String[] args){//IAccountService as=new AccountServiceImp();//   IAccountService as=(IAccountService)BeanFactory.getBean("accountServerice");//   as.saveAccount();//证明as对象是多例的for(int i=0;i<3;i++){IAccountService as=(IAccountService)BeanFactory.getBean("accountServerice");System.out.println(as);as.saveAccount();}}
}
/*** 创建bean对象的工厂* Bean 在计算机术语中,含义为可重用组件* JavaBean,用java语言编写的可重用组件*        JavaBean >实体类*       具体到项目中,就是service和dao对象*      第一个:配置一个文件来配置service和dao,配置的内容是唯一标识的权限定内名*        第二个:通过读取配置文件内容,反射创建对象* *      配置文件可以是propertie也可以使xml*/
class BeanFactory{private static Properties props;//定义个Map,用于存放创建的对象,称之为容器private static Map<String, Object> beans;static{try {//实例化对象props=new Properties();//InputStream in=new FileInputStream();//获取properties文件的流对象InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");props.load(in);//实例化容器beans = new HashMap<String, Object>();//取出配置文件中所有的keyEnumeration<Object> keys = props.keys();//遍历枚举while(keys.hasMoreElements()){//取出keyString key = keys.nextElement().toString();//根据key获取valueString beanPath = props.getProperty(key);//反射创建对象Object value = Class.forName(beanPath).newInstance();//把key-value存入容器中beans.put(key, value);}} catch (Exception e) {// TODO: handle exceptionthrow new ExceptionInInitializerError("初始化properties失败");}}/*** 根据bean名称获取bean对象,单例* @param beanName* @return*/public static Object getBean(String beanName){return beans.get(beanName);}/*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) {// TODO: handle exceptione.printStackTrace();}return bean;}*/
}
interface IAccountService{/*** 模拟保存账户*/void saveAccount();
}/*** 业务层实现类*/
class AccountServiceImp implements IAccountService{//private IAccountDao accountDao=new AccountDaoImp();private IAccountDao accountDao = (IAccountDao)BeanFactory.getBean("accountDao");private int i=1;public void saveAccount(){System.out.println(accountDao);accountDao.saveAccount();System.out.println(i);i++;}
}
/*** 账户的持久层接口*/
interface IAccountDao{/*** 模拟保存账户*/void saveAccount();
}/** 账户的持久层实现类,若没有编译器也不会报错*/
class AccountDaoImp implements IAccountDao{public void saveAccount(){System.out.println("保存了账户");}
}

com.test.AccountServiceImp@1172e08
null
Exception in thread “main” java.lang.NullPointerException
at com.test.AccountServiceImp.saveAccount(Test.java:115)
at com.test.Test.main(Test.java:29)


spring5.0学习笔记1相关推荐

  1. mysql5.0镜像_Mysql5.0学习笔记(一)

    Mysql5.0学习笔记(一) -基本sql语句与支持字符集 1.登录 mysql -h localhost -u root 2.创建用户firstdb(密码firstdb)和数据库,并赋予权限于fi ...

  2. Zabbx6.0(学习笔记)

    Zabbx6.0(学习笔记) 目录导航 Zabbx6.0(学习笔记) 一.为什么 需要监控系统 二.如何选择监控 三.Zabbix概述 四.Zabbix安装哪个版本? Zabbix安装要求 1.硬件 ...

  3. flink1.12.0学习笔记第2篇-流批一体API

    flink1.12.0学习笔记第 2 篇-流批一体API flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇- ...

  4. CCC3.0学习笔记_认证和隐私保护

    CCC3.0学习笔记_Authentication and Privacy Keys 系列文章目录 文章目录 系列文章目录 前言 1. 手机端和车厂服务器端的密钥存储 2. 密钥的产生和使用的说明 3 ...

  5. TensorFlow2.0 学习笔记(三):卷积神经网络(CNN)

    欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 文章目录 欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 一.神经网络的基本单位:神经元 二.卷 ...

  6. 《TP5.0学习笔记---配置篇》

    TP5.0学习笔记 TP5目录结构介绍 application目录是应用目录,我们整个应用所有的内容都写在这个目录中,在后续开发中,我们更多的时候都是在编写这个目录中的文件.在它里边有一个index文 ...

  7. Tensorflow2.0学习笔记(一)

    Tensorflow2.0学习笔记(一)--MNIST入门 文章目录 Tensorflow2.0学习笔记(一)--MNIST入门 前言 一.MNIST是什么? 二.实现步骤及代码 1.引入库 2.下载 ...

  8. Tensorflow2.0学习笔记(二)

    Tensorflow2.0学习笔记(二)--Keras练习 文章目录 Tensorflow2.0学习笔记(二)--Keras练习 前言 二.使用步骤 1.实现步骤及代码 2.下载 Fashion MN ...

  9. CCC3.0学习笔记_数字密钥数据结构

    CCC3.0学习笔记_数字密钥数据结构 系列文章目录 文章目录 系列文章目录 前言 4.1 Applet Instance Layout 4.2 Digital Key Structure 4.2.1 ...

  10. Tensorflow2.0学习笔记(一)北大曹健老师教学视频1-4讲

    Tensorflow2.0学习笔记(一)北大曹健老师教学视频1-4讲 返回目录 这个笔记现在是主要根据北京大学曹健老师的视频写的,这个视频超级棒,非常推荐. 第一讲 常用函数的使用(包含了很多琐碎的函 ...

最新文章

  1. 在WebStorm里面搜索文件中出现的中文字符
  2. 取余运算怎么算_TensorFlow2.0(2):数学运算
  3. java非打印字符,使用Java正则表达式匹配不可打印字符
  4. The requested profile “pom.xml“ could not be activated because it does not exist. 解决方法
  5. CSDN在文章头部添加目录
  6. mysql 数据库 应用_MySQL数据库的应用
  7. C语言—sort函数比较大小的快捷使用--algorithm头文件下
  8. 无监督学习 | DBSCAN 原理及Sklearn实现
  9. 95-20-025-启动器-AbstractBootstrap
  10. 正则表达式的贪婪匹配与懒惰匹配
  11. php : 匿名函数(闭包) [一]
  12. 闲聊Framebuffer
  13. c++不好可以学qt吗_学美容好不好,学美容有前途吗?
  14. 谈谈我对广告投放系统的一点认识
  15. JS 实现数字转换为大写中文金额
  16. 升级鸿蒙系统好不好用,昨天随手发了一个有关升级鸿蒙系统后的使用体会,没料到引发这么大的讨论。看来大家对这个话题关注度很高。作为一个普通消费者,... - 雪球...
  17. 计算机 发声原理,终于懂得麦克风的发声原理是什么
  18. 如何限制一台电脑只能登陆一个QQ帐号
  19. Innovus基础命令:createPlaceBlockage
  20. AI中的几种搜索算法---A*搜索算法

热门文章

  1. 开发必学的验证码,教你从零写一个验证码
  2. 超定方程组的经典Gram-Schmidt正交化解法
  3. 多线程下不反复读取SQL Server 表的数据
  4. 处理ionic项目中,输入框的光标不自动定位,键盘不弹出的问题
  5. JVM学习(1)——通过实例总结Java虚拟机的运行机制
  6. greenDAO系列7--关系
  7. 四步帮你分析用户流失原因 - 产品设计GAP模型
  8. [TWAIN] 3句话总结TWAIN在Windows Server 2008 R2 SP1的使用
  9. C# Get请求携带body
  10. exception内置对象