1.ocp开闭原则
什么是ocp?
ocp是软件七大开发原当中最基本的一个原则:开闭原则
对扩展开放,对修改关闭
ocp原则是最核心的,最基本的,其他的六个原则都是为这个原则服务的
ocp原则的核心是:只要你在扩展系统功能的时候,没有修改以前写好的代码,那么这个设计就是符合ocp原则的。反之,如果在扩展系统功能的时候,你修改了之前的代码,那么这个设计是失败的,违背ocp原则。
当进行系统功能扩展的时候,如果动了之前稳定的程序,修改了之前的代码,之前的程序都是需要重新测试的,这个是不想看到的,因为非常麻烦。
2.依赖倒置原则(DIP原则)
什么是依赖倒置原则?
面向接口编程,面向抽象编程,不要面向具体编程
依赖倒置原则的目的?
降低程序的耦合度,提高扩展力。
什么叫做符合依赖倒置原则?上不依赖下
什么叫违背依赖倒置原则?
上,依赖下,就是违背
只要下一改动,上就受到牵连
3.控制反转(IOC)
什么是控制反转?
对象我不new了,控制权交给你,是一种编程思想,或者叫做一种新的设计模式,没有被纳入GOF23种设计模式范围中。
4.Spring框架
spring框架实现了控制反转IOC这种思想
spring框架可以帮我们new对象,帮我们维护对象和对象之间的关系
spring是一种实现了IOC思想的容器。
控制反转的实现方式有多种,其中比较重要的叫做:依赖注入(dependency injection简称di)
控制反转是一种思想,依赖注入是实现方式
依赖注入的两种方式
1.set注入
2.构造器注入
5.第一个程序
pom.xml文件的配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>spring002-first</artifactId>
<version>1.0-SNAPSHOT</version>
<!--学习spring项目可以是普通Java程序-->
<packaging>jar</packaging>
<dependencies>
<dependency>
<!--spring-context依赖-->
<!--当你引入spring Context依赖之后,表示将spring的基础以来引入了-->
<!--如果你想使用spring的jdbc,或者其他的tx,那么还需要在次添加依赖-->
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
</project>
创建spring.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--这是spring的配置文件,是idea工具为我们提供了这个文件的模板,一定要使用这个模板来创建,这个文件不一定叫做spring.xml,可以是其他文件,最好放在类的根路径下,方便后期的移植 -->
<!--<bean id="身份证号" class="类的全路径类名"/>-->
<bean id="userbean" class="com.powernode.spring6.bean.User"/>
</beans>
创建test测试类
@Test
public void testspring9(){
//1.获取spring容器对象
//ApplicationContext翻译为应用上下文,其实就是spring容器
//Application是一个接口,接口下有很多实现类,其中一个实现类叫做ClassPathXmlApplicationContext
//ClassPathXmlApplicationContext专门从类路径当中加载spring配置文件的一个spring上下文对象
ApplicationContext ctx =new ClassPathXmlApplicationContext("spring.xml");
//2.根据bean的id获取容器中的对象
Object user = (User)ctx.getBean("userbean");
System.out.println(user);
}
spring是怎么实例化对象的?
默认情况下spring会通过反射机制,调用类的无参构造方法来实例化对象
Class<?> aClass = Class.forName("com.powernode.spring6.bean.User");
Object o = aClass.newInstance();
spring会把创建好的对象放到Map<String,object>当中,其中key为id,value为对象
spring的配置文件,名字,路径,个数都是随意的。
不是在调用getbean()方法的时候才创建对象,而是执行解析xml文件中时,就创建好对象了。