为了解耦合:让类与类、模块与模块之间关系更松散
spring适合管理哪些对象:service对象、dao对象、工具类对象
spring不适合管理哪些对象:实体类、(servlet、listener、filter等web对象也不适合,因为这些对象是给tomcat创建和管理的)
spring又叫容器,是装Java对象。可以控制spring创建Java对象、给属性赋值
可以当作容器的对象---tomcat服务器----管理servlet、listener、filter对象
手动下载对应的spring版本:https://repo.spring.io/ //实际项目使用Maven自己会处理的
docs:文档
libs:源代码(spring是开源的) //spring比较大,分成20多个独立的模块,为了方便使用每模块做成单独的jar包
.jar 字节码打包
javadoc.jar 文档打包
sources.jar Java源代码打包
schena: spring框架使用的约束文件
Core Container:核心容器,包含4个模块
IOC:控制反转
是一个理论思想:把对象的创建、属性赋值、对象的生命周期都交给代码以外的容器管理
控制:对象创建、属性赋值、对象的生命周期
反转:开发人员管理对象的权限转移给代码之外的容器实现。由容器完成对象的管理
正转:开发人员 new 构造方法创建对象。由开发人掌握对象的创建、属性赋值、对象的生命周期。
开发人员通过容器可以使用容器中的对象
技术实现:DI (依赖注入)-----程序只需要提供使用对象的名字,对象如何创建、如何从容器中查找、获取都由容器内部自己实现
依赖:A类用了B类的内容 (执行A类的功能,需要先创建B类的对象)
注入:赋值 (B类对象作为A类的属性)
Spring框架使用DI来实现IoC思想,通过名字获取容器中对应的对象(spring底层使用反射机制创建对象、给属性赋值)
IoC通过管理对象解耦合。解决处理业务逻辑对象之间的耦合关系,也就是service对象和dao对象
使用: 1.使用maven创建普通的Java项目后,修改pom.xml文件加入spring依赖Spring-context //依赖代码去Maven官网找
2.开发人员写自己的业务代码(类)
3.创建spring配置文件xml(声明对象:一个<bean>表示一个Java对象)把对象交给spring创建和管理
4.创建spring容器对象ApplicationContext接口//代表配置文件,从容器对象中根据名称获取对象getBean("id值")
spring配置文件一般会起名beans.xml 或applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--beans根标签
跟标签后面的属性是约束文件的说明
xmls 声明命名空间
xmlns:xsi 命名xsi空间
xsi:schemaLocation xsi空间里有个标签schemaLocation
http://www.springframework.org/schema/beans 约束文件的具体路径
http://www.springframework.org/schema/beans/spring-beans.xsd 互联网上的约束文件的地址
-->
<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管理的java对象
id:自定义的对象名
class:全类名,通过反射创建对象用的
spring根据id、class创建对象,把对象放到spring的map对象中 //map.put(id,对象)
-->
<bean id="对象名" class="全类名">
</beans>
/*1.指定spring的配置文件路径,从类路径classes下,因为代码编译后放在target/classes之下,而resources的文件也是放在这*/
String config = "beans.xml";
/*2.创建容器对象: ApplicationContext接口。 ClassPathXmlApplicationContext实现类,从类路径中读取配置文件*/
//在这步时调用无参构造创建对象。即创建容器对象时读取配置文件,创建文件中的所有的声明对象<bean>,然后放到容器的map中
//好处是以后用的时候因为容器中已经有对象了,所以获取速度快。缺点是可能浪费性能
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
/*3.从容器中获取指定名称的对象(bead中的id值),类型为Object,需要转回自己的类型*/
SomeService service = (SomeService) ctx.getBean("id值");
/*4.调用接口类型对象的方法*/
service.doSome();
int count = ctx.getBeanDefinitionCount(); //获取对象的数量
String[] names = ctx.getBeanDefinitionNames(); //获取对象的名字字符串数组
DI:给属性赋值
方式
- 基于配置文件
- 基于注解
DI分类:
- set注入 //设值注入 spring调用无参构造方法创建对象。调用类的set方法,在set方法中完成属性赋值 //必须有set方法,本质来讲执行的是set属性名(),与属性名无关
- 构造注入 spring调用构造方法时完成属性赋值
基于配置文件的ID:
1.配置文件、set注入
<bean id="" class="">
<!--简单类型set注入 (简单类型:基本类型、String类型)-->
<property name="属性名" value="属性值"/> //name值与set+属性名()方法相关,与属性无关
<!--引用类型set注入-->
<property name="属性名" ref="对象名,即对象的id值"/>
</bean>
2.配置文件、构造注入
<bean标>的<constructor-arg>:表示构造方法的1个参数
name:形参名
index:构造方法参数位置 0开始
value:简单类型实参
ref:引用类型实参
<bean id="" class="">
<constructor-arg name="形参名" value="简单类实参"/> 将value值赋给形参
<constructor-arg name="形参名" ref="引用类型实参"/>
<constructor-arg index="下标位置" value="简单类实参"/>
<constructor-arg index="下标位置" ref="引用类型实参"/>
</bean>
3.引用类型自动赋值:
autowire属性:该对象的引用类型采取自动赋值
值:byName、byType
<bean id="" class="" autowire=""></bean>
引用类型的自动注入:<bean>带有属性autowire="byName或byType"
- byName:Java类中引用类型属性名和spring容器的<bean>的id值相同、类型也相同。这样<bean>能赋值给属性
- byType:Java类中引用类型的数据类型和spring容器的<bean>是同源关系。这样<bean>能赋值给属性 //前提是<bean>对象只在该类型中有一个,不然类的属性就不知道赋值哪个了
- 同源关系: 属性的类型和<bean>的类型:相同、继承关系、接口实现
多个Spring配置文件:按功能模块分、按类的功能分
<?xml version="1.0" encoding="UTF-8"?>
<!--suppress ALL -->
<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">
<!--其他配置文件-->
<import resource="classpath:其他文件的类路径"/>
<import resource="classpath:可以同通配符*表示一段文字"/>
</beans>
基于注解的ID
创建对象的注解 (234注解都是扩展自Component注解) @Component 位置:类上 创建Java对象,相当于<bean> @Repository 位置:dao接口的类上 创建dao接口的类的对象--dao对象(持久层对象),能访问数据库 @Service 位置:放在业务层接口的实现类上 创建业务层对象,业务层对象有事务的功能 @Controller 位置:放在控制器接口的实现类上 创建控制器对象(表示层对象),控制器对象能接受请求、把请求的处理结果显示给用户 属性:value 表示对象的名称,即id值 //可省