IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> spring5框架中的IOC容器 -> 正文阅读

[Java知识库]spring5框架中的IOC容器

目录

一、什么是IOC?

二、IOC底层原理:

三、IOC容器

四、IOC操作Bean管理:

xml方式:

? ? ? ? 创建对象的配置操作:

? ? ? ? ? 属性注入的配置操作:

注解方式:

1、Spring 针对 Bean 管理中创建对象提供注解

2、实现对象创造

3、开启组件扫描配置的细节

4、实现属性注入

bean生命周期:


?

使用idea学习,首先要先导入jar包:

一、什么是IOC?

1.控制反转,把对象创建和对象之间的调用的操作交给了Spring管理

2.使用IOC可以降低耦合度

二、IOC底层原理:

1.xml解析

2.工厂模式

3.反射机制

三、IOC容器

Spring提供了IOC容器的两种实现方法

1.BeanFactory:IOC容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用

* 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象

2.ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人 员进行使用

* 加载配置文件时候就会把在配置文件对象进行创建

四、IOC操作Bean管理:

Bean管理分为两部分:(1)Spring创建对象 (2)Spring注入属性

Bean管理的操作有两种方式:(1)基于xml配置文件的实现方式 (2)基于注解的实现方式(这个比较方便,用的也多)

xml方式:

? ? ? ? 创建对象的配置操作:

? ? ? ? ? ? ? ? ①在Spring配置文件中,使用bean标签,标签里面添加响应的属性,实现对象的创建? ? ?

<bean id="user" class="com.haiyu.spring.User"></bean>

????????????????②bean标签中的常用属性:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? id属性:唯一标识(这里就是实例化以后的对象名)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? class属性:类路径(这里就是要实例化的类的路径)

? ? ? ? ? 属性注入的配置操作:

? ? ? ? ? ? ? ? 方法一:DI:依赖注入,其实是调用了类中的set()。

? ? ? ? ? ? ? ? 在bean标签的中间使用property标签来配置:(可以配置多个)

<property name="uname" value="haiyu"></property>

? ? ? ? ? ? ? ? 方法二:使用有参数的构造器进行注入

??????????????????在bean标签的中间使用constructoy-arg标签来配置:(可以配置多个)???

<constructor-arg name="uname" value="haiyu"></constructor-arg>

? ? ? ? ? 1、?如果是一个类中调用了另一个类,此时属性的注入是一个类的对象:那就需要这样:(外部bean)

<bean id="emp" class="com.atguigu.spring5.bean.Emp">
 <property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.atguigu.spring5.bean.Dept">
 <property name="dname" value="财务部"></property>
</bean>

? ? ? ? 也可以这样(内部bean)

<bean id="emp" class="com.atguigu.spring5.bean.Emp">
 <property name="dept">
 <bean id="dept" class="com.atguigu.spring5.bean.Dept">
 <property name="dname" value="安保部"></property>
 </bean>
 </property>
</bean>

?2、注入数组类型的属性:注入List类型的属性:注入Map类型的属性:注入Set类型的属性(相似)

<bean id="stu" class="com.atguigu.spring5.collectiontype.Stu">

 <!--数组类型属性注入-->
 <property name="courses">
 <array>
 <value>java 课程</value>
 <value>数据库课程</value>
 </array>
 </property>

 <!--list 类型属性注入-->
 <property name="list">
 <list>
 <value>张三</value>
 <value>小三</value>
 </list>
 </property>

 <!--map 类型属性注入-->
 <property name="maps">
 <map>
 <entry key="JAVA" value="java"></entry>
 <entry key="PHP" value="php"></entry>
 </map>
 </property>

 <!--set 类型属性注入-->
 <property name="sets">
 <set>
 <value>MySQL</value>
 <value>Redis</value>
 </set>
 </property>

</bean>

3、此时如果有相同的集合需要注入,那xml文件将会很长

所以:在Spring配置文件中引入名称空间util:

<?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"
 xmlns:util="http://www.springframework.org/schema/util"   //这里,照着上面的改
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/util 
http://www.springframework.org/schema/util/spring-util.xsd">   //这里

再使用这个util标签完成list集合的注入:

?

<util:list id="bookList">
 <value>易筋经</value>
 <value>九阴真经</value>
 <value>九阳神功</value>
</util:list>


<bean id="book" class="com.atguigu.spring5.collectiontype.Book">
 <property name="list" ref="bookList"></property>
</bean>

4、Spring有两种类型bean,一种是普通bean,另一种是工厂bean(FactoryBean)

? ? ? ? ①普通 bean:在配置文件中定义 bean 类型就是返回类型

? ? ? ? ②工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样

????????????????第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBean

????????????????第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型

????????????????????????

public class MyBean implements FactoryBean<Course> {
 //定义返回 bean
 @Override
 public Course getObject() throws Exception {
 Course course = new Course();
 course.setCname("abc");
 return course;
 }
 @Override
 public Class<?> getObjectType() {
 return null;
 }
 @Override
 public boolean isSingleton() {
 return false;
 }
}

配置

<bean id="myBean" class="com.atguigu.spring5.factorybean.MyBean">
</bean>

?此时,getBean()返回值就是工厂bean中泛型的类型

public void test3() {
 ApplicationContext context =
 new ClassPathXmlApplicationContext("bean3.xml");
 Course course = context.getBean("myBean", Course.class);
 System.out.println(course);
}

5、在 Spring 里面,默认情况下,bean 是单实例对象

6、如何设置单实例还是多实例

①在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例

②scope 属性值

第一个值 默认值,singleton,表示是单实例对象

第二个值 prototype,表示是多实例对象

<bean id="user" class="com.haiyu.spring.User" scope="prototype">
    <property name="list" ref="userList"></property>
</bean>

③singleton 和 prototype 区别

第一 singleton 单实例,prototype 多实例

第二 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象 设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用 getBean 方法时候创建多实例对象

7、xml自动装配:根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入

①根据属性名称自动注入

<bean id="emp" class="com.atguigu.spring5.autowire.Emp" autowire="byName">
 <!--<property name="dept" ref="dept"></property>-->
</bean>
<bean id="dept" class="com.atguigu.spring5.autowire.Dept"></bean>

②根据属性类型自动注入

<bean id="emp" class="com.atguigu.spring5.autowire.Emp" autowire="byType">
 <!--<property name="dept" ref="dept"></property>-->
</bean>
<bean id="dept" class="com.atguigu.spring5.autowire.Dept"></bean>

注解方式:

1、Spring 针对 Bean 管理中创建对象提供注解

(1)@Component

(2)@Service

(3)@Controller

(4)@Repository?

上面四个注解功能是一样的,都可以用来创建 bean 实例

2、实现对象创造

第一步:引入依赖

?第二步:开启组件扫描

<context:component-scan base-package="com.haiyu.spring"></context:component-scan>

第三步 创建类,在类上面添加创建对象注解

????????在注解里面 value 属性值可以省略不写, //默认值是类名称,首字母小写

3、开启组件扫描配置的细节

①use-default-filters="false" 表示现在不使用默认 filter,需要自己配置

filter context:include-filter ,设置扫描哪些内容

<context:component-scan base-package="com.haiyu.spring" use-default-filters="false">
     <context:include-filter type="annotation" 
     expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

②下面配置扫描包所有内容

context:exclude-filter: 设置哪些内容不进行扫描

<context:component-scan base-package="com.haiyu.spring">
     <context:exclude-filter type="annotation" 
     expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

4、实现属性注入

@Value? 注入普通类型属性

@Value(value = "abc")
private String name;

@Autowired (属于javax包下)根据属性类型进行自动装配

@Service
public class UserService {
 //定义 dao 类型属性
 //不需要添加 set 方法
 //添加注入属性注解
 @Autowired 
 private UserDao userDao;
 public void add() {
 System.out.println("service add.......");
 userDao.add();
 }
}

@Qualifier (属于javax包下)根据名称进行自动装配,需要和@Autowired一起使用

@Autowired //根据类型进行注入
@Qualifier(value = "userDaoImpl1") //根据名称进行注入
private UserDao userDao;

@Resource(不是内部注解)既可以根据类型进行自动装配,也可以根据名称进行自动装配

//@Resource //根据类型进行注入
@Resource(name = "userDaoImpl1") //根据名称进行注入
private UserDao userDao;

bean生命周期:

(1)通过构造器创建 bean 实例(无参数构造)

(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)

(3)把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization

(4)调用 bean 的初始化的方法(需要进行配置初始化的方法)

(5)把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization

(6)bean 可以使用了(对象获取到了)

(7)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:20:27  更:2022-05-12 16:21:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:11:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码