Spring的IOC技术(配置文件形式)

news2024/11/24 17:44:37

目录

一、什么是IOC

二、IOC的程序入门

1.创建mavenJava项目,引入依赖

2.编写接口和实现类

3.编写spring核心配置文件(applicationContext.xml)

4.测试类

5.测试结果-------一个对象

三、Spring框架的Bean管理的配置文件

四、实例化Bean对象的三种方式

1.无参数的构造方法(默认且用的多)

2.静态工厂实例化---一个对象

3.动态工厂实例化方式

五、DI依赖注入

1.属性的set方法注入值

业务层接口:

业务层实现类:

持久层接口:

持久层实现类:

配置文件:

测试类:

运行:​编辑

2.属性构造方法方式注入值

业务层实现类:

配置文件:

运行:​编辑

3.数组、集合等的注入

CollectionBean 类:

配置文件:

测试类:

运行结果:

六、多配置文件方式

1.主配置文件中包含其他的配置文件

2.工厂创建的时候直接加载多个配置文件


一、什么是IOC

IOC---控制反转,将对象的创建权力交给Spring框架(通过bean标签),

它是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度

二、IOC的程序入门

1.创建mavenJava项目,引入依赖

<dependencies>
    <!--spring的核心依赖-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <!--日志-->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    <!--测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

2.编写接口和实现类

接口:

package com.qcby.service;

/*
* 业务层接口
* */
public interface UserService {
    /*接口中的抽象方法*/
    public void hello();
}

实现类:
 

package com.qcby.service.impl;

import com.qcby.service.UserService;
/*
* 用户模块实现类实现用户模块接口
* */
public class UserServiceImpl implements UserService {
    @Override
    public void hello(){
        System.out.println("Hello IOC!");
    }
}

3.编写spring核心配置文件(applicationContext.xml)

<?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">
    <!--IOC管理bean-->
    <!-- bean的意义是将该类的创建对象权利交给spring框架 -->
    <bean id="userService" class="com.qcby.service.UserServiceImpl"></bean>
</beans>

4.测试类

package com.qcby.test;

import com.qcby.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/*
* 测试类
* 测试UserService交给spring管理
* */
public class UserServiceTest {
    //测试方法
    @Test
    public void run1(){
        //单例模式:UserService这个类只能创建一个对象

        //使用Spring的工厂
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过工厂获得类
        UserService userService1=(UserService) applicationContext.getBean("userService");
        UserService userService2=(UserService) applicationContext.getBean("userService");
        userService1.hello();
        userService2.hello();
        System.out.println(userService1);
        System.out.println(userService2);
    }
}

5.测试结果-------一个对象

三、Spring框架的Bean管理的配置文件

1.id属性

在约束中采用ID的约束,唯一;

取值要求:必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号 ,不能出现特殊字符

2.class属性

bean对象的全路径

3.scope属性

代表Bean的作用范围,有单例和多例

(1)singleton单例(默认值),最常用的方式-----同一对象

(2)prototype多例(相当于new)(两个对象)

四、实例化Bean对象的三种方式

1.无参数的构造方法(默认且用的多)

<bean id="us" class="com.qcby.service.UserServiceImpl"></bean>

2.静态工厂实例化---一个对象

静态工厂是一个对象,已经有了,再用还是原来的

例子:
类:

package com.qcby.demo1;

import com.qcby.service.UserService;
import com.qcby.service.UserServiceImpl;

/*静态工厂方式*/
public class StaticFactory {
    public static UserService createUs(){
        System.out.println("通过静态工厂的方式创建UserServiceImpl对象...");
        return new UserServiceImpl();
    }
}

配置文件:

<bean id="us" class="com.qcby.demo1.StaticFactory" 
                                factory-method="createUs"></bean>

3.动态工厂实例化方式

package com.qcby.demo1;

import com.qcby.service.UserService;
import com.qcby.service.UserServiceImpl;

public class Dfactory {
    public UserService createUs(){
        System.out.println("实例化工厂的方式...");
        return new UserServiceImpl();
    }
}

配置文件

<bean id="dfactory" class="com.qcby.demo1.Dfactory"></bean>
<bean id="us2" factory-bean="dfactory" factory-method="createUs2"></bean>

五、DI依赖注入

DI依赖注入就是实现IOC的方式

1.属性的set方法注入值

业务层接口:

package com.qcby.service;

/*
* 订单业务层接口
* */
public interface OrderService {
    public void saveOrder();
}

业务层实现类:

package com.qcby.service.impl;

/*
* 订单的实现
* 调用持久层操作数据库
* */
import com.qcby.dao.OrderDao;
import com.qcby.service.OrderService;

public class OrderServiceImpl implements OrderService{
    private OrderDao orderDao;//它是私有属性,所以必须提供set方法

    public void setOrderDao(OrderDao orderDao) {
        this.orderDao = orderDao;
    }

    public void saveOrder(){
        orderDao.saveOrder();
    }
}

持久层接口:

package com.qcby.dao;

/*
* 持久层接口
* 保存订单
* */
public class OrderDao {
    public void saveOrder();
}

持久层实现类:

package com.qcby.dao;

public class OrderDaoImpl implements OrderDao {
    @Override
    public void saveOrder(){
        System.out.println("保存了订单!");
    }
}

配置文件:

<bean id="os" class="com.qcby.service.impl.OrderServiceImpl">
    <property name="orderDao" ref="od"></property>
</bean>
<bean id="od" class="com.qcby.dao.OrderDao"></bean>

测试类:

package com.qcby.test;

import com.qcby.service.OrderService;
import com.qcby.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class OrderServiceTest {
    @Test
    public void run1(){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        OrderService orderService=(OrderService)applicationContext.getBean("os");
        orderService.saveOrder();
    }
}

运行:

2.属性构造方法方式注入值

其他不变,

业务层实现类:

package com.qcby.service.impl;

/*
* 订单的实现
* 调用持久层操作数据库
* */
import com.qcby.dao.OrderDao;
import com.qcby.service.OrderService;

public class OrderServiceImpl implements OrderService{
    private OrderDao orderDao;
    public OrderServiceImpl(OrderDao orderDao) {
        this.orderDao = orderDao;
    }

    public void saveOrder(){
        orderDao.saveOrder();
    }
}

配置文件:

<bean id="os" class="com.qcby.service.impl.OrderServiceImpl">
    <constructor-arg name="orderDao" ref="od"></constructor-arg>
</bean>
<bean id="od" class="com.qcby.dao.OrderDao"></bean>

运行:

3.数组、集合等的注入

用的set方法

CollectionBean 类:

package com.qcby.demo3;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class CollectionBean {
    private String[] strs;

    public void setStrs(String[] strs) {
        this.strs = strs;
    }

    private List<String> list;
    public void setList(List<String> list) {
        this.list = list;
    }
    
    private Map<String,String> map;
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
    
    private Properties properties;
    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    @Override
    public String toString() {
        return "CollectionBean{" +
                "strs=" + Arrays.toString(strs) +
                ", list=" + list +
                ", map=" + map +
                ", properties=" + properties +
                '}';
    }
}

配置文件:

<!--给集合属性注入值-->
<bean id="collectionBean" class="com.qcby.demo3.CollectionBean">
    <property name="strs">
        <array>
            <value>美美</value>
            <value>小凤</value>
        </array>
    </property>
    <property name="list">
        <list>
            <value>熊大</value>
            <value>熊二</value>
        </list>
    </property>
    <property name="map">
        <map>
            <entry key="aaa" value="老王"></entry>
            <entry key="bbb" value="小王"></entry>
        </map>
    </property>
    <property name="properties">
        <props>
            <prop key="username">张三</prop>
            <prop key="password">1234</prop>
        </props>
    </property>
</bean>

测试类:

package com.qcby.test;

import com.qcby.demo3.CollectionBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class CollectionTest {
    @Test
    public void run(){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        CollectionBean collectionBean= (CollectionBean) applicationContext.getBean("collectionBean");
        System.out.println(collectionBean);
    }
}

运行结果:

六、多配置文件方式

多配置文件的加载方式

1.主配置文件中包含其他的配置文件

<?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">


    <import resource="applicationContext2.xml"></import>
</beans>

2.工厂创建的时候直接加载多个配置文件

ApplicationContext applicationContext = 
         new ClassPathXmlApplicationContext("applicationContext.xml",
                                          "applicationContext2.xml");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2228928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读(三十二):EGNet: Edge Guidance Network for Salient Object Detection

文章目录 1.Introduction2.Related Works3.Salient Edge Guidance Network3.1Complementary information modeling3.1.1Progressive salient object features extraction3.1.2Non-local salient edge features extraction 3.2One-to-one guidance module 4.Experiments4.1Imple…

深度学习:卷积神经网络中的img2col

im2col 是一种在卷积神经网络&#xff08;CNN&#xff09;中常用的技术&#xff0c;用于将输入图像数据转换为适合卷积操作的矩阵形式。通过这种转换&#xff0c;卷积操作可以被高效地实现为矩阵乘法&#xff0c;从而加速计算。 在传统的卷积操作中&#xff0c;卷积核&#xff…

java:入门基础(1)

练习一&#xff1a;文字版格斗游戏 需求: ​ 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;在选定人物的时候&#xff08;new对象的时候&#xff09;&#xff0c;这些信息就应该被确定下来。 举例&#xff1a; ​ 程序运行之后…

计算机毕业设计 | springboot+vue电影院会员管理系统 影院后台管理(附源码)

1&#xff0c;项目背景 随着互联网时代的到来&#xff0c;同时计算机网络技术高速发展&#xff0c;网络管理运用也变得越来越广泛。因此&#xff0c;建立一个B/S结构的电影院会员管理系统&#xff1b;电影院会员管理系统的管理工作系统化、规范化&#xff0c;也会提高影院形象…

TypeScript(中)+算法(二)

文章目录 算法排序冒泡排序选择排序 TS类型声明类型推断类型总览js中的数据类型ts中的数据类型原始类型和包装对象原始类型包装对象自动装箱 常用类型与语法anyunknownnevervoidvoid 与 undefined总结 算法 排序 有十种排序算法&#xff0c;分别是&#xff1a;冒泡排序&#…

算法定制LiteAIServer视频智能分析软件的过亮、过暗及抖动检测应用场景

在现代社会中&#xff0c;视频监控系统扮演着举足轻重的角色&#xff0c;其视频质量直接关乎监控系统的可靠性与有效性。算法定制LiteAIServer通过引入抖动检测和过亮过暗检测功能&#xff0c;为视频监控系统的稳定性和用户体验带来了显著提升。 以下是对这两种功能的技术实现、…

【隐私计算篇】全同态加密应用场景案例(隐私云计算中的大模型推理、生物识别等)

1.题外话 最近因为奖项答辩&#xff0c;一直在忙材料准备&#xff0c;过程非常耗费时间和精力&#xff0c;很难有时间来分享。不过这段时间虽然很忙碌&#xff0c;但这期间有很多新的收获&#xff0c;特别是通过与领域内专家的深入交流和评审过程&#xff0c;对密码学和隐私计算…

elasticsearch 8.x 插件安装(三)之拼音插件

elasticsearch 8.x 插件安装&#xff08;三&#xff09;之拼音插件 elasticsearch插件安装合集 elasticsearch插件安装&#xff08;一&#xff09;之ik分词器安装&#xff08;含MySQL更新&#xff09; elasticsearch 8.x插件&#xff08;二&#xff09;之同义词安装如何解决…

mac-ubuntu虚拟机(扩容-共享-vmtools)

一、磁盘扩容 使用GParted工具对Linux磁盘空间进行扩展 https://blog.csdn.net/Time_Waxk/article/details/105675468 经过上面的方式后还不够&#xff0c;需要再进行下面的操作 lvextend 用于扩展逻辑卷的大小&#xff0c;-l 选项允许指定大小。resize2fs 用于调整文件系统的…

2024 年 11 个最佳开源网络爬虫和抓取工具

用于网络爬行的免费软件库、软件包和 SDK?或者它是您需要的网络抓取工具吗? 嘿,我们是 Apify 。您可以在 Apify 平台上构建、部署、共享和监控您的抓取工具和爬虫。 来看看我们吧。 如果您厌倦了专有网络抓取工具的限制和成本,或者厌倦了被单一供应商锁定,开源网络爬虫和…

Centos安装ZooKeeper教程(单机版)

本章教程介绍,如何在Centos7中,安装ZooKeeper 3.9.3版本。 一、什么是ZooKeeper ? Apache ZooKeeper 是一个分布式协调服务,用于大型分布式系统中的管理和协调。它为分布式应用提供了一个高性能的通信框架,简化了开发人员在构建复杂分布式系统的任务。ZooKeeper 能够解决一…

检索引擎Elasticsearch

一.为什么要用Elasticsearch 由于我们在运行我们的项目的时候通常都是将数据存到mysql或者sql serve等数据库中&#xff0c;在进行数据搜索时使用sql 语句 like进行模糊匹配查询&#xff0c;其一&#xff1a;虽然可以查到数据&#xff0c;但是它模糊匹配查询速度较慢&#xff0…

CentOS9 Stream 支持输入中文

CentOS9 Stream 支持输入中文 方法一&#xff1a;确保 gnome-control-center 和相关组件已更新方法二&#xff1a;手动添加输入法源配置方法三&#xff1a;配置 .xinputrc 文件方法四&#xff1a;检查语言包 进入centos9 stream后&#xff0c;点击右上角电源键&#xff0c;点击…

基于PHP的http字段查询与注册(V1)(持续迭代)

目录 版本说明&#xff1a; 实现环境&#xff08;WAMP&#xff09;&#xff1a; 数据库链接 查询页面 php处理逻辑 字段添加 版本说明&#xff1a; 该查询功能以查询http首部字段为目的实现的字段属性、字段内容的查询&#xff0c;以及对新字段信息的数据注册。 v1实现…

无人机之集群控制方法篇

无人机的集群控制方法涉及多个技术和策略&#xff0c;以确保多架无人机能够协同、高效地执行任务。以下是一些主要的无人机集群控制方法&#xff1a; 一、编队控制方法 领航-跟随法&#xff08;Leader-Follower&#xff09; 通过设定一架无人机作为领航者&#xff08;长机&am…

jenkins搭建及流水线配置

1.安装docker curl https://mirrors.aliyun.com/repo/Centos-7.repo >> CentOS-Base-Aliyun.repomv CentOS-Base-Aliyun.repo /etc/yum.repos.d/yum -y install yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo http://mirrors.aliyun.com/…

Python+Playwright(Nuitka、Pyinstaller打包)

安装驱动 playwright install # 这个安装所有默认的浏览器 playwright install chromium # 一般只装这一个浏览器就够了&#xff0c;要是装另外两个浏览器&#xff0c;后面的参数名可以修改查看各个驱动的位置 playwright install --dry-run创建打包目录 在运行的包里面…

一篇文章理解CSS垂直布局方法

方法1&#xff1a;align-content: center 在 2024 年的 CSS 原生属性中允许使用 1 个 CSS 属性 align-content: center进行垂直居中。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewpo…

《鸿蒙生态:机遇与挑战并行,创新引领未来》

《鸿蒙生态&#xff1a;机遇与挑战并行&#xff0c;创新引领未来》 一、鸿蒙生态崛起&#xff1a;机遇涌现&#xff08;一&#xff09;技术创新引领潮流&#xff08;二&#xff09;市场潜力巨大 二、抓住机遇的策略&#xff08;一&#xff09;开发者的黄金时代&#xff08;二&a…

Fakelocation 步道乐跑(Root真机篇)

前言:需要 Fakelocation&#xff0c;真机Root,步道乐跑&#xff0c;Dia&#xff0c;MT管理器系统需求 Fakelocation | MT管理器 | Dia | 环境模块 任务一 真机Root&#xff08;德尔塔&#xff0c;过momo&#xff0c;刷环境模块&#xff09; 任务二 前往Dia查看包名&#xff08…