一,spring是什么
Spring是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的容器框架
理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架
优点:
弊端:违背了原有的技术理念:配置太过繁琐,被称为“配置地狱”
二,Spring框架由七个定义明确的模块组成
三,现代化的开发就是基于spring容器的开发,
1.springboot :一个快速开发的脚手架
约定大于配置
2.springcloud:
springCloud是基于SpringBoot实现的
四,控制反转和面向切面
IOC:(获得依赖对象的方式反转了,对象由spring来创建,管理和装配)
1.控制反转:从本质上解决了问题,使我们程序员不用再去管理对象的创建了
系统的耦合性大大降低,可以更专注于业务的实现(IOC的原型)
1)以前:程序是需要程序员主动创建对象,控制权在开发人员手上
2)使用了set方法,程序不再具有主动性,而是变成了被动的接受对象,主动权在用户手上
3)配置:
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
ref: 引用Spring容器中创建好的对象
value:具体的值,基本数据类型
4)IOC创建对象的方法:
1.默认使用无参构造创建对象
2. 手动配置有参构造:constructor
1)下标赋值:index
2)通过类型创建(不建议)
3)通过参数名:name
5)在配置文件加载的时候,容器中管理的对象就已经初始化了,(容器类似于婚介所,只有对象注册到了婚介所,当容器applicationcontext被创建,被管理的对象也就存在,也就是被初始化了)
五,spring的配置
1.别名:
alias:----->如果添加了别名,我们也可以通过别名获取对象
2.Bean的配置:
id:bean的唯一标识符,也就是相当于我们的对象名
class:bean的全限定名“包名+类名”(bean对象所对应的全限定名)
name: 也是别名:而且name比alias更高级,可以同时取多个别名(逗号或空格或分号分割)
ref:引用Spring容器中创建好的对象
value:具体的值,基本数据类型
3.import:
1)这个import,一般用于团队开发,可以将多个配置文件,导入合并为一个
2)假设项目中有多个人开发,这三个人负责不同类的开发,不同类需要注册到不同的bean中,我们可以利用import将所有人的beans.xml合并为一个总的
张三:beans
李四:beans2
王五:beans3
applicationContext.xml:
<import resource="beans.xml"/>
<import resource="beans2.xml"/>
<import resource="beans3.xml"/>
使用的时候,直接使用总的配置就好了
六,DI依赖注入
1.构造器注入:
2.通过set方式注入
依赖注入:set注入
依赖:bean对象的创建依赖于容器
注入:bean对象中的所有属性,由容器来注入
环境搭建:
1.复杂类型
2.真实测试对象
<bean id="student" class="com.kuang.pojo.Student">
<!--第一种,普通注入-->
<property name="name" value="小俊"/>
<!--第二种:bean注入,ref-->
<property name="address" ref="address"/>
<!--第三种:,数组注入-->
<property name="books">
<array>
<value>红楼梦</value>
<value>西游记</value>
<value>水浒传</value>
<value>三国演义</value>
</array>
</property>
<!--第四种:list-->
<property name="hobbys">
<list>
<value>听歌</value>
<value>王者</value>
<value>跳舞</value>
</list>
</property>
<!--第五种:map-->
<property name="card">
<map>
<entry key="身份证" value="1234543234543234"/>
<entry key="银行卡" value="3ueqrqyrqoyrqywqo"/>
</map>
</property>
<!--第六种:set-->
<property name="games">
<set>
<value>LOL</value>
<value>COC</value>
<value>BoB</value>
</set>
</property>
<!--第七种:null-->
<property name="wife">
<null/>
</property>
<!--第八种:properties-->
<property name="info">
<props>
<prop key="学号">190970070</prop>
<prop key="性别">男</prop>
<prop key="姓名">小俊</prop>
</props>
</property>
</bean>
3.其他方式注入
注意:这两种不能直接使用,需要去导入约束,从官方文档去拿
1)p命名注入 xmlns:p="http://www.springframework.org/schema/p"
2)c命名注入 xmlns:c="http://www.springframework.org/schema/c"
<!--p命名空间,可以直接注入属性的值-->
<bean id="user" class="com.kuang.pojo.User" p:name="小俊" p:age="18"/>
<!--c命名空间,通过构造器注入:construct-args-->
<bean id="user2" class="com.kuang.pojo.User" c:age="18" c:name="小俊俊"/>
4.bean的作用域:
1)单例模式:singleton:
spring 默认机制
<bean id="user2" class="com.kuang.pojo.User" c:age="18" c:name=" 小俊俊" scope="singleton"/>
2)原型模式:prototype:
每次从容器中get的时候,都会产生一个新对象
3)其他的在web中才用到
七.Bean的自动装配
自动装配是spring满足bean依赖的一种方式
spring会在上下文中自动寻找,并自动给bean装配属性
三种装配在方式:
1)在xml中显示的配置
2)在java中显示的配置
3)隐式的自动装配bean(重要)
1.byName自动装配
byName会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanID
<bean id="people" class="com.kuang.pojo.People" autowire="byName">
<property name="name" value="小俊俊呀!"/>
</bean>
2.byType自动装配
byName会自动在容器上下文中查找,和自己对象属性类型相同的beanID
<bean id="people" class="com.kuang.pojo.People" autowire="byType">
<property name="name" value="小俊俊呀!"/>
</bean>
小结:
- byname的时候:需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法值一致
- byname的时候:需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型值一致