依赖注入IOC

简介: 依赖注入IOC

简介:由spring容器进行对象的创建和依赖注入,使用时取出来

反转:由spring容器进行对象的创建和依赖注入称为反转,将控制权从程序员手中夺走,交给spring容器,称为反转

<bean id="stu" class = "com.bjpowernode.pojo.Student">
//spring容器负责对象创建
<property name="name" value="张三">
//spring容器依赖注入值
</bean>

由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">
    <!--创建对象-->
    <bean id = "stu" class="org.example.Student"></bean>
</beans>
package org.example;

public class Student {
    private String name;
    private int age;
    public Student(){
        System.out.println("student类的无参构造方法");
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类

package org.example.text;

import org.example.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class myText {
    @Test
    public void textStudent(){
        Student student = new Student();
    }
    @Test
    public void testStudentSpring(){
        //由spring容器创建对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student stu = (Student) ac.getBean("stu");
        System.out.println(stu);
    }
}

给创建的对象赋值

  1. 使用setter注入

    1. 简单类型注入使用value属性
    <bean id = "stu" class="org.example.Student">
        <property name="name" value="张三"></property>
        <property name="age" value="88"></property>
    </bean>
    1. 引用类型主人椅使用ref属性
    <bean id = "stu" class="org.example.pojo2.Student">
        <property name="name" value="lily"></property>
        <property name="age" value="12"></property>
        <property name="school" ref="school"></property>
    </bean>
    1. 注意:使用setter注入必须提供无参的构造方法,必须提供setXXX()方法。
      三层架构
<?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">
    <!--创建对象-->
    <!--创建数据访问层对象-->
    <bean id = "uMapper" class = "org.example.dao.UsersMapperImpl">
    </bean>
    <!--创建业务逻辑层的对象-->
    <bean id = "uService" class="org.example.service.impl.UsersServiceImpl">
        <property name="usersMapper" ref="uMapper"></property>
    </bean>
    <!--创建界面层对象-->
    <bean id = "uController" class="org.example.controller.UsersController">
        <property name="usersService" ref="uService"></property>
    </bean>
</beans>
  1. 使用构造方法注入

    1. 使用构造方法的参数名称进行注入值
      ==使用标签==
    <!--创建school对象-->
    <bean id="school" class="org.example.pojo3.School">
        <constructor-arg name="name" value="清华大学" ></constructor-arg>
        <constructor-arg name="address" value="海淀区" ></constructor-arg>
    </bean>
    @Test
        public void textSchool(){
            ApplicationContext ac = new ClassPathXmlApplicationContext("r3/applicationContext.xml");
            School school = (School) ac.getBean("school");
            System.out.println(school.toString());
        }
    1. 使用构造方法的下标进行注入值
    <!--创建学生对象,使用构造方法下标注入值-->
    <bean id = "stu" class="org.example.pojo3.Student">
        <constructor-arg index="0" value="tony"></constructor-arg>
        <constructor-arg index="1" value="23"></constructor-arg>
        <constructor-arg index="2" ref="school"></constructor-arg>
    </bean>
    1. 使用默认的构造方法的参数的顺序注入值
      参考2,不使用index,按顺序注入

创建对象的注解

@Component:可以创建任意对象,创建的对面默认名称是类名的驼峰命名法,也可以指定【@Component("")】

<!--添加包扫描-->
    <context:component-scan base-package="org.example.s01"></context:component-scan>
ApplicationContext ac = new ClassPathXmlApplicationContext("s01/applicationContext.xml");
Student stu = (Student) ac.getBean("student");

@Controller:专门用来创建控制器的对象(Servlet),这种对象可以接收用户的请求,可以返回处理结果给客户端

@service:专门用来创建业务逻辑层的对象,负责向下访问数据访问层,处理完毕后的结果返回给界面层

@Repository:专门用来创建数据访问层的对象,负责数据库中的增删改查所以操作

相关文章
|
SQL 存储 分布式计算
Spark Doris Connector设计方案
Spark Doris Connector 是Doris在0.12版本中推出的新功能。用户可以使用该功能,直接通过Spark对Doris中存储的数据进行读写,支持SQL、Dataframe、RDD等方式。从Doris角度看,将其数据引入Spark,可以使用Spark一系列丰富的生态产品,拓宽了产品的想象力,也使得Doris和其他数据源的联合查询成为可能。
1195 0
Spark Doris Connector设计方案
|
存储 分布式数据库 Hbase
HBase scan过程简析
HBase scan过程简析。 scan过程总体上是分层处理的,与存储上的组织方式一致,脉络比较清晰; 具体来说,就是region->store→hfile/memstore,分别都有对应的scanner实现进行数据读取; scan请求本身设置的条件,以及server和table层面的一些参数限制,会根据需要分布在不同层次的scanner中进行处理; 2.
2549 0
HBase scan过程简析
|
Linux
BUU [安洵杯 2019]easy_web
BUU [安洵杯 2019]easy_web
308 0
|
10月前
|
存储 SQL 关系型数据库
服务器数据恢复—云服务器上mysql数据库数据恢复案例
某ECS网站服务器,linux操作系统+mysql数据库。mysql数据库采用innodb作为默认存储引擎。 在执行数据库版本更新测试时,操作人员误误将在本来应该在测试库执行的sql脚本在生产库上执行,导致生产库上部分表被truncate,还有部分表中少量数据被delete。
275 25
|
9月前
|
Web App开发 人工智能
翻译类插件 实现英文文献自由
这是一组提升阅读与学习效率的翻译及语言辅助插件简介,包含:Google 翻译(快速整页翻译)、彩云小译(AI 翻译支持双语对照)、DeepL Translator(高精准度翻译)、Mate Translate(单词翻译带发音例句)和 Readlang Web Reader(生词点击翻译与保存功能)。以上工具各具特色,满足不同场景下的翻译与学习需求。
274 4
|
机器学习/深度学习 人工智能 分布式计算
【AI系统】混合并行
混合并行融合了数据并行、模型并行和流水线并行,旨在高效利用计算资源,尤其适合大规模深度学习模型训练。通过将模型和数据合理分配至多个设备,混合并行不仅提升了计算效率,还优化了内存使用,使得在有限的硬件条件下也能处理超大型模型。3D混合并行(DP+PP+TP)是最先进的形式,需至少8个GPU实现。此策略通过拓扑感知3D映射最大化计算效率,减少通信开销,是当前深度学习训练框架如Deepspeed和Colossal AI的核心技术之一。
554 15
【AI系统】混合并行
|
11月前
|
JavaScript Java C#
【Typora-markdown语言】使用说明【指南】
Typora-markdown语言的使用说明和常见用法,好用的做笔记的工具软件及使用方法指南。目录 一、标题 二、段落 1、换行 2、分割线 三、文字显示 1、字体 2、上下标 四、列表 1、无序列表 2、无序列表 3、任务列表 五、区块显示 六、代码显示 1、行内代码 2、代码块 七、链接 八、脚注 九、图片插入 十、表格 十一、表情符号 语法: #(一级标题)##(二级标题)###(三级标题)。。。快捷键: Ctrl+数字1~6可以快速将选中的文本调成对
302 9
|
机器学习/深度学习 人工智能 自然语言处理
【AI大模型】LLM主流开源大模型介绍
【AI大模型】LLM主流开源大模型介绍
|
Cloud Native 关系型数据库 分布式数据库
数据之势丨云原生数据库,走向Serverless与AI驱动的一站式数据平台
在大模型席卷之下,历史的齿轮仍在转动,很多人开始思考,大模型能为数据库带来哪些改变。阿里云数据库产品事业部负责人李飞飞表示,数据库和智能化的结合是未来非常重要的发展方向,数据库的使用门槛将大幅降低。