Spring bean为什么需要依赖注入
作者:宁在春 发布时间:2022-01-24 11:07:21
标签:Spring,bean,注入
具体步骤:
1.创建一个maven项目 spring-day1-constructor
2.导入依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--这里是java 版本号-->
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<!--这里是方便版本控制-->
<spring.version>5.3.1</spring.version>
<lombok.version>1.18.20</lombok.version>
<junit.version>4.12</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
3.工程项目结构
样例1:
1.创建一个Student类
public class Student {
private Long number;
private String name;
private String school;
public void setNumber(Long number) {
this.number = number;
}
public void setName(String name) {
this.name = name;
}
public void setSchool(String school) {
this.school = school;
}
public Student() {
}
public Student(Long number, String name, String school) {
this.number = number;
this.name = name;
this.school = school;
}
@Override
public String toString() {
return "Student{" +
"number=" + number +
", name='" + name + '\'' +
", school='" + school + '\'' +
'}';
}
}
写一个配置文件
<?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="s1" class="com.crush.pojo.Student">
<constructor-arg index="0" value="12"/>
<constructor-arg index="1" value="wyh"/>
<constructor-arg index="2" value="北大"/>
</bean>
<!--这里是根据构造函数中的 类型来进行注入 -->
<bean id="s2" class="com.crush.pojo.Student">
<constructor-arg type="java.lang.Long" value="123"/>
<constructor-arg type="java.lang.String" value="crush"/>
<constructor-arg type="java.lang.String" value="浙江大学"/>
</bean>
</beans>
3.测试
@org.junit.Test
public void testStudent(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
Student student = applicationContext.getBean("s2", Student.class);
System.out.println(student);
}
样例2:
1.创建Teacher类
public class Teacher {
private String name;
private String school;
private List<Student> studentList;
private Map<String,String> map;
private Set<String> set;
public Teacher(String name, String school, List<Student> studentList, Map<String, String> map, Set<String> set) {
this.name = name;
this.school = school;
this.studentList = studentList;
this.map = map;
this.set = set;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", school='" + school + '\'' +
", studentList=" + studentList +
", map=" + map +
", set=" + set +
'}';
}
}public class Teacher {
private String name;
private String school;
private List<Student> studentList;
private Map<String,String> map;
private Set<String> set;
public Teacher(String name, String school, List<Student> studentList, Map<String, String> map, Set<String> set) {
this.name = name;
this.school = school;
this.studentList = studentList;
this.map = map;
this.set = set;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", school='" + school + '\'' +
", studentList=" + studentList +
", map=" + map +
", set=" + set +
'}';
}
}
2.beans.xml
<bean id="teacher" class="com.crush.pojo.Teacher">
<constructor-arg index="0" value="xxx"/>
<constructor-arg index="1" value="北京大学"/>
<constructor-arg index="2" >
<list>
<ref bean="s1"/>
<ref bean="s2"/>
</list>
</constructor-arg>
<constructor-arg index="3">
<map>
<entry key="k1" value="xiaowang"/>
</map>
</constructor-arg>
<constructor-arg index="4">
<set>
<value>1</value>
<value>2</value>
</set>
</constructor-arg>
</bean>
3.测试
@org.junit.Test
public void testTeacher(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
Teacher teacher = applicationContext.getBean("teacher", Teacher.class);
System.out.println(teacher);
}
Spring单例模式和原型模式
一、单例模式
Spring默认是单例模式的。
以Student的那个样例1 为例。 scope=“singleton” 加上这么一个设置 当然默认也是它。
bean id="s1" class="com.crush.pojo.Student" scope="singleton">
<constructor-arg index="0" value="12"/>
<constructor-arg index="1" value="wyh"/>
<constructor-arg index="2" value="北大"/>
</bean>
这个时候我们来进行测试
@org.junit.Test
public void testStudent(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
Student student1 = applicationContext.getBean("s1", Student.class);
Student student2 = applicationContext.getBean("s1", Student.class);
// 并且如果我们对其中一个做了修改 ,其余也会跟着一起被修改
// 可以看到我们只修改了一个
student1.setSchool("梦中的学校");
System.out.println(student1);
System.out.println(student2);
System.out.println(student1==student2);
}
二、原型模式
我们还是以**Student来做例子讲解 **注意:我们把原来设置改成了 scope=“prototype” 也就是原型模式
<!--这里是根据构造函数中的 类型来进行注入 -->
<bean id="s2" class="com.crush.pojo.Student" scope="prototype">
<constructor-arg type="java.lang.Long" value="123"/>
<constructor-arg type="java.lang.String" value="crush"/>
<constructor-arg type="java.lang.String" value="浙江大学"/>
</bean>
接着测试
@org.junit.Test
public void testStudent(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
Student student1 = applicationContext.getBean("s2", Student.class);
Student student2 = applicationContext.getBean("s2", Student.class);
// 并且如果我们对其中一个做了修改 ,其余也会跟着一起被修改
// 可以看到我们只修改了一个
student1.setSchool("梦中的学校");
System.out.println(student1);
System.out.println(student2);
System.out.println(student1==student2);
}
思考 为什么需要依赖注入
为什么我们以前用一个对象 new一下就好了,但用了Spring 之后,反而还需要写
这样一段代码再去获取勒?明明感觉更麻烦啦丫?用这个又有什么样的好处呢?
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
Student student1 = applicationContext.getBean("s2", Student.class);
来源:https://blog.csdn.net/weixin_45821811/article/details/117675372


猜你喜欢
- 一、Quartz的特点* 按作业类的继承方式来分,主要有以下两种:1.作业类继承org.springframework.scheduling
- 字符串采用unicode编码的方式时,计算字符串长度的方法找出UNICODE编码中的汉字的代表的范围“\u4E00” 到“\u9FBB”之间
- 高分配速率(High Allocation Rate)分配速率(Allocation rate)表示单位时间内分配的内存量。通常使用&nbs
- 前言当您使用LINQ来处理数据库时,这种体验是一种神奇的体验,对吗?你把数据库实体像一个普通的收集,使用Linq中像Where,Select
- 市面上有好多的类比ListView刷新数据的开源框架,如:v4包自带的SwipeRefreshLayout ,以及集ListView、Gri
- Java 8的18个常用日期处理一、简介伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API。J
- 简介SPI(Service Provider Interface)是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要用
- 1-:生成一个签名密钥你可以用keytool命令生成一个私有密钥。在Windows上keytool命令放在JDK的bin目录中(比如C:\P
- 本文实例讲述了Android编程实现AIDL(跨进程通信)的方法。分享给大家供大家参考,具体如下:一. 概述:跨进程通信(AIDL),主要实
- Android 想判断 Activity 是否是全屏,网上找了些方法,看到有直接获取 flags 和一个具体的值比较,并没有用,其实分析下来
- 如执行:"2|33|4".split("|")出来的结果是:""2334奇怪吧,
- 之前使用Retrofit都是将JSON串转化为POJO对象,针对不同的业务协议,定义相应的接口和参数列表。但是此种方式一般用在自己内部协议基
- 前言:在Java项目中,有两个主要的构建系统:Gradle和Maven。构建系统主要管理潜在的复杂依赖关系并正确编译项目。还可以将已编译的项
- SpringMVC文件上传中要解决的问题一、中文文件名编码问题通过过滤器解决二、文件位置存储问题放在当前项目下,作为静态资源,这样可以通过U
- 引言从本篇文章开始,我们将介绍 Java AQS 的实现方式,本文先介绍 AQS 的内部数据是如何组织的,后面的文章中再分别介绍 AQS 的
- Maven 错误找不到符号问题,通常有三种原因: 1. 可能项目编码格式不统一。 2. 可能项目编码使用的JDK版本不统一。 3
- 动态获取对象的性能值,这个在开发过程中经常会遇到,这里我们探讨一下何如高性能的获取属性值。为了对比测试,我们定义一个类Peoplepubli
- 模式介绍命令模式(Command Pattern) :在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被
- Stripe支付首页需要引用Stripe.net框架,我引用的是22.8.0版本,注意.NETFramework的版本为4.5,同时需要引用
- 代码案例一:private void button1_Click(object sender, EventArgs e) &n