Study-Spring
1.简介
1.1 拓展
- Spring Boot
- 一个快速开发的脚手架
- 基于SpringBoot可以快速开发单个微服务
- 约定打与配置
- Spring Cloud
- 基于SpringBoot实现
大部分公司在进行SpringBoot进行快速开发,学习SpringBoot的前提,需要完全掌握Spring和SpringMVC。承上启下的作用。
弊端:发展了太久后,违背了以前的理念!配置十分繁琐。人称配置地狱
2.IOC理论推导
1.UserDao
2.UserDaoImpl
3.Service
4.ServiceImpl
- 之前程序主动创建对象!控制权在程序员手上。
- set注入后,程序不在具有主动性,而是变成被动接收对象。
- IOC 程序员不用管理对象的创建,而是交给用户处理,降低系统的耦合性。程序员可以专注在业务的实现上。这就是IOC的原型。
使用IOC进行依赖反转(橙色表示程序创建主动权)
百度百科----------控制反转**(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做**依赖注入(Dependency Injection,简称DI**),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
3.HelloSpring
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring创建的。
反转:程序本身不创建对象,而是北城被动的接收对象。
依赖注入:依赖set方法进行注入的。
IOC是一种编程思想,由主动的编程便被被动的接收。
ok,使用Spring容器后,我们cedilla不再用程序中进行改动,要实现不同的new操作,只需要在xml配置文件中进行修改。所谓的IOC,就是对象由Spring来创建、管理、装配
4、IOC创建对象的方式
通过对象的无参构造函数创建,当需要创建对象的pojo的类没有无参构造时,报错无法初始化
Caused by: java.lang.NoSuchMethodException: com.guo.pojo.User.<init>()
1.使用无参构造创建对象,默认!
2.若想使用带参构造器,则需要使用配置constructor-arg标签
-
第一种办法–下标赋值
<!-- 第一种方法:下标赋值 --> <bean id="user" class="com.guo.pojo.User"> <constructor-arg index="0" value="郭海亮"/> <property name="name" value="Coder Guo" /> </bean>
-
第二种办法–根据类型匹配
<bean id="user" class="com.guo.pojo.User"> <constructor-arg type="java.lang.String" value="用type匹配"/> </bean>
-
通过参数名进行匹配
<bean id="user" class="com.guo.pojo.User">
<constructor-arg name="name" value="通过name进行匹配"/>
</bean>
总结:在配置文件加载的时候,容器中管理的对象就已经被初始化了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pGYGqHzP-1621174855744)(C:\Users\MSI\AppData\Roaming\Typora\typora-user-images\image-20210516135715498.png)]
5、Spring配置
5.1别名
<!-- 使用别名 -->
<alias name="user" alias="userNew"/>
5.2 Bean的配置
<!--
id: bean的唯一标识符,也相当于变量名
class: bean对象所对应的全限定名-包名+类名
name: 别名,而且name可以同时取多个别名
-->
<bean id="userT" class="com.guo.pojo.UserT" name="userT2,ut2 ut3" />
5.3 import
一般用于团队开发使用,它可以将多个配置文件合并为同一个
<import resource="bean1.xml" />
6 依赖注入(DI)
6.1 构造器注入
6.2 Set方式注入(重点)
- 依赖注入:set注入
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象中的所有属性,由容器来注入
环境搭建:
1.复杂类型
package com.guo.pojo;
public class Address {
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
2.真实测试对象
public class Student {
private String name;
private Address address;
private String[] books;
private List<String> hobbies;
private Map<String, String> card;
private Set<String> games;
private String wife;
private Properties info;
}
3.applicationContext.xml
<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 id="student" class="com.guo.pojo.Student">
<!-- 第一中国,普通值得注入 -->
<property name="name" value="Coder Guo" />
<!-- 第二种,使用bean注入 -->
<property name="address" ref="address" />
<!-- 3.数组注入 -->
<property name="books">
<array>
<value>红楼梦</value>
<value>西游记</value>
<value>水浒传</value>
<value>三国演义</value>
<value>java核心思想</value>
</array>
</property>
<!--4.list-->
<property name="hobbies">
<list>
<value>游泳</value>
<value>唱歌</value>
<value>听音乐</value>
<value>打游戏</value>
</list>
</property>
<!--5.map注入-->
<property name="card">
<map>
<entry key="身份证" value="3131231231231231231231313" />
<entry key="银行卡" value="2131231231231221354356476568758" />
</map>
</property>
<!--6.Set注入-->
<property name="games">
<set>
<value>LOL</value>
<value>WOW</value>
<value>CF</value>
<value>DNF</value>
</set>
</property>
<!--7.null值注入-->
<property name="wife">
<null />
</property>
<property name="info">
<props>
<prop key="userName">CoderGuo</prop>
<prop key="pwd">21389012</prop>
</props>
</property>
</bean>
<bean id="address" class="com.guo.pojo.Address" />
</beans>
用不同的方式进行注入
6.3 拓展方式注入
我们可以使用p命名空间和c命名空间进行注入
使用p命名空间和c命名空间在xml导入约束
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
使用:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--p命名空间的注入,可以直接注入属性的值: p:=property -->
<bean id="user" class="com.guo.pojo.User" p:name="CoderGuo" p:password="123" />
<!--c命名空间的注入,通过构造器注入 p:=property -->
<bean id="user2" class="com.guo.pojo.User" c:name="CoderGuo2" c:password="123456" />
</beans>
测试:
@Test
public void testC() {
ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
User user2 = context.getBean("user2", User.class);
System.out.println(user2.toString());
}
6.4、Bean的作用域
1.单例模式
<bean id="user2" class="com.guo.pojo.User" c:name="CoderGuo2" c:password="123456" scope="singleton"/>
2.原型模式
<bean id="user" class="com.guo.pojo.User" p:name="CoderGuo" p:password="123" scope="prototype"/>
3.其余的request、seesion、application这些这技能在web开发中使用到。
7、Bean的自动装配
- 自动装配是Spring满足bean依赖的一种方式
- Spring会在上下文中自动寻找、并自动给bean装配属性
在Spring中一共由三种装配的方式
- 在xml中显示的配置
- 在java中显示配置
- 隐式的自动装配
7.1 测试
环境搭建:一天个人拥有两个宠物dog和cat
7.2 ByName自动装配
!--
byName: 会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanId
byType: 会自动在容器上下文中查找,和自己对象睡醒相同的bean-弊端:id全局唯一
-->
<bean id="person" class="com.guo.pojo.Person" autowire="byName">
<property name="name" value="Coder Guo"/>
</bean>
7.3ByType自动装配
<!--
byName: 会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanId
byType: 会自动在容器上下文中查找,和自己对象睡醒相同的bean-弊端:id全局唯一
-->
<bean id="person" class="com.guo.pojo.Person" autowire="byType">
<property name="name" value="Coder Guo"/>
</bean>
小结:
- byName的时候,需要保证所有bean的i的唯一,并且这个bean需要和自动注入的属性的set方法的值一致。
- byType的时候,需要保证所有bean的Class唯一,并且这个bean需要和自动注入的属性的类型一致