耦合和内聚
耦合coupling:结合 联结
- 耦合:代码书写过程中技术的结合紧密度。用于衡量各个模块之间的紧密程度。
- 内聚:单个模块内部组成部分之间的联系。测试紧密程度。
程序书写目标:高内聚,低耦合。
模块之间不能紧密,单个模块内部要高度紧密。
1、工厂模式发展历程 1、直接new一个dao对象在我们的类代码中(传统的开发模式)- 直接new一个dao对象在我们的类代码中
因为每出现一个dao实现类,就会要重新再类中去创建对象,这样增加了两个模块之间的耦合程度,所以才出现了工厂模式
2、出现了工厂代理(使用工厂类new一个对象)new对象不再在我们的类中操作,全部在工程类中的操作,工厂类会返回一个new出来的对象,也就是说,创建对象的任务交给了工厂类。
有了工厂就不用修改调用方源代码,但是需要修改工厂代码;工厂与dao代码耦合,这样也降低了两个模块之间的耦合度。
3、加入了配置文件将实现类更新到配置文件中,工厂只需要通过读取配置文件的方式将实现类返回给我们的类。只需要改配置文件。
4、spring雏形
有了spring就不用再使用工厂设计模式了,sping容器比工厂模式更优秀。
ioc:控制反转,spring控制应用程序所需要使用的外部资源;
传统模式开发是通过new一个对象,去获取另一个类的资源的,这种主动权全都在类手上,代码不移维护,为了容易维护代码才有了spring的控制反转,控制反转就相当于,spring拿下了类的控制权,
所有的new对象和获取外部资源都交给spring的ioc容器
spring控制的资源全部放在spring容器当中,该容器成为ioc容器。
1、接口
package com.zhu.service;
public interface UserService {
public void save();
}
2、这个接口的实现类
package com.zhu.service.impl;
import com.zhu.service.UserService;
public class UserServiceImpl implements UserService {
@Override
public void save() {
System.out.println("这个保存方法运行了...");
}
}
3、将这个实现类注册到spring容器当中
4、测试类,通过加载spring容器获取其中的bean
import com.zhu.service.UserService;
import com.zhu.service.impl.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserApp {
public static void main(String[] args) {
//加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//从ioc的bean中获取资源,这个拿去的操作就像是创建对象,所以必须给它一个它自己的数据类型
UserServiceImpl userService = (UserServiceImpl) context.getBean("userService");
userService.save();
}
}
4、IOC中的bean标签
1、bean标签和name属性
bean可以定义多个名称,使用name属性来完成,中间使用 , 分隔;这个name个id的使用一样
2、bean标签的scope属性
scope标签用于控制bean标签是否是单例
scope=“singleton”
import com.zhu.service.UserService;
import com.zhu.service.impl.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserApp {
public static void main(String[] args) {
//加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//从ioc的bean中获取资源,这个拿去的操作就像是创建对象,所以必须给它一个它自己的数据类型
UserServiceImpl userService1 = (UserServiceImpl) context.getBean("userService1");
UserServiceImpl userService2 = (UserServiceImpl) context.getBean("userService1");
UserServiceImpl userService3= (UserServiceImpl) context.getBean("userService1");
//创建多个对象对比内存地址是否一致,如果一致就是使用的单例模式
System.out.println(userService1);
System.out.println(userService2);
System.out.println(userService3);
System.out.println(userService1 == userService2);//结果为true
userService1.save();
}
}
3、bean的声明周期
init-method属性和destroy-method属性
使用它的前提是在这个类中写创建和销毁方法
4、静态工厂与实例工厂的创建(了解)
目的:处理遗留系统,将遗留系统的工厂模式改为spring的方式
原因:因为工厂模式已经落后了,所以要改成sping的方式,spring也给出了相应的处理模式



