第一章Spring的概念
spring全家桶:Spring, SpringMVC, SpringBoot, SpringCloud
Spring:出现在2002年左右,解决企业开发难度,减轻对项目模块之间的管理,类和类之间的管理,帮助开发人员创建对象,管理对象之间的关系,Spring核心技术ioc,aop。能实现模块之间,类之间解耦合。
1.轻量
Spring框架使用的jar都比较小,一般在1M一下或者几百kb。Spring核心功能的所需的jar总共在3M左右,Spring框架运行占用的资源少,运行效率高,不依赖其他jar。
2.针对接口编程,解耦合
Spring提供了loc控制反转,由容器管理对象,对象的依赖关系,原来在程序代码中的对象创建方式,现在由容器完成,对象之间的依赖解耦合。
3.AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付,在Spring中,开发人员可以从繁杂的事务管理代码中解脱出来,通过声明方式灵活地进行事务管理,提高开发效率和质量
4.方便集成各种优秀框架
Spring不排斥各种的开源框架,相反Spring可以降低各种框架的使用难度,Spring提供了对各种框架如(Struts,Hibernate,MyBatis)等的直接支持,简化框架的使用,Spring像插线板一样,其他框架是插头,可以容易的组合到一起,需要使用哪个框架,就把哪个框架放入插线板,不需要可以轻易的移除。
第二章IOC控制反转
Spring框架第一个核心功能ioc
IOC(Inversion of Control):控制反转,是一个理论,概念,思想。把对象的创建,赋值,管理工作都交给代码之外的容器实现。
控制含义:创建对象,对象属性的赋值,对象之间的关系管理。
反转含义:把原来的开发人员管理,创建对象的权限转移给代码之外的容器实现,由容器代替开发人员管理对象,创建对象,给我对象属性赋值
正转含义:由开发人员在代码中,使用new构造方法创建对象,开发人员主动管理对象。
public static void main(String args[]){
Student student = new Student();//在代码中,手动创建对象=正转
}
Q:为什么要使用ioc?
目的是减少代码的改动,也能实现不同的功能。
IoC的技术实现
DI是ioc的技术实现
ID(Dependency Injection):依赖注入,只需要在程序中提供需要使用的对象名称就可以,对象如何在容器中创建,赋值,查找都由容器内部实现。
IDEA中实现Spring
1.创建maven项目
2.加入依赖,maven依赖,spring依赖,junit依赖
<!--spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
3.创建类(接口和他的实现类),和没有使用框架一样,就是普通的类
4.创建Spring需要使用的配置文件,声明类的信息,这些类由Spring创建和管理
选中resources资源文件夹-->alt+Insert-->直接敲xml-->XML Configuration File-->Spring Config
<?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">
<!--
声明bean,就告诉spring要创建某个类的对象
id:对象的自定义名称(唯一值),spring通过这个名称找到对象
class:类的全限定名称(不能是接口,spring底层采用反射机制创建对象,接口不可以创建对象)
spring把创建好的对象放到map集合中,spring框架有一个map集合存放对象
key=id部分
value=class部分
一个bean标签声明一个对象
-->
<bean id="someService" class="com.bjpowernode.dao.impl.SomeServiceImpl"/>
</beans>
<!--
spring的配置文件
1.beans:是根标签,Spring把java对象叫做bean
2.spring-beans.xsd 是约束文件,和mybatis指定 dtd是一样的
-->
5.创建测试类
在test里创建测试类
public class MyTest {
@Test
public void test01(){
//不使用Spring框架
//需要手动new对象
SomeServiceImpl someService = new SomeServiceImpl();
someService.doSome();
}
@Test
public void test02(){
//使用Spring框架
//不需要手动new对象,使用spring容器创建对象
//1.指定spring配置文件
String beans = "beans.xml";
//2.创建spring容器对象,ApplicationContext
//ApplicationContext就是表示Spring容器,通过容器获取对象
//ClassPathXmlApplicationContext:表示从类路径加载Spring的配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext(beans);
//3.通过getBean()方法获取需要的对象,参数是你spring配置文件bean标签的id
SomeService someService = (SomeService) ac.getBean("someService");
someService.doSome();
}
}
ac.getBeanDefinitionNames()//方法返回Spring配置文件中的所有对象,返回一个数组
ac.getBeanDefinitionCount()//方法返回一个整数,返回spring配置文件创建的对象个数
利用spring自带功能给java对象属性赋值
使用spring中的注解,完成属性赋值,叫做基于注解的id实现
di的语法分类:
1.set注入(设置注入):spring调用类的set方法,用set方法可以实现属性赋值
Spring调用了类的set方法,给对象赋值,name是对象的属性名,value是对象的属性值
一个propert标签只能给一个属性赋值,不管是整型还是其他类型必须用""号
<bean id="mystudent" class="com.bjpowernode.bean01.Student">
<property name="name" value="云英"/>
<property name="age" value="20"/>
</bean>
自定义类型
定义一个School类型的属性
school属性的值是一个对象,直接用ref引用,<bean>id就可以
<bean>id就是一个对象
测试类运行效果
2.构造注入:spring调用类的有参数构造方法,在创建对象的同时,在构造方法中完成赋值
构造注入使用<constructor-arg>标签
<constructor-arg>标签:一个<constructor-arg>表示构造方法一个参数
<constructor-arg>标签属性:
name:表示构造方法的形参名
index:表示构造方法的参数的位置,参数从左往右位置0,1,2的顺序
value:构造方法的形参类型是简单类型的,使用value
ref:构造方法的形参类型是引用类型的,使用ref
<!--使用name属性实现构造方法注入-->
<bean id="mystudent" class="com.bjpowernode.bean03.Student">
<constructor-arg name="myname" value="貂蝉"/>
<constructor-arg name="myage" value="26"/>
<constructor-arg name="myschool" ref="myschool"/>
</bean>
<bean id="myschool" class="com.bjpowernode.bean03.School">
<property name="name" value="北京大学"/>
<property name="address" value="海淀区"/>
</bean>
测试代码:
/*
* 有参数构造方法注入
* */
@Test
public void test04(){
String ing = "bean03/applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(ing);
Student mystudent = (Student) ac.getBean("mystudent");
System.out.println(mystudent);
}
-----------------------------------------------------------------------------------
引用类型的自动注入:
spring框架根据某些规则可以给引用类型赋值,不用手动手动再给引用类型赋值了,
使用的规则常用的是byName,byType
byName(按名称注入):java类型引用类型的属性名和spring容器中(配置文件)<bean>的id名称一致,且数据类型一致,这样容器中bean,spring能够赋值给引用类型
byTypr(按类型注入):java类中的引用类型的数据类型和spring容器中(配置文件)<bean>的class属性是同源关系,这样bean能够赋值给引用类型。
同源的意思是:
1.java类中引用类型的数据类型和bean的class的值是一样的。
2.java类中引用类型的数据类型和bean的class的值是父子关系的。
3.java类中引用类型的数据类型和bean的class的值是接口和实现类的关系。
----------------------------------------------------------------
项目开发中,能更好的管理对象,采用一个模块一个配置文件,再用一个总配置文件,把他们串起来,如图
总结
Q:什么是Spring?
是一个框架,核心技术是ioc,aop,实现解耦合,
spring是一个容器,容器中存放的是java对象,需要做的是把对象放到容器中
Q:怎么使用Spring?
把项目中的对象放入容器中,让容器完成对象的创建对象之间的管理(属性赋值),我们在程序中从容器中获取对象
Q:什么样的对象放到容器中?
dao类,service,controller类,工具类,使用xml文件,bean标签,spring中的对象默认都是单例的,在这个容器中叫这个名字的对象只能有一个。
Q:什么不方法到spring容器中?
1.实体类对象,实体类数据来自数据库
2.servlet,listener,filter等
Q:什么是ioc反转控制?
1.ioc反转是一个理论思想概念,指到开发人员在容器之中代码之外管理对象,给对象赋值,管理依赖。
2.ioc技术实现使用的di(依赖注入):开发人员在项目中只需要提供对象的名称,对象的创建,赋值,管理都由容器内部实现。
3.spring使用的di技术,底层使用的是反射机制
4.di给属性赋值,set注入和构造方法注入
Q:使用Spring的实现步骤?
1.加入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
2.创建类
3.创建Spring的配置文件,使用<bean>声明对象
4.我们使用容器中的对象,通过ApplicationContext接口和他的实现类ClassPathXmlApplcactionContext的getBean()