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知识库 -> 【Spring】IOC核心容器与XML方式管理Bean -> 正文阅读

[Java知识库]【Spring】IOC核心容器与XML方式管理Bean

一、IOC(控制反转)

依赖注入(Dependency Injection,简称DI)与控制反转(Ioc)的含义相同,只是从不同的角度描述的同一个概念。
1.控制反转(IoC):将对象的创建和调用交给Spring进行管理;
(1)IoC目的:降低耦合度
(2)IoC底层原理:xml解析、工厂模式、反射
2.依赖注入:Spring容器的角度看,Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为它注入了它依赖的实例,这就是依赖注入;
3.Spring提供的实现IOC的两种方式(接口):
(1)BeanFactory:管理Bean的工厂,主要负责初始化各种Bean,并调用他们的生命周期方法;(了解即可)
说明:加载配置文件时不会创建对象,在获取对象(使用)时才会创建对象。

BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("F:/applicationContext.xml"));//绝对路径

(2)ApplicationContext:是BeanFactory的子接口,被称为应用上下文,在BeanFactory的所有功能基础上,还提供了国际化、资源访问、事务传播等方面的支持。
说明:在加载配置文件时就会对配置文件中的对象进行创建。
ApplicationContext是接口,无法实例化,创建实例通常采用如下两种方法:
① 通过ClassPathXmlApplicationContext创建
(configLocation参数用于指定Spring配置文件的名称和位置,如果其值为“applicationContext.xml”,则Spring会从类路径中查找该名称的配置文件)

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);//类路径

② 通过FileSystemXmlApplicationContext创建
(FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作,使用绝对路径的方式,会导致程序的灵活性很差,不推荐使用。)

ApplicationContext applicationContext1 = new FileSystemXmlApplicationContext(String configLocation);//绝对路径

创建Spring容器之后,就可以使用Spring获取Bean的实例,方法如下:

Object getBean(String name):根据容器中的Bean的id或name获取指定的Bean,获取之后需要进行强制类型转换;
T getBean(Class requiredType):根据类的类型来获取Bean的实例,此方法为泛型方法,不需要强制类型转换。

二、Bean的管理

Bean管理包括操作:创建对象、注入属性

方式1:XML方式管理Bean

< bean >元素的常用属性及子元素
id:是bean的唯一标识,相当于起别名;
class:指定bean的具体实现类,使用类的全限定名(包类路径);
property:< bean >的子元素,用于调用bean实例中的setter方法完成属性赋值,从而完成依赖注入。该元素的name属性指定bean实例中的属性名,ref属性或value属性用于指定参数值;
constructor-arg:< bean >元素的子元素,用于构造器实例化时完成依赖注入;

1.XML方式创建对象

在Spring配置文件中使用< bean >标签实现对象创建:
创建对象的时候默认使用该bean的无参的构造方法创建;
如果未指定id和name,则Spring会将class值当作id使用。

<!--使用id属性定义bean,对应的实现类是com.jd.wds.Bean1-->
<bean id="bean1" class="com.jd.wds.Bean1"></bean>
<!--使用id属性定义bean,对应的实现类是com.jd.wds.Bean2-->
<bean name="bean2" class="com.jd.wds.Bean2"></bean>

2.XML方式注入属性

(1)DI(依赖注入):就是注入属性
方式1: 使用属性setter方法注入
① 创建类,定义属性和对应的setter方法

public class UserDao {
    private int age;
    private String name;
    public void setAge(int age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void say(){
        System.out.println(name+"::"+age);
    }
}

② 在Spring配置applicationContext.xml文件中配置创建对象,配置属性注入

<!--创建id为userDao的实例,实现类是com.jd.dao.UserDao-->
<bean id = "userDao" class="com.jd.dao.UserDao">
        <!--将name为那扎的属性注到userDao实例中-->
        <property name="name" value="那扎"/>
        <!--将age为19的属性注到userDao实例中-->
        <property name="age" value="19"/>
</bean>

测试:

//属性setter方法实现依赖注入
@Test
public void userDaoTest(){
    //1.初始化Spring容器,加载配置文件
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    //2.通过Spring容器获取UserDao的实例
    UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    System.out.println(userDao);
    //3.调用实例中的say()方法
    userDao.say();
}

在这里插入图片描述
方式2: 使用有参构造器注入
构造器注入采用的是有参的构造器完成属性注入
① 创建类,定义属性和对应的有参构造器

public class Order {
    private String name;
    private int price;
    public Order() {
    }
    public Order(String name, int price) {
        this.name = name;
        this.price = price;
    }
   public void show(){
       System.out.println("name = "+name+", price = "+price);
   }
}

② 在Spring配置applicationContext.xml文件中配置创建对象,配置属性注入

<bean id = "order" class="com.jd.dao.Order">
        <!--将name为那扎的属性注到userDao实例中-->
        <constructor-arg name="name" value="苹果13"/>
        <constructor-arg name="price" value="8000"/>
</bean>

测试:

//构造器实现属性依赖注入
@Test
public void orderTest(){
    //1.初始化Spring容器,加载配置文件
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    //2.通过Spring容器获取Order的实例
    Order order = (Order) applicationContext.getBean("order");
    System.out.println(order);
    //3.调用实例中的say()方法
    order.show();
}

在这里插入图片描述
XML注入特殊情况:
① 需要注入的属性包含null值:<property name="属性名"> <null></null> </property>
② 需要注入的属性包含特殊符号:<property name="name"> <value><![CDATA[特殊内容]]></value> </property>

注入属性的特殊情况

(1)注入外部bean
配置文件beans.xml

<bean id="userService" class="com.jd.ioc.Impl.UserServiceImpl">
	<!--将id为userDao的实例注到userService的实例中-->
    <property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="com.jd.ioc.Impl.UserDaoImpl"></bean>

(2)注入内部bean和级联赋值
配置文件beans1.xml

<bean id="employee" class="com.jd.dao.Employee">
    <!--设置注入两个普通属性-->
    <property name="name" value="小王"></property>
    <property name="sex" value=""></property>
    <!--内部Bean,设置注入对象属性-->
    <property name="dept">
        <bean id="dept" class="com.jd.dao.Dept">
            <property name="dName" value="人事部"></property>
        </bean>
    </property>
 </bean>

级联赋值beans.xml

<bean id="employee" class="com.jd.dao.Employee">
    <!--设置注入两个普通属性-->
    <property name="name" value="小王"></property>
    <property name="sex" value=""></property>
    <!--级联赋值-->
    <property name="dept" ref="dept"></property>
 </bean>
<bean id="dept" class="com.jd.dao.Dept">
    <property name="dName" value="财务部"></property>
</bean>

(3)注入集合类型的属性
配置文件beans4.xml

<bean id="student" class="com.jd.dao.Student">
    <property name="array">
        <array>
            <value>"北京"</value>
            <value>"南京"</value>
        </array>
    </property>
    <property name="list">
        <list>
            <value>"Java基础"</value>
            <value>"数据结构"</value>
        </list>
    </property>
    <property name="map">
        <map>
            <entry key="汉语" value="国语"></entry>
            <entry key="英语" value="外语"></entry>
        </map>
    </property>    
</bean>

(4)自动注入
根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入
配置文件beans1.xml

<!--使用autowire属性配置自动注入,byName根据属性名字输入(常用),byType根据属性类型注入-->
<bean id="employee" class="com.jd.dao.Employee" autowire="byName"></bean>
<bean id="dept" class="com.jd.dao.Dept" autowire="byName"></bean>

(5)外部属性文件
以数据库连接池Druid为例:
首先要引入相应的jar包,数据库配置文件jdbc.properties
在这里插入图片描述
在Spring配置文件中引入context名称空间,然后配置Spring配置文件beans.xml
在这里插入图片描述

1、Spring有两种类型 bean,一种普通bean,另外一种工厂bean (FactoryBean)
2、普通bean:在配置文件中定义bean类型就是返回类型
3、工厂bean:在配置文件定义bean类型可以和返回类型不一样
第一步创建类,让这个类作为工厂bean,实现接口 FactoryBean;
第二步实现接口里面的方法,在实现的方法中定义返回的 bean类型.

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-16 17:32:20  更:2021-12-16 17:33:57 
 
开发: 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/24 6:43:54-

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