下面主要讲一下Bean管理即赋值的三种方法(设值注入,构造注入和自动装配)
项目结构如下图
实体类Student
package com.gxy.entity;/**
* Created by 86157 on 2021/4/19.
*/
/**
* @author 86157
* @version 1.0
* @description: TODO
* @date 2021/4/19 15:45
*/
public class Student {
private int sno;
private String sname;
private int age;
private char gender;
private Teacher teacher;
public Student(int sno, String sname, int age, char gender, Teacher teacher) {
this.sno = sno;
this.sname = sname;
this.age = age;
this.gender = gender;
this.teacher = teacher;
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "Student{" +
"sno=" + sno +
", sname='" + sname + '\'' +
", age=" + age +
", gender=" + gender +
", teacher=" + teacher +
'}';
}
public Student() {
super();
}
}
实体类Teacher
package com.gxy.entity;/**
* Created by 86157 on 2021/4/20.
*/
/**
* @author 86157
* @version 1.0
* @description: TODO
* @date 2021/4/20 15:42
*/
public class Teacher {
private int tid;
private String tname;
private String tprofession;
public Teacher(int tid, String tname, String tprofession) {
this.tid = tid;
this.tname = tname;
this.tprofession = tprofession;
}
public int getTid() {
return tid;
}
public void setTid(int tid) {
this.tid = tid;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public String getTprofession() {
return tprofession;
}
public void setTprofession(String tprofession) {
this.tprofession = tprofession;
}
@Override
public String toString() {
return "Teacher{" +
"tid=" + tid +
", tname='" + tname + '\'' +
", tprofession='" + tprofession + '\'' +
'}';
}
public Teacher() {
super();
}
}
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/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="user" class="com.gxy.entity.Student">
<!–设值注入 setter name与对应实体类中set方法名一致–>
<property name="sno" value="1907272110"/>
<property name="sname" value="王秘书"/>
<property name="age" value="20"/>
<property name="gender" value="女"/>
<property name="teacher" ref="teacher"/>
</bean>
<bean id="teacher" class="com.gxy.entity.Teacher">
<property name="tname" value="王老师"/>
<property name="tid" value="007"/>
<property name="tprofession" value="国际抬杠教练"/>
</bean>
<!--构造注入 底层实现构造方法-->
<bean id="user" class="com.gxy.entity.Student">
<constructor-arg value="1907272110"/>
<constructor-arg value="王秘书"/>
<constructor-arg value="20"/>
<constructor-arg value="女"/>
<constructor-arg ref="teacher"/>
</bean>
<bean id="teacher" class="com.gxy.entity.Teacher">
<constructor-arg>
<value>3001</value>
</constructor-arg>
<constructor-arg>
<value>刘世忠</value>
</constructor-arg>
<constructor-arg>
<value>摄影</value>
</constructor-arg>
</bean>
<!--DI 给对象类型赋值 自动装配-->
<!--不能自动装配所谓简单类型例如基本类型,字符串和集合类 底层实现setter方法-->
<bean id="autostu" class="com.gxy.entity.Student" autowire="byName">
<property name="sno" value="1907272110"/>
<property name="sname" value="王秘书"/>
<property name="age" value="20"/>
<property name="gender" value="女"/>
</bean>
<bean id="teacher" class="com.gxy.entity.Teacher" >
<property name="tid" value="3001"></property>
<property name="tname" value="王老师"></property>
<property name="tprofession" value="地理"></property>
</bean>
</beans>
测试类:
package com.gxy.test;/**
* Created by 86157 on 2021/4/19.
*/
import com.gxy.entity.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author 86157
* @version 1.0
* @description: TODO
* @date 2021/4/19 15:47
*/
public class Test_01 {
@Test
public void method() {
//spring是一个轻量级Ioc和AOP的容器框架 解决类与类之间的解耦合
// 加载spring配置文件,创建工厂
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//根据配置文件中的bean id,获取对象
Student stu = (Student) context.getBean("autostu");
//输出
System.out.println("stu = " + stu);
}
}
Spring,IOC概念:
spring是一个轻量级Ioc和AOP的容器框架 用来解决类与类之间的解耦合 降低企业开发的复杂性
IoC是Inversion of Control的缩写,有的翻译成“控制反转”,还有翻译成为“控制反向”或者“控制倒置”。
个人理解IOC就是对象原来是由程序员创建的,现在交给Spring去处理,但是你要告诉他怎么来创建。
bean就是由IOC容器初始化,装配及管理的对象。
Bean装配:
接下来主要描述三种方法即设值注入,构造注入和自动装配
Bean装配之设值注入:
bean标签中id为标识符,随后会在applicationcontext获取对象时用到,property标签用来给对象赋值,name为实体类中属性名,对于对象类型,使用ref引入,ref通过唯一标识符来查找对象
测试类运行结果如下:
底层实现目前看不出来,现在在实体类中setter,getter,构造方法中加入提示,如下:
现在再来运行下看看结果
从上面我们可以看出来运行后,读取配置文件首先创建了对象,然后调用setter方法进行赋值,由此我们可以得出结论
设值注入底层实现:setter
Bean装配之构造注入:
使用构造注入时,不需要写类中属性名,但是需要按照有参方法中的参数顺序进行依次赋值,否则报错如:
会提示转换值时候报错,也就是说你这个类中类型和你赋值的类型不一致,转化失败,现在正常运行下
构造注入底层实现:构造方法
Bean装配之自动装配:
TIP:DI 给对象类型赋值 自动装配,不能自动装配所谓简单类型例如基本类型,字符串和集合类
autowire属性即自动装配,属性有以下:
这里演示byname即通过名字,通过实体类中对象类型的名字进行装配
运行如下:
自动装配底层实现:setter