1. Spring
1.1 简介
- 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。
- 2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。Rod Johnson创始人,专业是音乐学。
- Spring理念 : 使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术
- ssh : Struct2+Spring+Hibernate
- SSM:SpringMvc +Spring+Mybatis
官网 : http://spring.io/
官方下载地址 : https://repo.spring.io/libs-release-local/org/springframework/spring/
GitHub : https://github.com/spring-projects
1.2 优点
1、Spring是一个开源免费的框架 , 容器 。
2、Spring是一个轻量级的框架 , 非侵入式的 。
3、控制反转 IoC , 面向切面 Aop。
4、对事物的支持 , 对框架的支持。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。
1.3 扩展
Spring Boot与Spring Cloud
- springBoot可以快速的开发单个微服务。
- springCloud 基于springBoot实现的。
学习springBoot的前提要了解spring和springMVC。
2. IOC创建对象
2.1 对于ioc的理解
控制反转时是一种通过描述(XML或注解)并通过第三方法去生产或获取指定对象的方式。在spring
是实现控制反转的是IOC容器,其方法实现是依赖注入。
在没有IOC的程序中,对象的创建与对象之间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建交给第三方。
2.2 ioc创建对象方式
- 使用默认的无参构造器创建对象。(默认)
- 假设使用有参进行创造对象
当删除空参构造后
<!-- <bean id="user" class="com.wyu.pojo.User">-->
</property>
<!--<!– 使用有参构造器创建对象 通过下标的方式赋值–>-->
<!-- <constructor-arg index="0" value="老二"></constructor-arg>-->
<!-- </bean>-->
<!-- 第二中方式通过类型进行创建,不建议进行使用,因为构造器只能使用一个参数 -->
<!-- <bean id="user" class="com.wyu.pojo.User">-->
<!-- <constructor-arg type="java.lang.String" value="二胎"></constructor-arg>-->
<!-- </bean>-->
<!-- 第三种 直接通过参数命名 -->
<bean id="user" class="com.wyu.pojo.User">
<constructor-arg name="name" value="第三种方式命名"></constructor-arg>
</bean>
在配置文件加载的时候,容器中管理的对象就已经实例化了。
3.Spring配置
3.1 alias
为user对象起另外一个名字 ,一对一的别名
<alias name="user" alias="user2"></alias>
3.2 bean的配置
<!--bean就是java对象,由Spring创建和管理-->
<!--
id 是bean的标识符,要唯一,如果没有配置id,name就是默认标识符
如果配置id,又配置了name,那么name是别名
name可以设置多个别名,可以用逗号,分号,空格隔开
如果不配置id和name,可以根据applicationContext.getBean(.class)获取对象;
class是bean的全限定名=包名+类名
-->
<bean id="hello" name="hello2 h2,h3;h4" class="com.kuang.pojo.Hello">
<property name="name" value="Spring"/>
</bean>
import
将多个applicationContext合并为一个。
4 .依赖注入
依赖注入分为:构造器注入,set注入,扩展方式注入
- 依赖:bean对象创建依赖于容器。
- 注入 :bean对象中所有的容器,由容器来注入。
set注入
<bean id="student" class="com.wuyu.pojo.Student">
<property name="name" value="常量注入 "></property>
<!-- bean注入,值是对象的引用 ref -->
<property name="address" ref="address"></property>
<!-- 数组注入-->
<property name="books">
<array>
<value>数组注入1</value>
<value>数组注入2</value>
</array>
</property>
<!--列表注入-->
<property name="games">
<set>
<value>LOL</value>
<value>BOB</value>
<value>COC</value>
</set>
</property>
<!-- map注入-->
<property name="card">
<map>
<entry key="中国邮政" value="456456456465456"/>
<entry key="建设" value="1456682255511"/>
</map>
</property>
<!-- 字符串 Mnull值注入 -->
<property name="wife"><null/></property>
<!--Properties注入 -->
<property name="info">
<props>
<prop key="学号">20190604</prop>
<prop key="性别">男</prop>
<prop key="姓名">小明</prop>
</props>
</property>
</bean>
扩展方式注入(p,c注入)
P命名空间注入 : 需要在头文件中加入约束文件
导入约束 : xmlns:p="http://www.springframework.org/schema/p"
<!--P(属性: properties)命名空间 , 属性依然要设置set方法--> 用到了默认的构造器
<bean id="student2" class="com.wuyu.pojo.Student" p:name="test" />
c 命名空间注入 : 需要在头文件中加入约束文件(要有对应参数的构造器)
导入约束 : xmlns:c="http://www.springframework.org/schema/c"
<!--C(构造: Constructor)命名空间 , 属性依然要设置set方法-->
<bean id="user" class="com.kuang.pojo.User" c:name="test2" />
5.bean的作用域
- Singleton(spring默认机制):那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象。意,Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置:
<bean id="student" class="com.wuyu.pojo.Student" scope="singleton">
Student student = (Student) context.getBean("student");
Student student1_1 = (Student) context.getBean("student");
student == student1_1
- Prototype(每次从容器get的时候获得一个新对象):它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。
- request , session
6. bean的自动装配
spring会在上下文中自动寻找,并且给bean装配属性。
spring中有三种装配方式:在xml中装配,在java中显示配置,隐式的自动装配bean。
<bean id="dog" class="com.test.pojo.Dog"/>
<bean id="cat" class="com.test.pojo.Cat"/>
byName : 会自动在容器上下文中查找,和自己对象set方法后面对应的beanid。(只要id和set后名字,一致就行)
byType : 会自动在容器上下文中查找,和自己对象属性相同的beanid。(在bean中只能有相同类型的对象只能有一个)
<bean id="user" class="com.test.pojo.User" autowire="byName">
<property name="str" value="test"/>
</bean>
7. 注解实现自动装配
7.1前提工作 :
- 在spring配置文件中引入context文件头
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd入代码片
- 开启属性注解支持!
<context:annotation-config/>
- @Autowired:需要导入 spring-aop的包!可以写在属性名或者是方法上,使用Autowired可以不写set方法。
//如果允许对象为null,设置required = false,默认为true
@Autowired(required = false)
private Cat cat;
- @Qualifier : 当自动装配环境复杂时,无法通过一个注解(Autowited)匹配的时候,可以使用Qualifier 指定一个唯一的beanid辅助查找。
- @Resource :指定唯一的bean时候用name =" "。