一、介绍
1.set注入和构造器注入是什么?
spring的控制反转(ioc)与依赖注入实现方式(di)_云边的快乐猫的博客-csdn博客
2.通俗的理解
已知:当前的spring框架不需要自己创建对象了。这些对象都交给spring的bean容器去管理。
那么想要这些对象想要关联起来或者传值进去怎么办呢?
那就要用到注入。 例如一个cat猫类对象想要使用dog狗类中的方法。那么怎么办呢?
按照以前没有使用spring的思路就是:在cat类中去实例化dog类,然后调用dog类的方法
用spring后:那就是在统一托管对象的spring容器里面去调用就好了。cat类直接在spring容器里面调用dog的方法就可以了
3.set注入和构造器注入的核心原理
(1)set注入的核心原理
通过反射机制调用set方法给属性赋值,让两个对象之间产生关系
(2)构造器注入的核心原理
通过调用构造方法来给属性赋值
4.set注入和构造器注入的类型
set注入有两种类型:引用类型、简单类型
构造器有两种类型:引用类型、简单类型
引用类型和简单类型区别:java数据类型(8个基本数据类型 3个引用数据类型)与数据类型转换知识点_java三种引用数据类型_云边的快乐猫的博客-csdn博客
5.set注入的外部bean和内部bean
(1)外部bean:在spring的自定义xml配置bean文件中配置的bean含有ref引用的就是外部bean
(2)内部bean:在spring的自定义xml配置bean文件中配置的property标签再内嵌一个bean(不含id)
(一)set注入
实验目标:创建一个dog类,一个cat类,交给spring中心托管。然后把dog类的方法注入到cat类里面,让cat类去调用。本项目用的是maven项目
这里面有创建maven项目的方法
快速入门使用spring详细步骤(介绍、导入依赖、第一个简单程序)_云边的快乐猫的博客-csdn博客
1.创建一个dog类
package com.spring6.bean;
public class dog {
//1.新建一个方法
public void dogeat(){
system.out.println("这是狗的方法");
}
}
2.创建一个cat类
ps:被注入的cat类里面要先写入要注入目标的私有对象.类.方法。然后生成一个set方法
然后类本身创建一个方法,去调用这个注入的对象方法
package com.spring6.bean;
public class cat {
//一、要注入cat里面的方法
//1.dog私有方法
private dog dogeat;
//2.生成一个set方法
public void setdog(dog dog) {
this.dogeat = dog;
}
//二、写cat自己的方法
public void cat(){
//3.调用注入狗的方法
dogeat.dogeat();
}
}
3.dog类和cat类统一交给spring管理
步骤:在resources里面创建一个配置xml文件。然后写入dog和cat这两个类的spring管理方式。
注入类:dog。被注入类:cat。就像cat类里面被针管容器注入dog类的方法
ps:不理解创建这个xml文件的可以看这篇文章
快速入门使用spring详细步骤(介绍、导入依赖、第一个简单程序)_云边的快乐猫的博客-csdn博客
4.test测试的java包里面创建一个包一个测试类去测试运行
package com.spring6.text;
import com.spring6.bean.cat;
import org.junit.test;
import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;
public class springttext {
@test
public void tt(){
//1.半固定写法,扫描spring的xml文件(不固定的是要扫描的是哪个xml文件)
applicationcontext applicationcontext =new classpathxmlapplicationcontext("spring.xml");
//2.半固定写法,获取spring里面要进行运行的类(不固定的是括号里面的,name为:要运行类的id,后面跟着的是要运行的类.class)
cat catbean = applicationcontext.getbean("catbean", cat.class);
//3.上面自定义名.要运行类的方法
catbean.cat();
}
}
5.运行结果(cat类被注入了dog类的方法)
(二)构造器注入
实验目标:创建一个dog类,一个cat类,交给spring中心托管。然后把dog类的方法注入到cat类里面,让cat类去调用。 目标和set一样,用的方式不一样而已
1.创建一个dog类
package com.spring6.bean;
public class dog {
//1.新建一个方法
public void dogeat(){
system.out.println("这是狗的方法");
}
}
2.创建一个cat类
ps:被注入的cat类里面要先写入要注入目标的私有对象.类.方法。然后生成一个构造方法
然后类本身创建一个方法,去调用这个注入的对象方法
3.dog类和cat类统一交给spring管理
步骤:在resources里面创建一个配置xml文件。然后写入dog和cat这两个类的spring管理方式。
注入类:dog。被注入类:cat。就像cat类里面被针管容器注入dog类的方法
ps:区别就是注入的这里这个可以自动扫描,也可以用name,也可以用序列号
4.test测试的java包里面创建一个包一个测试类去测试运行
ps:这个和set注入的第4步一样
package com.spring6.text;
import com.spring6.bean.cat;
import org.junit.test;
import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;
public class springttext {
@test
public void tt(){
//1.半固定写法,扫描spring的xml文件(不固定的是要扫描的是哪个xml文件)
applicationcontext applicationcontext =new classpathxmlapplicationcontext("spring.xml");
//2.半固定写法,获取spring里面要进行运行的类(不固定的是括号里面的,name为:要运行类的id,后面跟着的是要运行的类.class)
cat catbean = applicationcontext.getbean("catbean", cat.class);
//3.上面自定义名.要运行类的方法
catbean.cat();
}
}
5.运行结果(cat类被注入了dog类的方法)
ps:这个和set注入的第5步一样
实验目标:创建一个user类,属性有名字和年龄。用spring的xml方式注入具体的值
(一)set注入
1.创建一个user类。里面带有名字和年龄属性,快捷键生成set方法和tostring方法
package com.spring6.bean;
public class user {
//1.创建类的属性
private string username;
private int age;
//2.快捷键生成set方法
public void setusername(string username) {
this.username = username;
}
public void setage(int age) {
this.age = age;
}
//3.快捷键生成tostring方法
@override
public string tostring() {
return "user{"
"username='" username '\''
", age=" age
'}';
}
}
2.创建一个spring的xml文件里面配置bean和注入属性具体的值
3. test测试的java包里面创建一个包一个测试类去测试运行
package com.spring6.text;
import com.spring6.bean.user;
import org.junit.test;
import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;
public class springttext {
@test
public void tt(){
//1.半固定写法,扫描spring的xml文件(不固定的是要扫描的是哪个xml文件)
applicationcontext applicationcontext =new classpathxmlapplicationcontext("spring.xml");
//2.半固定写法,获取spring里面要进行运行的类(不固定的是括号里面的,name为:要运行类的id,后面跟着的是要运行的类.class)
user username = applicationcontext.getbean("userbean", user.class);
//3.运行这个方法
system.out.println(username);
}
}
4.运行结果
(二)构造器注入
1.创建一个user类。快捷键生成构造器方法和tostring方法
package com.spring6.bean;
public class user {
//1.创建类的属性
private string username;
private int age;
public user(string username, int age) {
this.username = username;
this.age = age;
}
@override
public string tostring() {
return "user{"
"username='" username '\''
", age=" age
'}';
}
}
2.创建一个spring的xml文件里面配置bean和注入属性具体的值
3. test测试的java包里面创建一个包一个测试类去测试运行
package com.spring6.text;
import com.spring6.bean.user;
import org.junit.test;
import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;
public class springttext {
@test
public void tt(){
//1.半固定写法,扫描spring的xml文件(不固定的是要扫描的是哪个xml文件)
applicationcontext applicationcontext =new classpathxmlapplicationcontext("spring.xml");
//2.半固定写法,获取spring里面要进行运行的类(不固定的是括号里面的,name为:要运行类的id,后面跟着的是要运行的类.class)
user username = applicationcontext.getbean("userbean", user.class);
//3.运行这个方法
system.out.println(username);
}
}
4.运行结果
ps:感觉set注入和构造注入就快捷键生成的代码不一样,一个生成set方法,一个生成构造器方法。xml配置里面也有些细微不一样而已,其他的大致一样