Spring添加bean
SpringIoC容器有俩种表现形式,第一种为xml配置文件形式,第二种为配置类的形式,以下文章整理对两种形式的Spring容器添加bean方法相关操作。
一、配置文件形式:
配置文件形式又有三种添加方式(不管是哪种形式的容器,哪种方式的容器都需要导入相关jar包)
准备工作:
准备工作1:首先创建普通java项目。
准备工作2:导包:
将相关jar包粘贴到src中,然后右键jar包选择buildpath->addtobuildpath将jar包添加到类路径中。
方式1(在xml文件中直接进行装配):
第一步、
在xml中以bean标签的形式进行添加:
在src中创建xml文件ApplicationContext.xml,在文件中添加以下内容(若有sts插件或者工具可以自动生成)。
<?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">
</beans>
第二步、
创建相关java类(建包,创建类):
课程类:
package com.xmlwritebean;
/*
* 这里创建的是课程类,其中存储课程相关信息。
* 本类重写了toString方法来打印类的相关信息。
*/
public class Course {
private String courseName;
private int courseHour;
private Teacher courseTeacher;
public Course() {}
public Course(String courseName, int courseHour, Teacher courseTeacher) {
this.courseName = courseName;
this.courseHour = courseHour;
this.courseTeacher = courseTeacher;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public int getCourseHour() {
return courseHour;
}
public void setCourseHour(int courseHour) {
this.courseHour = courseHour;
}
public Teacher getCourseTeacher() {
return courseTeacher;
}
public void setCourseTeacher(Teacher courseTeacher) {
this.courseTeacher = courseTeacher;
}
@Override
public String toString() {
String mes = "课程名:"+courseName+"\n课时数:"+courseHour+"\n授课教师信息:"+courseTeacher;
return mes;
}
}
教师类:
package com.xmlwritebean;
public class Teacher {
private String teacherName;
private int teacherAge;
public Teacher() {}
public Teacher(String teacherName,int teacherAge) {
this.teacherName = teacherName;
this.teacherAge = teacherAge;
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
public int getTeacherAge() {
return teacherAge;
}
public void setTeacherAge(int teacherAge) {
this.teacherAge = teacherAge;
}
@Override
public String toString() {
String mes = "教师姓名:"+teacherName+"\n教师年龄:"+teacherAge;
return mes;
}
}
第三步、
在第一步创建的ApplicationContext.xml中添加相关类的信息。
bean标签里面有属性id和class,id是从容器中取类时的唯一标识符,class是所添加类的全类名。
property标签里面有属性name用来标识类中的相关属性。
value标签用来为属性赋值
注意!课程中的courseTeacher属性要用ref标签,这里的courseTeacher类型是引用类型,而不是值类型(八种基本类型+String类型),所以要用ref,ref使用方法(<ref bead=“beanid” 这里写的是ioc容器中相应的bean的id值 >)。
<?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="teacher" class="com.xmlwritebean.Teacher">
<property name="teacherName">
<value>张三</value>
</property>
<property name="teacherAge">
<value>23</value>
</property>
</bean>
<bean id="course" class="com.xmlwritebean.Course">
<property name="courseName">
<value>java</value>
</property>
<property name="courseHour">
<value>12</value>
</property>
<property name="courseTeacher">
<ref bean="teacher"></ref>
</property>
</bean>
<!--以上方式为set注入,需要有属性的set方法,下面为构造器注入,需要相关构造器
<bean id="teacher" class="com.xmlwritebean.Teacher">
<constructor-arg name="teacherName">
<value>李四</value>
</constructor-arg>
<constructor-arg name="teacherAge">
<value>23</value>
</constructor-arg>
</bean>
<bean id="course" class="com.xmlwritebean.Course">
<constructor-arg name="courseName">
<value>html</value>
</constructor-arg>
<constructor-arg name="courseHour">
<value>12</value>
</constructor-arg>
<constructor-arg name="courseTeacher">
<ref bean="teacher"></ref>
</constructor-arg>
</bean>
-->
</beans>
第四步、
创建主类,在主函数中测试。
主函数中利用ApplicationContext接口引用创建ClassPathXmlApplicationContext(“xml文件名”)Spring环境上下文对象(存放Spring相关信息的对象),利用该对象的getBean(beanid值)方法便可以获取IoC容器的相应的对象。获取对象之后便可以如往常一样使用了。
package com.xmlwritebean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
String fileName = "ApplicationContext.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(fileName);
Course c = (Course)context.getBean("course");
Teacher t = (Teacher)context.getBean("teacher");
System.out.println("课程相关信息:"+c);
System.out.println("教师相关信息:"+t);
}
}
运行结果图:
方式2(在相关类前添加注解,注解扫描方式添加,需要命名空格键context):
第一步、
创建相关配置xml文件同方式1。
第二步、
创建相关类,并加入注解:
课程类:
package com.xmlwritebean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("course")
/*
* 这里如果是javaweb三层组件,还可以使用以下注解分别标注
* @Controller(beanid值)标注Controller层组件
* @Service(beanid值)标注Service层组件
* @Repository(beanid值)标注Dao层组件
*/
public class Course {
@Value("javaScript")
private String courseName;
@Value("12")
private int courseHour;
@Autowired
private Teacher courseTeacher;
public Course() {}
public Course(String courseName, int courseHour, Teacher courseTeacher) {
this.courseName = courseName;
this.courseHour = courseHour;
this.courseTeacher = courseTeacher;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public int getCourseHour() {
return courseHour;
}
public void setCourseHour(int courseHour) {
this.courseHour = courseHour;
}
public Teacher getCourseTeacher() {
return courseTeacher;
}
public void setCourseTeacher(Teacher courseTeacher) {
this.courseTeacher = courseTeacher;
}
@Override
public String toString() {
String mes = "课程名:"+courseName+"\n课时数:"+courseHour+"\n授课教师信息:"+courseTeacher;
return mes;
}
}
教师类:
package com.xmlwritebean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("teacher")
public class Teacher {
@Value("王五")
private String teacherName;
@Value("24")
private int teacherAge;
public Teacher() {}
public Teacher(String teacherName,int teacherAge) {
this.teacherName = teacherName;
this.teacherAge = teacherAge;
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
public int getTeacherAge() {
return teacherAge;
}
public void setTeacherAge(int teacherAge) {
this.teacherAge = teacherAge;
}
@Override
public String toString() {
String mes = "教师姓名:"+teacherName+"\n教师年龄:"+teacherAge;
return mes;
}
}
第三步、
在xml配置文件中添加注解扫描器:<context:component-scan base-package=“相关包名”></context:component-scan>,扫描器会对相应的包进行扫描。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.xmlwritebean"></context:component-scan>
</beans>
第四步、
测试结果
方式3(通过p命名空间装配bean):
第一步和第二步同方式1。
第三步、
在配置文件中写入以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean id="teacher" class="com.xmlwritebean.Teacher"
p:teacherName="赵六"
p:teacherAge="26">
</bean>
<bean id="course" class="com.xmlwritebean.Course"
p:courseName="php"
p:courseHour="15"
p:courseTeacher-ref="teacher">
</bean>
</beans>
第四步、
测试结果:
二、配置类形式:
准备工作:
准备工作1:首先创建普通java项目。
准备工作2:导包:
将相关jar包粘贴到src中,然后右键jar包选择buildpath->addtobuildpath将jar包添加到类路径中。
方式1(配置类形式直接装配):
第一步:
创建配置类:
配置类类似于xml形式装配bean的配置文件。
package com.configclasswritebean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfigClass {
@Bean("course")
public Course myCourse() {
Course c = new Course();
c.setCourseName("css");
c.setCourseHour(10);
c.setCourseTeacher(myTeacher());
return c;
}
@Bean("teacher")
public Teacher myTeacher() {
Teacher t = new Teacher();
t.setTeacherName("张三");
t.setTeacherAge(25);
return t;
}
}
第二步、
创建相关类:
课程类:
package com.configclasswritebean;
public class Course {
private String courseName;
private int courseHour;
private Teacher courseTeacher;
public Course() {}
public Course(String courseName, int courseHour, Teacher courseTeacher) {
this.courseName = courseName;
this.courseHour = courseHour;
this.courseTeacher = courseTeacher;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public int getCourseHour() {
return courseHour;
}
public void setCourseHour(int courseHour) {
this.courseHour = courseHour;
}
public Teacher getCourseTeacher() {
return courseTeacher;
}
public void setCourseTeacher(Teacher courseTeacher) {
this.courseTeacher = courseTeacher;
}
@Override
public String toString() {
String mes = "课程名:"+courseName+"\n课时数:"+courseHour+"\n授课教师信息:"+courseTeacher;
return mes;
}
}
教师类:
package com.configclasswritebean;
public class Teacher {
private String teacherName;
private int teacherAge;
public Teacher() {}
public Teacher(String teacherName,int teacherAge) {
this.teacherName = teacherName;
this.teacherAge = teacherAge;
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
public int getTeacherAge() {
return teacherAge;
}
public void setTeacherAge(int teacherAge) {
this.teacherAge = teacherAge;
}
@Override
public String toString() {
String mes = "教师姓名:"+teacherName+"\n教师年龄:"+teacherAge;
return mes;
}
}
第三步、
测试结果:
这里需要注意,xml配置文件形式的上下文对象是ClassPathXmlApplicationContext(“配置文件名”),配置类形式的上下文对象是AnnotationConfigApplicationContext(“配置类类型xxx.class”)。
package com.configclasswritebean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfigClass.class);
Course c = (Course)context.getBean("course");
Teacher t = (Teacher)context.getBean("teacher");
System.out.println(c);
System.out.println(t);
}
}
方式2(配置类+注解形式装配):
第一步、
创建配置类如下:
package com.configclasswritebean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.configclasswritebean")
public class SpringConfigClass {
}
第二步、
创建相关类并添加注解(同配置文件方式2):
第三步、
测试结果:
总结整理:
以上为俩大类IoC容器装配bean的不同的方式,由上面装配方式可以看出,原本由自己控制生成对象转变为了交付于SpringIoC容器去生成对象,这也就是控制反转的概念。俩种形式的IoC容器分别对应于xml配置文件和相应的配置类。DI依赖注入指的是类和类之间的包含处理方式,例如Course类中包含了Teacher类,IoC容器使用关联bean的方式取代了原本new 对象的形式(不需要使用new关键字创建对象),从而达到了解耦的效果。