Spring5 框架 ---- IOC容器(一)
【摘要】 1. IOC的概念和原理 1. 什么是IOC控制反转,把对象创建和对象之间的调用过程,交给Spring管理使用IOC目的:为了耦合度降低入门案例就是IOC实现 2. IOC底层原理技术:xml + 工厂模式 + 反射举个栗子:两个方法之间的调用传统模式工厂模式IOC过程 2. IOC的BeanFactory接口IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂Spring 提...
1. IOC的概念和原理
1. 什么是IOC
- 控制反转,把对象创建和对象之间的调用过程,交给Spring管理
- 使用IOC目的:为了耦合度降低
- 入门案例就是IOC实现
2. IOC底层原理
技术:xml + 工厂模式 + 反射
举个栗子:两个方法之间的调用
传统模式
工厂模式
IOC过程
2. IOC的BeanFactory接口
-
IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂
-
Spring 提供了 IOC 容器实现两种方式:(两个接口)
- BeanFactor:IOC 容器基本实现,是 Spring 内部的使用接口,一般不提供开发人员进行使用(加载配置文件的时候,不会创建对象,在获取对象(使用)才会创建对象)
- ApplicationContext:BeanFactory 接口的子接口,比 BeanFactory 提供了更多更强大的功能,一般由开发人员进行使用(加载配置文件时候,就会创建对象)
-
ApplicationContext 接口有实现类
3. IOC操作Bean管理(概念)
1. 什么是Bean管理
Bean 管理指的是两个操作:
- Spring 创建对象
- Spring 注入属性
2. Bean管理操作有两种方式
- 基于 xml 配置文件方式实现
- 基于注解方式实现
4. IOC操作Bean管理(基于xml方式)
1. 基于xml方式创建对象
<!--配置User对象创建-->
<bean id="user" class="com.fickler.spring5.User"></bean>
-
在 spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建
-
在 bean 标签有很多属性,介绍常用属性
- id 属性:唯一标识(别名)
- class 属性:创建对象所在位置的全路径
-
创建对象时候,默认也是执行无参数构造方法完成对象创建
2. 基于xml方式注入属性
DI:依赖注入,就是注入属性(要在创建对象的基础之上注入属性)
3. 第一种注入方式:使用set方法进行注入
- 创建类,定义属性和对应的 set 方法
package com.fickler.spring5;
/**
* @author dell
* @version 1.0
*/
public class Book {
private String name;
private String author;
public void setName(String name) {
this.name = name;
}
public void setAuthor(String author) {
this.author = author;
}
public void testDemo(){
System.out.println(name + "::" + author);
}
}
- 在 spring 配置文件配置对象创建,配置属性注入
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置User对象创建-->
<!-- <bean id="user" class="com.fickler.spring5.User"></bean>-->
<!--set方法注入属性-->
<bean id="book" class="com.fickler.spring5.Book">
<!--使用property完成属性注入
name:类里面属性名称
value:向属性注入的值
-->
<property name="name" value="易筋经"></property>
<property name="author" value="达摩老祖"></property>
</bean>
</beans>
- 测试输出
package com.fickler.spring5.testdemo;
import com.fickler.spring5.Book;
import com.fickler.spring5.User;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author dell
* @version 1.0
*/
public class TestSpring5 {
@Test
public void testAdd(){
//1.加载配置spring配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean1.xml");
//2.获取配置创建的对象
// User user = applicationContext.getBean("user", User.class);
Book book = applicationContext.getBean("book", Book.class);
System.out.println(book);
book.testDemo();
}
}
4. 第二种注入方式:使用有参数构造进行注入
- 创建类,定义属性,创建属性对应有参数构造方法
package com.fickler.spring5;
/**
* @author dell
* @version 1.0
*/
public class Orders {
//属性
private String name;
private String address;
//有参数构造
public Orders(String name, String address) {
this.name = name;
this.address = address;
}
public void ordersTest(){
System.out.println(name + "::" + address);
}
}
- 在 spring 配置文件中进行配置
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置User对象创建-->
<!-- <bean id="user" class="com.fickler.spring5.User"></bean>-->
<!--set方法注入属性-->
<!-- <bean id="book" class="com.fickler.spring5.Book">-->
<!-- <!–使用property完成属性注入-->
<!-- name:类里面属性名称-->
<!-- value:向属性注入的值-->
<!-- –>-->
<!-- <property name="name" value="易筋经"></property>-->
<!-- <property name="author" value="达摩老祖"></property>-->
<!-- </bean>-->
<!--有参构造注入属性-->
<bean id="orders" class="com.fickler.spring5.Orders">
<constructor-arg name="name" value="电脑"></constructor-arg>
<constructor-arg name="address" value="中国"></constructor-arg>
</bean>
</beans>
- 测试输出
package com.fickler.spring5.testdemo;
import com.fickler.spring5.Book;
import com.fickler.spring5.Orders;
import com.fickler.spring5.User;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author dell
* @version 1.0
*/
public class TestSpring5 {
@Test
public void testAdd(){
//1.加载配置spring配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean1.xml");
//2.获取配置创建的对象
// User user = applicationContext.getBean("user", User.class);
// Book book = applicationContext.getBean("book", Book.class);
Orders orders = applicationContext.getBean("orders", Orders.class);
System.out.println(orders);
orders.ordersTest();
}
}
5. p名称空间注入(了解)
使用 p 名称空间注入,可以简化基于 xml 配置方式
- 添加 p 名称空间在配置文件中
<?xml version="1.0" encoding="UTF-8"?>
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- 进行属性注入,在 bean 标签里面进行操作
<?xml version="1.0" encoding="UTF-8"?>
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置User对象创建-->
<!-- <bean id="user" class="com.fickler.spring5.User"></bean>-->
<!--set方法注入属性-->
<!-- <bean id="book" class="com.fickler.spring5.Book">-->
<!-- <!–使用property完成属性注入-->
<!-- name:类里面属性名称-->
<!-- value:向属性注入的值-->
<!-- –>-->
<!-- <property name="name" value="易筋经"></property>-->
<!-- <property name="author" value="达摩老祖"></property>-->
<!-- </bean>-->
<!--有参构造注入属性-->
<!-- <bean id="orders" class="com.fickler.spring5.Orders">-->
<!-- <constructor-arg name="name" value="电脑"></constructor-arg>-->
<!-- <constructor-arg name="address" value="中国"></constructor-arg>-->
<!-- </bean>-->
<!--p名称空间-->
<bean id="book" class="com.fickler.spring5.Book" p:name="九阳神功" p:author="无名氏"></bean>
</beans>
- 测试输出
package com.fickler.spring5.testdemo;
import com.fickler.spring5.Book;
import com.fickler.spring5.Orders;
import com.fickler.spring5.User;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author dell
* @version 1.0
*/
public class TestSpring5 {
@Test
public void testAdd(){
//1.加载配置spring配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean1.xml");
//2.获取配置创建的对象
// User user = applicationContext.getBean("user", User.class);
Book book = applicationContext.getBean("book", Book.class);
// Orders orders = applicationContext.getBean("orders", Orders.class);
System.out.println(book);
book.testDemo();
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)