当前位置: 首页 > article >正文

Spring框架(1)——IOC(控制权反转)的实现

目录

​编辑

什么是Spring框架

创建对象

1.新建项目

2.导入坐标依赖

 3.编写一个测试Demo

4.编写测试方法

注入属性

1.依赖注入的概述

过程1:利用Set/Get注入

过程2:利用属性构造方法方式注入值


 什么是Spring框架

        Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE.

        它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

        Spring的核心是控制反转(IOC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

IOC:控制权反转

在Java当中创建对象的方式:new关键字,反射。而IOC就是把创建对象的过程交给Spring框架。

Spring实现IOC原理

实现IOC——利用反射的形式把创建对象的权限交给Spring

public static void main(){
    Class clazz=Class.froName("全类名");
    clazz.newInstance();
}

我们把文件的全类名放在一个xml配置文件中,只要上面这个main方法读取到xml里的值,Spring框架就能自动成对象。

AOP:面向切面编程

在不改变源代码的情况之下,对代码功能进行增强。


下面我将介绍如何通过xml的方式实现创建对象和注入属性

创建对象

1.新建项目

新建项目——选择maven项目

2.导入坐标依赖

创建maven工程,导入坐标依赖,这样整个项目就变为一个Spring的项目了。

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <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>

 3.编写一个测试Demo

        在main.java下创建一个类,编写一个具体实现的方法

package com.qcby.service;

public class Demo {
    public void run() {
        System.out.println("hello world");
    }
}

        编写Spring核心的配置文件,在resources目录下创建Spring.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-->
        <!--id:类的唯一标识符 class:类的全路径名-->
        <bean id="demo" class="com.qcby.service.Demo" />
</beans>

4.编写测试方法

创建Test类

package Test;

import com.qcby.service.Cat;
import com.qcby.service.Demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    //传统写法
    @org.junit.Test
    public void test1(){
        Demo demo = new Demo();
        demo.run();
    }

    @org.junit.Test
    public void test2(){
        ApplicationContext context=new ClassPathXmlApplicationContext("Spring.xml");
        Demo demo = (Demo) context.getBean("demo");
        demo.run();
    }
}

 测试结果如下:


补充!!Spring对对象的一种管理
 Spring对bean的管理

管理方式

1.基于xml配置的形式实现

2.通过注解的方式实现

实现功能

1.创建对象

2.注入属性

注入属性

1.依赖注入的概述

IOC和DI的概念

IOC:Inverse of Control,控制反转,将对象的创建权反转给Spring

DI:Dependency Injection,依赖注入,就是注入属性


过程1:利用Set/Get注入

属性的set方法注入值:编写属性,提供该属性对应的set方法,编写配置文件完成属性值的注入

Demo类

package com.qcby.service;

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

public class Demo {
    // 编写成员属性,一定需要提供该属性的set方法
    //IOC容器底层就通过属性的set方法方式注入值
    private String name;
    private  int age;
    private Cat cat;

    private String[] strings;
    private List<String> list;
    private Map<String,String> map;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    public String[] getStrings() {
        return strings;
    }

    public void setStrings(String[] strings) {
        this.strings = strings;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "Demo{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", cat=" + cat +
                ", strings=" + Arrays.toString(strings) +
                ", list=" + list +
                ", map=" + map +
                '}';
    }
}

xml文件

关键标签为property

<bean id="demo" class="com.qcby.service.Demo" >
                <!--使用property完成属性注入
                        name:类里面属性名称
                        value:向属性注入值
                        ref:对象映射
                -->
                <property name="name" value="张三"/>
                <property name="age" value="19"/>
                <property name="cat" ref="cat"/>
                <property name="strings">
                        <array>
                                <value>aa</value>
                                <value>bb</value>
                                <value>cc</value>
                        </array>
                </property>
                <property name="list">
                        <list>
                                <value>dd</value>
                                <value>ee</value>
                        </list>
                </property>
                <property name="map">
                        <map>
                                <entry key="aa" value="老王"/>
                                <entry key="bb" value="老张"/>
                        </map>
                </property>
        </bean>

 注意!!数组,集合(List,Set,Map)等的set注入

<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 key="bbb" value="小王"/>
        </map>
    </property>

Test类:

 @org.junit.Test
    public void test2(){
        ApplicationContext context=new ClassPathXmlApplicationContext("Spring.xml");
        Demo demo = (Demo) context.getBean("demo");
        System.out.println(demo.toString());
    }
}

过程2:利用属性构造方法方式注入值

属性构造方法方式注入值:对于类成员变量,构造函数注入

Cat类

我们生成了一个构造函数

package com.qcby.service;

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

public class Cat {
    private String name;
    private Double money;
    private String[] strings;
    private List<String> list;
    private Map<String,String> map;

    public Cat(String name, Double money, String[] strings, List<String> list, Map<String, String> map) {
        this.name = name;
        this.money = money;
        this.strings = strings;
        this.list = list;
        this.map = map;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", money=" + money +
                ", strings=" + Arrays.toString(strings) +
                ", list=" + list +
                ", map=" + map +
                '}';
    }

    public void run(){
        System.out.println("小猫跑得很快");
    }

}

xml文件

 关键标签变为constructor-arg

<bean id="cat" class="com.qcby.service.Cat">
                <constructor-arg name="name" value="张三"/>
                <constructor-arg name="money" value="100.5"/>
                <constructor-arg name="strings">
                        <array>
                                <value>aaa</value>
                                <value>bbb</value>
                                <value>ccc</value>
                        </array>
                </constructor-arg>
                <constructor-arg name="list">
                        <list>
                                <value>ddd</value>
                                <value>eee</value>
                        </list>
                </constructor-arg>
                <constructor-arg name="map">
                        <map>
                                <entry key="aaa" value="老王"/>
                                <entry key="bbb" value="老张"/>
                        </map>
                </constructor-arg>
        </bean>

  注意!!数组,集合(List,Set,Map)等的set注入

 <constructor-arg index="0">
        <array>
            <value>aaa</value>
            <value>bbb</value>
            <value>ccc</value>
        </array>
    </constructor-arg>
    <constructor-arg index="1">
        <list>
            <value>小黑</value>
            <value>小白</value>
        </list>
    </constructor-arg>
    <constructor-arg index="2">
        <map>
            <entry key="aaa" value="小黑"/>
            <entry key="bbb" value="小号"/>
        </map>
    </constructor-arg>

Test类 

@org.junit.Test
    public void test2(){
        ApplicationContext context=new ClassPathXmlApplicationContext("Spring.xml");
        Cat cat=(Cat) context.getBean("cat");
        System.out.println(cat.toString());
    }


http://www.kler.cn/a/445263.html

相关文章:

  • qt 类中的run线程
  • Python国内10个镜像源-地址汇总以及测评
  • webpack处理图片资源
  • 方正畅享全媒体新闻采编系统 screen.do SQL注入漏洞复现
  • EasyGBS国标GB28181平台P2P远程访问故障排查指南:客户端角度的排查思路
  • 凯酷全科技抖音电商服务的卓越践行者
  • 深度比较:OpenNI2 SDK与Orbbec SDK的功能、优势和选择指南
  • parquet类型小文件合并
  • ESP32单片机开发
  • uniApp上传文件踩坑日记
  • 【C++ 无限循环】1625. 执行操作后字典序最小的字符串|1992
  • 深度学习在岩土工程中的应用与实践
  • PHP代码审计学习--zzcms8.1
  • 打靶记录22——Tomato
  • workman服务端开发模式-GatewayWorker的使用
  • JNDI基础
  • 【Threejs】从零开始(八)--贴图
  • list的常用操作
  • SQL server学习08-使用索引和视图优化查询
  • 使用Python开发高级游戏:创建一个3D射击游戏
  • C# OpenCV机器视觉:边缘检测
  • AI、大数据、机器学习、深度学习、神经网络之间的关系
  • 视频及JSON数据的导出并压缩
  • 数据库高可用性与容灾
  • 【k8s集群应用】kubeadm1.20(单master)
  • 电脑玩《刺客信条》时中,遇到找不到d3dx9_42.dll的问题是什么原因?缺失d3dx9_42.dll应该怎么解决呢?下面一起来看看吧!