day05
IOC控制反转的思维
回顾
- 用配置文件代替工厂模式,其实配置文件就是一个工厂模式
- 任何框架的出现是简化代码,应该是越做越简单
IOC
-
是一个容器,装什么东西呢?装的是一堆对象,放的是一堆配置文件中配置的对象,他们装到容器中,spring自己放进IOC,我们只需要配置就好了,不需要自己去放
-
单元测试工具Junit,首先导包,JUntil还有导入spring-test测试包,版本号要保持一致,也就是springtest和web-mvc版本号保持一致*******
-
@RunWith("SpringJUnit4ClassRUnner.class)
@COntextConfiguration(locations=“classpath:applicationContext.xml”) -
读配置文件,第一个@RunWith()
-
把配置文件中的三个对象放进IOC容器
-
做的是依赖注入
-
@Resource 是控制反转
正这转和反着转的解释
-
思维:正这转:自己去获取一个对象(可以new,可以调用方法获取)
-
反着转:当我们需要一个主板对象时,也不用自己new和调用方法,在IOC容器中,我们需要那个对象, 哪个对象自己过来赋值
那个对象符合我赋值的条件,自己过来赋值; -
房屋中介和舔狗的例子
-
依赖注入只能发生中IOC容器中,********
手段 依赖注入
- 将对象方剂IOC容器中,进行依赖注入
- 怎样将对象放进IOC容器中呢?扫描某个包
但是并不会把包下所有的类都放进IOC容器中
如果包下类放进IOC,把类加注解**************注解如下
-
注解 @Component //搞不清楚放那一层
@Repository //仓库
@Service //service
@Configration //配置类
@Controller //controller -
依赖注入@Resource
应用范围
- 什么时候扫描包+注解,什么时候配置bean节点
- 自己写的类扫描包+注解
- 外部引入的类用bean节点
bean节点的set注入和构造注入
set注入
-
配置bean的时候,property为某个属性赋值(调用set方法),set注入
-
用property注入的时候,必须保证该属性有set方法
-
property中的name并不是属性名字,是set方法,
规则: 把set去掉,第一个字母变成小写 -
setId -->id
构造注入
- 通过调用构造方法为属性赋值 构造注入
- 所谓注入就是赋值
- constructor-arg
- 用构造注入,必须有构造方法
精彩问题
-
i3,i5,i7都加上了注解,会出现报错的效果
-
解决方案:1、去掉注解,只添加一个
-
2、中介给你三个,你自己选择一个,@Resource(name=“i3”),添加到cpu上
springmvc如何前后分离并且返回json
-
乱码的问题
-
解决问题:我们采用fastjson,只要把默认的消息转换器改成fastjson的消息转换器就可以
-
如果是个list
前后端分离用spirngmvc;
** 修改消息转换器 是springmvc
-
在mvn:annotation-driver
<mvc:message-converters register-defaultes=“false”>
application/json;charset=utf-8
</…>
</…>
</…>
</…> -
第一个;把默认消息转换器删除
-
将fastjson添加进来
警告
- 如果做前后端分离,用springboot,不要用springmvc
IO
-
IO: input和output
-
用处:数据的传输,
-
string str=“abc”;在常量池,程序运行以后,所有的数据都在内存中,我们把程序中的数据和其他地方的数据其他地方的数据进行通讯叫做IO,
I: input 把其他地方的数据读入内存中
O : output 把当前程序的数据写入到其他地方 -
内存和硬盘
-
一个进程的数据和另一个进程的数据通讯,都在内存,也算IO,
-
一个服务器进程和另一个服务器进行的数据也是IO
** 举例子:单机游戏:数据保存在内存中,游戏中途为了防止进程意外结束,防止数据丢失,我们要亲存档,将 游戏中的数据写入硬盘中,每一次存到就是一次IO操作
-
读档: 将硬盘中的数据读入游戏的内存中,
-
读取文件:需要一个文件对象:File
-
FIle file = new File(“文件路径 d:/Test.java”);
每一层路径用一个/或者\ -
.length()输出的是字节203;
-
File对象只能对文件进行操作,创建,删除,
但是无法对文件中的内容进行操作******** -
createNewFile(); delete();
-
如果要对内容进行操作,需要使用IO流
-
对文件进行读取,InputStream是抽象类,文件读入
inputStream是字节流 -
InputStream is = new FileInputStream(file);
-
is.read()
-
read方法
-
如果无参,表示一次读一个字节,返回ascii码
-
读不到内容返回-1
-
有参数
-
byte[],一次读取出符合byte[]长度的数据 返回 本次读取了多少个数据
byte[] array = new byte[10]; -
is.read(array)
-
i 读不到的话还是-1,
new String(array, 0,i);将byte数组转换成字符串
编码
-
gbk中文2字节,utf-8中文是3个字节
-
有中文的文本不适合用字节流
-
用什么?字符流 用中文需要用字符流
-
字符流 Reader reader = new FileReader();
-
reader.read(char数组)
-
reader.read();按照字符读的,没有参数
-
流是资源,所以使用之后一定要关闭
-
字节流转成字符流:InputStreamReader
-
关闭的时候后进先出
-
BufferedReader bufferReader = new BufferedReader(isr); 参数是InputStreamReader对象,
-
有.readLine();读取一行
-
IO流是一种资源,得关闭,关闭顺序,先开的后关闭
day0731下午
-
IO流
-
回顾:上午讲解了输入流,就是把别的地方的数据读入的程序里面了
输出流
-
输出流:就是把我们内存里面的数据写外边去
-
OutPutStream os = new FileOutPutStream(file,false);
-
os.write(“aslkgdg”.getBytes());
-
os.flush(); os.close();
-
boolean append
-
new FileOutPutStream(file,(boolean append)true/false);
-
字符输出流
-
Writer writer = new FileWriter(file,true);
-
writer.write(“134lk lgds”);
-
ObjectOutputStream objects = new ObjectOutputStream(os);
-
objects.writeObject(list);
-
objects.close();
-
os.close();
-
报错,对象必须实现序列化接口,implements Serializable
-
对于字节流而言
反射
- 类加载器
- new 某个类的构造方法,这个类的信息你得提前知道
- 类名.java文件—>javac 类名.java,编译生成.class文件
保存在硬盘中, - 把类的信息从硬盘读入到内存中,叫做类加载*********
负责这个工作的是类加载器,类加载器将.class文件放到方法区
堆区中会创建一个Class类型的对象,指向到该方法区中,我们
*** 堆区 栈区 方法区
-
什么时候类加载,对类第一次进行主动使用的时候
-
1、new 一个类的构造方法,
-
2、new一个类的子类的构造方法的时候
-
3、调用一个类的static成员变量
-
4、调用一个类的static方法
-
5、运行含有main方法的类
-
6、class.forName(类的完全限定名)
-
如何拿到class对象呢?3个方法
-
1、类名.class
-
2、对象.getClass()
-
3、Class.forName(类的完全限定名)
jdbc里面的反射
-
如果不仅仅是一条数据,查询多少条数据是没准的,原则上返回一个list<里面需要相应的类型>,差那个表,泛型就是那个表对应的pojo类型
-
所以我们想要峰装通用查询,一定返回list<>,但是泛型不确定,早起使用list,但是List和List并没有继承关系,虽然User继承自Object
-
泛型出现之后,我们就可以采用自定义的方式声明泛型
-
Classclz起到了约束返回值List的作用
-
while(re.next()){
//1、创建一个对象
//(用class对象来床架User对象)//clz.newInstance();表示的是调用无参构造创建对象
// User user = (User)clz.newInstance();
T t = clz.newInstance();//2从数据库里面把一行的数据拿出来,赋值给创建对象的每一个属性
//此时并不知道T 中有哪些可以set的属性,所以我们需要先知道
Field[] fields = clz.getDeclaredFields();//获取该类的所有属性,每一个属性封装到Fileld对象
for(Field field:fields){
field.getName();获取属性的名字//能不能把属性名字当做列的名字来用呢?可以,得保证一致,属性名和数据库的列的名字一致 属性没法赋值, //field.getName(); Object val = rs.getObject(field.getName()); field.setAccessible(true);//给Private权限 field.set(t,val);
}
//3把对象添加到 List中
} -
as 改别名sql语句
-
装逼的方式:加注解,按照注解的值从数据库里面取
-
实际上注解是个接口,
@Target(ElementType.FIELD) //表示注解能够放哪
public @interface Colume{
}
-
没建立一个注解,注解上必须加两个注解
-
@Retention(RetentionPolicy.RUNTIME) 整个生命周期有效