动力节点Spring框架学习笔记-王鹤(一)IOC控制反转

Spring框架学习笔记 官方下载地址
动力节点spring资料
视频观看地址
https://www.bilibili.com/vide...
一、IOC控制反转
1.1 概述 控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值,依赖的管理
IoC 是一个概念,是一种思想,其实现方式多种多样。当前是依赖注入。应用广泛
依赖:classA 类中含有 classB 的实例,在 classA 中调用 classB 的方法完成功能,即 classA
对 classB 有依赖。
1.2 IOC的实现 依赖注入:DI(Dependency Injection),程序代码不做定位查询,这些工作由容器自行完成。
依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建
被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
Spring 的依赖注入对调用者与被调用者几乎没有任何要求,完全支持对象之间依赖关系
的管理。
Spring 容器是一个大工厂,负责创建、管理所有的 Java 对象,这些 Java 对象被称为 Bean。
Spring 容器管理着容器中 Bean 之间的依赖关系,Spring 使用“依赖注入”的方式来管理 Bean 之间的依赖关系。使用 IoC 实现对象之间的解耦和。
1.3 关于bean标签 bean标签的配置


测试类(1)使用
@Test public void test01(){ SomeService service= new SomeServiceImpl(); service.doSome(); }

测试类(2)使用
@Test public void test03(){ String config="beans.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(config); //使用spring提供的方法, 获取容器中定义的对象的数量 int nums= ac.getBeanDefinitionCount(); System.out.println("容器中定义的对象数量:"+nums); //容器中每个定义的对象的名称 String names [] = ac.getBeanDefinitionNames(); for(String name:names){ System.out.println(name); } }

1.4 基于XML的DI 1.4.1 set注入(重点)
set 注入也叫设值注入是指,通过 setter 方法传入被调用者的实例。这种注入方式简单、直观,因而在 Spring 的依赖注入中大量使用。

1.4.2 构造注入
构造注入是指,在构造调用者实例的同时,完成被调用者的实例化。即使用构造器设置依赖关系。

1.4.3 引用类型自动注入
  • byName(按名称注入)
java类中引用类型的属性名和spring容器中(配置文件)的id名称一样,且数据类型是一致的,这样的容器中的bean,spring能够赋值给引用类型。

  • byType(按类型注入)
java类中引用类型的数据类型和spring容器中(配置文件)的class属性是同源关系的,这样的bean能够赋值给引用类型

1.4.4 具有关联关系的配置
  • student类的配置文件

  • School类的配置文件

  • total配置文件






#### 1.5 基于注解的DI* **注解配置的约束文件**


< beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.or...
http://www.springframework.or...
https://www.springframework.o...d">
< !--spring 创建容器时要扫描的包@ComponentScan -->
< context:component-scan base-package="com.jjh">
< /context:component-scan >
< /beans >
* **实体类**

@Data
@Component("myStudent")
public class Student {
private String name;
private int age;
//引用类型
private School school;
}
* **测试类中调用**

@Test
public void demo01(){
String config = "applicationContext.xml";
ApplicationContext app = new ClassPathXmlApplicationContext(config);
Student myStudent = (Student)app.getBean("myStudent");
System.out.println(myStudent);
}
**1.5.1 使用注解的步骤**1. 加入maven的依赖 spring-context,在你加入spring-context的同时, 间接加入spring-aop的依赖。使用注解必须使用spring-aop依赖2. 在类中加入spring的注解(多个不同功能的注解)3. 在spring的配置文件中,加入一个component-scan组件扫描器的标签,说明注解在你的项目中的位置

< !--声明组件扫描器(component-scan),组件就是java对象
base-package:指定注解在你的项目中的包名。
component-scan工作方式: spring会扫描遍历base-package指定的包,
把包中和子包中的所有类,找到类中的注解,按照注解的功能创建对象,或给属性赋值。
加入了component-scan标签,配置文件的变化:
1.加入一个新的约束文件spring-context.xsd
2.给这个新的约束文件起个命名空间的名称
-->

**1.5.2 多注解项目分层**1. @Component: 创建对象的, 等同于的功能属性:value 就是对象的名称,也就是bean的id值,value的值是唯一的,创建的对象在整个spring容器中就一个2. @Repository(用在持久层类的上面) : 放在dao的实现类上面,表示创建dao对象,dao对象是能访问数据库的。3. @Service(用在业务层类的上面):放在service的实现类上面,创建service对象,service对象是做业务处理,可以有事务等功能的。4. @Controller(用在控制器的上面):放在控制器(处理器)类的上面,创建控制器对象的,控制器对象,能够接受用户提交的参数,显示请求的处理结果以上三个注解的使用语法和@Component一样的。 都能创建对象,但是这三个注解还有额外的功能。**1.5.3 简单类型的赋值**@Value: 简单类型的属性赋值属性: value 是String类型的,表示简单类型的属性值使用位置:1.在属性定义的上面,无需set方法,推荐使用。 2.在set方法的上面**配置文件**




**properties文件**

name=Dick
age=20
@Component("myStudent")
public class Student {
//@Value("李四" )
@Value("${myname}") //使用属性配置文件中的数据
private String name;
@Value("${myage}")//使用属性配置文件中的数据
private Integer age;
}
**1.5.4 引用类型的赋值**默认方式1.@Autowired: spring框架提供的注解,实现引用类型的赋值2.spring中通过注解给引用类型赋值,使用的是自动注入原理 ,支持byName, byType3.@Autowired:默认使用的是byType自动注入4.使用位置:* 在属性上面使用 * 在set方法上面使用

@Component("myStudent")
public class Student {
@Value("李四" )
private String name;
@Value("20")
private Integer age;
@Autowired
private School school;
}
通过名称赋值如果要使用byName方式:在属性上面加入@Autowired属性上面加入@Qualifier(value="https://www.it610.com/article/bean的id") :表示使用指定名称的bean完成赋值在

@Component("myStudent")
public class Student {
@Value("李四" )
private String name;
@Value("20")
private Integer age;
@Autowired
@Qualifier("mySchool")
private School school;
}
#### **1.5.5 Autowired的required属性**required :是一个boolean类型的,默认true required=true:表示引用类型赋值失败,程序报错,并终止执行 required=false:引用类型如果赋值失败, 程序正常执行,引用类型是null#### **1.5.6 JDK注解@Resource自动注入**1.@Resource: 来自jdk中的注解,spring框架提供了对这个注解的功能支持,可以使用它给引用 类型赋值2.使用的也是自动注入原理,支持byName,byType默认是byName3.使用位置:在属性定义的上面,无需set方法,推荐使用 在set方法的上面 4.默认是byName:先使用byName自动注入,如果byName赋值失败,再使用byType5.@Resource只使用byName方式,需要增加一个属性 name,name的值是bean的id(名称)**指定name****@Component("myStudent") public class Student {@Value("李四" ) private String name; private Integer age; //只使用byName @Resource(name = "mySchool") private School school; ****默认配置**

@Component("myStudent")
public class Student {
@Value("李四" )
private String name;
private Integer age;
【动力节点Spring框架学习笔记-王鹤(一)IOC控制反转】//只使用byName
@Resource
private School school;

    推荐阅读