创建自己的免费网站,p2vr做的网站上传,建立电子商务网站目的,手机优化应用是怎么回事【知识要点】
控制反转#xff08;IOC#xff09;将对象的创建权限交给第三方模块完成#xff0c;第三方模块需要将创建好的对象#xff0c;以某种合适的方式交给引用对象去使用#xff0c;这个过程称为依赖注入#xff08;DI#xff09;。如#xff1a;A对象如果需要…【知识要点】
控制反转IOC将对象的创建权限交给第三方模块完成第三方模块需要将创建好的对象以某种合适的方式交给引用对象去使用这个过程称为依赖注入DI。如A对象如果需要使用B对象的方法则A类依赖B类。对象装配是在对象构造过程中对其属性进行初始化。对象的属性分为简单数据类型和复杂数据类型简单数据类型通常指String、List、map等由高级语言提供的数据类型复杂数据类型用户自定义数据类型或第三方的数据类型对象的装配主要指对复杂数据类型的依赖注入DI。
【实验目的】
了解基于xml的装配技术熟悉基于注解的装配技术掌握使用注解符Autowired和Resource的使用
【实验内容】
定义学生类Student、课程类Course、班主任ClassTeacher学生类Student中有姓名、课程集合和班主任三个属性对学生对象进行装配。基于xml的设值注入基于xml的构造注入基于注解的装配基于自动装配
【实验步骤】
一. 实验环境搭建
标准的spring控制台程序spring-assemble-demo5在源代码com.bjwl.service包中增加Student、Course、ClassTeacher三个类具体代码如下所示。
public class Student { private String sname; private Integer sage; private ListCourse courses; private Teacher classTeacher;
} public class Course { private String courseName;
} public class Teacher { private String tname;
}2. 基于xml的设值注入
设置注入类中必须有对应的setter方法和无参构造函数对类Student中的代码改造如下所示。
public class Student { private String sname; private Integer sage; private ListCourse courses; private Teacher classTeacher; public void setSname(String sname) { this.sname sname; } public void setSage(Integer sage) { this.sage sage; } public void setCourses(ListCourse courses) { this.courses courses; } public void setClassTeacher(Teacher classTeacher) { this.classTeacher classTeacher; } Overridepublic String toString() {return Student{ sname sname \ , sage sage , courses courses , classTeacher classTeacher };}
} 类Course 和Teacher 按照上述代码添加setter方法在此不再赘述。 2. 在resources目录下添加spring配置文件spring-assemble-set.xml代码如下所示。
beans !--基于属性注入设置注入的bean装配-- bean idteacher classcom.bjwl.service.setter.Teacher property nametname value李老师/property /bean bean idstudent classcom.bjwl.service.setter.Student property namesname value张三/property property namesage value18/property property nameclassTeacher refteacher/property property namecourses list value-typecom.bjwl.service.setter.Course bean classcom.bjwl.service.setter.Course property namecourseName value数据结构/property /bean bean classcom.bjwl.service.setter.Course property namecourseName value数据库原理/property /bean /list /property /bean
/beans 在配置文件中property对应对象的属性 value对应简单数据类型的属性值当属性值是由spring管理的对象时使用ref引用属性值当使用list、map等类型时需要进一步描述数据类型等信息。
编写测试程序在com.bjwl.service包中添加AssembleTest定义测试方法代码如下所示。
public class AssembleTest { Test public void setterTest(){ ApplicationContext context new ClassPathXmlApplicationContext(spring-assemble-set.xml); Student student (Student)context.getBean(student); System.out.println(student.toString()); }
}运行测试程序结果如下所示 2. 基于xml的构造注入
使用构造注入装配时类中必须包含带参构造函数学生类修改后代码如下所示。
public class Student { private String sname; private Integer sage; private ListCourse courses; private Teacher classTeacher; public Student(String sname, Integer sage, ListCourse courses, Teacher classTeacher) { this.sname sname; this.sage sage; this.courses courses; this.classTeacher classTeacher; } Override public String toString() { return Student{ sname sname \ , sage sage , courses courses , classTeacher classTeacher }; }
}类Course 和Teacher 按照上述代码添加setter方法在此不再赘述。 2. 在resources目录下添加spring配置文件spring-constructor.xml代码如下所示。
beans bean idteacher classcom.bjwl.service.constructor.Teacher constructor-arg index0 value张三/constructor-arg /bean bean idstudent classcom.bjwl.service.constructor.Student constructor-arg index0 value张三/constructor-arg constructor-arg index1 value18/constructor-arg constructor-arg index3 refteacher/constructor-arg constructor-arg index2 list value-typecom.bjwl.service.constructor.Course bean classcom.bjwl.service.constructor.Course constructor-arg namecourseName value数据结构/constructor-arg /bean bean classcom.bjwl.service.constructor.Course constructor-arg namecourseName value数据库原理/constructor-arg /bean /list /constructor-arg /bean 代码中constructor-arg标签为构造注入标签constructor-arg中index是参数的索引value对应简单数据类型的属性值当属性值是由spring管理的对象时使用ref引用属性值。注意在正式开发中通常使用constructor-arg标签中使用name属性而不是index属性因为name对应构造函数的行参名更加准确。
在测类中增加constructorTest测试方法代码如下所示。
public class AssembleTest { Test public void constructorTest(){ ApplicationContext context new ClassPathXmlApplicationContext(spring-constructor.xml); Student student context.getBean(student,Student.class); System.out.println(student.toString()); }
} 运行测试程序结果如下所示。
3. 基于注解的装配
基于注解的装配需要在代码的属性上使用注解符Student的代码修改如下所示。
Component
public class Student { Value(张三) private String sname; Value(18) private Integer sage; Value(#{courses}) private ListCourse courses; Autowired private Teacher classTeacher;
} Component
public class Teacher { Value(李老师) private String tname;
} Component
public class Course { public void setCourseName(String courseName) { this.courseName courseName; } private String courseName;
} 代码中在类上添加的注解符Component 代表这个类创建的对象交给spring进行管理在属性上的Value注解符代表简单数据类型属性注入Autowired代表对象的注入。对于list、map的注入还要借助xml完成如课程集合的注入。
注意对象注入时使用Autowired注解符是spring提供的注入依据数据类型byType如classTeacher属性注入是spring在对象池中寻找类型为Teacher的对象然后进行匹配如果系统中存在两个或两个以上类型为Teacher的对象需要借助另外一个注解符Qualifier完成另外JDK还提供了一个注解符Resource也可以完成依赖注入注入依据对象的名称byName上例中需要在对象池中寻找名称为classTeacher的对象进行注入。
在resources目录下添加spring配置文件spring-annotation.xml代码如下所示
beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:utilhttp://www.springframework.org/schema/util xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd context:annotation-config / context:component-scan base-packagecom.bjwl.service.annotation / util:list idcourses bean idcourse1 classcom.bjwl.service.annotation.Course property namecourseName value数据结构/property /bean bean idcourse2 classcom.bjwl.service.annotation.Course property namecourseName value数据库原理/property /bean /util:list
/beans 代码的第3、7、8行引入context的头部文件第12行开启注解注解Bean装配第13行声明组件扫描位置 3. 编写测试程序在测试类中增加AnnotationTest 方法代码如下所示。 public void setterTest(){ ApplicationContext context new ClassPathXmlApplicationContext(spring-annotation.xml); Student student (Student)context.getBean(student); System.out.println(student.toString()); } 运行测试程序测试结果如下
自动装配技术
使用自动装配需要指定的属性需要有setter方法。自动装配技术可以依赖使用xml方式和注解方式对bean的管理在此仅演示使用注解方式的自动装配简单数据类型使用注解的方式完成主要演示班主任classTeacher的注入修改student类代码如下所示。
public class Student { Value(李四) private String sname; Value(18) private Integer sage; private Teacher classTeacher; public void setSname(String sname) { this.sname sname; } public void setSage(Integer sage) { this.sage sage; } public void setClassTeacher(Teacher classTeacher) { this.classTeacher classTeacher; } Override public String toString() { //省略}
} Component(classTeacher)
public class Teacher { Override public String toString() { //省略 } Value(zhangsan) private String tname;
} 自动装配依据配置文件中bean标签的autowire属性完成自动装配规则的定义在resources目录下添加spring配置文件spring-auto.xml配置文件代码如下。
beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd default-autowirebyName context:annotation-config / context:component-scan base-packagecom.bjwl.service.auto /
/beans 代码第7行beans 指定default-autowire属性的值为byName通过属性的名称实现自动装配此时要求student的classTeacher属性名必须 bean所对应的名称完全一致default-autowire属性值也可以是为byType通过属性的类型实现自动装配。此种装配方式简单但是缺乏灵活度开发时几乎不用。
编写测试程序在测试类中增加AutoTest 方法代码如下所示。
public class AutoTest {Testpublic void test(){ApplicationContext context new ClassPathXmlApplicationContext(spring-auto.xml);Student student context.getBean(student, Student.class);System.out.println(student.toString());}
}运行测试程序执行结果如下图所示 小结
本节主要介绍了bean的装配实现过程通常对于简单数据类型数据初始主要在获得对象后使用setter方法完成所谓的装配主要是复杂数据类型的依赖注入。Bean的装配可以基于xml配置、注解、自动化装配三种方式当前主流的使用基于注解的装配基于xml配置辅助自动化装配技术几乎不用。在基于注解的配置中特别注意注解符Autowired和Resource匹配规则及使用byType时Qualifier使用场景和原因。