这里写目录标题
从百科上可以看出,spring框架是由软件开发的复杂性而创建的,可以极大的程度上减少我们的开发,另外就是降低耦合。
另外,我们的spring框架除了可以应用于web开发,还可以作用于Java应用的开发。
其实spring可以说是对以往的技术的整合
另外spring的jar包使用的时候,新旧版本也不同
另外在我们下载jar包的时候,他也是不同的
Spring框架的整个结构的结构信息
A、Test
对应spring-test.jar. Spring提供的测试工具, 可以整合JUnit测试, 简化测试环节.
B、Core Container
Spring的核心组件, 包含了Spring框架最基本的支撑.
Beans, 对应spring-beans.jar. Spring进行对象管理时依赖的jar包.
Core, 对应spring-core.jar, Spring核心jar包.
Context, 对应spring-context.jar, Spring容器上下文对象.
SpEL, 对应spring-expression.jar, Spring表达式语言.
C、AOP
面向切面编程, 对应spring-aop.jar.
D、Data Access
Spring对数据访问层的封装
JDBC, 对应spring-jdbc.jar. Spring对jdbc的封装, 当需要使用spring连接数据库时使用. spring-jdbc.jar需要依赖spring-tx.jar.
Transactions, 对应spring-tx.jar. 事务管理
ORM, 对应spring-orm.jar. spring整合第三方orm框架需要使用的jar包, 例如Hibernate框架.
E、Web
Spring对javax下的接口或类做的扩展功能.
spring-web.jar, 对Servlet, filter, Listener等做的增强.
spring-webmvc.jar, 实际上就是SpringMVC框架. 需要依赖spring环境和spring-web.jar.
IOC
控制反转
掌握完IOC,我们创建对象就不用new了,都是IOC帮助我们做了
那我们写框架的时候,都是按照以下顺序执行的
假设,我们在service中有一个实现类,UserServlceImpl,如果我们想在servlet中调用,就需要先new这个实现类,然后才能调用实现类中的这个方法,
那如果说。我们把service层的实体类的名字改掉。那么我们还得改servlet中new的对象名,否则不会起作用,那么如何解决这个问题呢,IOC就可以解决这个问题
那么如何帮助我们创建的,是一个配置文件,首先我们要写一个标签
这个对象就创建好了
那么我们如果想要引用的话,需要以下几步
获得对象就是IOC创建好的对象,我们直接拿来调用即可
导包
首次搭建纯spring框架,需要导入4个包
分别是解析标签的beans
context
核心包core
以及描述文件格式的expression
另外日志包,在spring5.1之前有一个日志包,属于第三方的loggon
5.1之后,spring就提供了一个jcl的日志包,我们就不用再导loggin
IOC的基本使用
在resources下创建并配置applicationcontext.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">
</beans>
然后在内部配置bean,写入id和实现类的地址,然后再测试类中解析配置文件,
另外获取xml对象的时候,我们也可以使用另外一种方法,比如我们使用的强转,太过麻烦,那么我们可以再getbean中写入接口.class,意思就是获得的对象是什么类型的
IOC的三种实现方式
无参构造
假设当我们创建了一个实体类,其中已经提供了有参无参构造,那么我们使用xml核心文件,创建对象的同时,就已经调用了无参构造
有参构造
我们通过标签,constructor-arg的标签,进行属性的赋值,后面我们再调用的时候,会直接创建好,无论我们再测试类调不调用构造方法,都可以执行再在构造方法中的创建的语句。
但是如果当我们一个实体类中的有参构造发生多态的话,那么程序就会执行那个语句在前面就会先执行哪一个,哪怕我们再bean的属性赋值顺序一样,他也会遵循自己的规则,那么如果我们想要指定某一个东西的话,我们就会使用标签内的index方法,就是坐标的意思
除了index属性,还有int和string
除了这个,还有一个ref,他是为对象赋值的
工厂设计模式
我们假设创建了一个接口,写一个玩的方法,然后分别再男生女生的两个类中实现接口,同时都重写那个玩的方法,分别是男生玩的方法,另一个是女生玩的方法,我们一般调用这两个方法,都是new过后的结果,但是我们使用工厂
单独创建一个工厂类,里面通过我们后面输入的情况进行判断就行,然后我们通过基本的操作进行查询即可
另外我们的这个工厂是什么,是非静态的,那我们可以添加关键字static,,变成静态的,变成静态的好处是什么,就是我们再调用的时候,直接调用方法即可,不用再new对象了
如何用工厂模式实现IOC
同样我们在beans的标签中
没有赋值,也就是没有指定哪一个返回值,好方便在后台调用。
后面的那个,factory-methon指的是调用哪个方法。
那如果使用xml的配置的方式,我们在测试类如何调用?
我们只需要在解析xml文件之后,因为我们在xml文件中,把方法赋值给了p,那么我们引入p即可,同时写入接口即可,
如何调用静态方法
我们依然使用bean的方法,如果使用静态的方法,那么我们就不用再使用再调bean的对象了,直接factory-methon调用方法,也就是说不用在用bean去new对象了
DI依赖注入
简单一点来讲,DI就是给全局属性,或者是对象赋值的一种操作,
首先我们把依赖注入分开理解
什么是注入,注入就是通过外部给自己的属性(或者其他内容)进行赋值
依赖:一个类在另一个类中做 全局属性
其中类与类的关系有六种,分别是
DI的有哪些意义呢?
解除类与类之间的耦合性,给对象中的全局对象赋值的操作,
举例操作,创建一个教师类,一个班级类,然后再教师类,引入班级类,然后引入getset方法,以及tostring
这时,班级和教师就产生了一种类关系,就是依赖关系
DI的依赖注入也是有三种的
有参构造
set
自动注入
有参构造
什么时候可以用value