Spring-IOC容器-ApplicationContext

news/2024/12/22 20:06:22/

IOC:Inversion of Control 控制反转,是一种设计原则,spring 中通过DI(dependency Injection)来具体实现。

比如原本对象的实例化,是通过程序主动New出来,IOC中的对象实例交给Spring框架来实例化,程序使用时直接通过spring获取即可。

1、IOC容器实例化对象的方式--构造方法

实体类:

java">package com.text.entity;public class Student {private String name;private int age;public Student() {System.out.println("无参构造方法:" + this.hashCode());}public Student(String name, int age) {System.out.println("有参构造方法:" + this.hashCode());this.name = name;this.age = age;}
}

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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="s1" class="com.text.entity.Student"></bean><bean id="s2" class="com.text.entity.Student"><constructor-arg name="name" value="张三"/><constructor-arg name="age" value="18"/></bean>
</beans>

测试类:运行后输出 

无参构造方法:6018
有参构造方法:6018
null
张三

java">package com.text.entity;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {String configLocation = "classpath:applicationContext.xml";//spring IOC容器ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);Student s1 = context.getBean("s1", Student.class);Student s2 = context.getBean("s2", Student.class);System.out.println(s1.getName());System.out.println(s2.getName());}
}

其中:ClassPathXmlApplicationContext 加载的路径文件classpath:applicationContext.xml称作路径表达式,具体形式参考如下表格示例

对于本项目的classpath 就是下图target/classes文件夹:

2、对象依赖注入(DI)

示例:将课程对象注入到学生对象中

配置文件: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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="course" class="com.text.entity.Course"><constructor-arg name="name" value="语文"/></bean><bean id="student" class="com.text.entity.Student"><property name="name" value="张三"/><property name="age" value="20"/><property name="course" ref="course"/></bean>
</beans>

实体类:

java">package com.text.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Course {private String name;//课程名称
}
java">package com.text.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private String name;private int age;private Course course;
}

测试类:

java">package com.text.entity;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {String configLocation = "classpath:applicationContext.xml";//spring IOC容器ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);Course course = context.getBean("course",Course.class);Student student = context.getBean("student",Student.class);System.out.println(student);//Student(name=张三, age=20, course=Course(name=语文))System.out.println(course);//Course(name=语文)System.out.println(student.getCourse() == course); //true}
}

3、查询IOC容器对象示例详情

通过ApplicationContext.getBeanDefinitionNames 方法获取IOC容器中的已经实例化的对象名

java">package com.text.entity;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {String configLocation = "classpath:applicationContext.xml";//spring IOC容器ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);Course course = context.getBean("course",Course.class);String[] beanDefinitionNames = context.getBeanDefinitionNames();for(String beanDefinitionName:beanDefinitionNames) {System.out.print(beanDefinitionName + "\t");//course	student	}}
}


http://www.ppmy.cn/news/1526531.html

相关文章

爬虫全网抓取

爬虫全网抓取是指利用网络爬虫技术&#xff0c;通过自动化的方式遍历互联网上各个网站、论坛、博客等&#xff0c;从这些网页中提取所需的数据。它通常涉及以下几个步骤&#xff1a; 目标设定&#xff1a;确定要抓取哪些类型的网页内容&#xff0c;比如新闻、商品信息、用户评论…

Error: ReferenceError: ReadableStream is not defined

midway项目在build完&#xff0c;docker启动时&#xff0c;莫名地报错Error: ReferenceError: ReadableStream is not defined&#xff0c;之前一直好好地&#xff0c;初时以为是新加的代码引起&#xff0c;后来排除了。 报错如下&#xff1a; 2024-08-20 11:57:51.446 ERROR …

SAP EWM Cross Docking (CD) 越库操作

目录 1 介绍 2 业务流程 3 后台配置主数据 4 业务操作 1 介绍 EWM Cross Docking 又称“越库操作”&#xff0c;即从仓库的一个道口直接跳到另一个道口。这样操作都不用想&#xff0c;肯定是为了仓库工作效率。CD 分两部分&#xff0c;一个是“计划性越库”&#xff0c;另…

asp.net core调用wps实现word转pdf的方法

1&#xff0c;首先安装wps&#xff0c;从官网下载安装包 2&#xff0c;创建.net core控制项目 添加com引用&#xff0c;搜索wps 准备一个word文档&#xff0c;名字叫001.docx&#xff0c;随便编写一些文字内容 3&#xff0c;word转pdf 编写代码 namespace WPSStu01 {inter…

UVM仿真的运行(四)—— objection 机制

0. 引言 前面介绍了uvm仿真的启动,按照domain中指定的DAG的phase node 顺序执行各个组件的phase。 在执行run_phase node的Executing 状态时,以fork...join_none的方式在后台调用run_phase imp的traverse方法去并行执行各个component的run_phase方法,同时会等待task运行结…

Spring security 动态权限管理(基于数据库)

一、简介 如果对该篇文章不了解&#xff0c;请移步上一篇文章&#xff1a;spring security 中的授权使用-CSDN博客 当我们配置的 URL 拦截规则请求 URL 所需要的权限都是通过代码来配置的&#xff0c;这样就比较死板&#xff0c;如果想要调整访问某一个 URL 所需要的权限&…

【网络安全】基础知识详解(非常详细)零基础入门到精通

一、什么是网络安全&#xff1f; 百度上对“网络安全”是这么介绍的&#xff1a; “网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露、系统连续可靠正常地运行&#xff0c;网络服务不中断。” 嗯…是不…

libmodbus:写一个modbusTCP服务

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…