Spring装配bean操作笔记

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>

第四步、
测试结果:
在这里插入图片描述

扫描二维码关注公众号,回复: 8945868 查看本文章

二、配置类形式:

准备工作:

准备工作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关键字创建对象),从而达到了解耦的效果。

发布了6 篇原创文章 · 获赞 0 · 访问量 124

猜你喜欢

转载自blog.csdn.net/AC_sunK/article/details/101526632
今日推荐