从头开始学Spring—02基于XML管理bean

2024-05-14 11:44

本文主要是介绍从头开始学Spring—02基于XML管理bean,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.实验一:入门案例

2.实验二:获取bean

3.实验三:依赖注入之setter注入

4.实验四:依赖注入之构造器注入

5.实验五:特殊值处理

6.实验六:为类类型属性赋值

7.实验七:为数组类型属性赋值

8.实验八:为集合类型属性赋值

9.实验九:p命名空间

10.实验十:引入外部属性文件(以jdbc为例)

11.实验十一:bean的作用域

12.实验十二:bean的生命周期

13.实验十三:FactoryBean

14.实验十四:基于xml的自动装配


1.实验一:入门案例

①创建Maven Module

②引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>spring01</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><dependencies><!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.1</version></dependency><!-- junit测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies></project>

③创建类

public class HeloWorld {public void sayHello(){System.out.println("test spring~~~");}
}

④创建Spring的配置文件

⑤在Spring的配置文件中配置bean

<!--配置HelloWorld所对应的bean,即将HelloWorld的对象交给Spring的IOC容器管理通过bean标签配置IOC容器所管理的bean属性:id:设置bean的唯一标识class:设置bean所对应类型的全类名
-->
<bean id="helloworld" class="com.ykx.spring.pojo.HelloWorld"></bean>

⑥创建测试类对象

@Test
public void test(){//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");HelloWorld helloWorld = (HelloWorld) ioc.getBean("helloworld");helloWorld.sayHello();
}

⑦思路

⑧注意

2.实验二:获取bean

①方式一:根据id获取

@Test
public void test(){//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");//获取BeanStudent studentOne = (Student) ioc.getBean("studentOne");System.out.println(studentOne);
}

②方式二:根据类型获取

@Test
public void test2(){//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");//获取BeanStudent student = ioc.getBean(Student.class);System.out.println(student);
}

③方式三:根据id和类型

@Test
public void test3(){//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");//获取BeanStudent student = ioc.getBean("studentOne",Student.class);System.out.println(student);
}

④注意

⑤扩展

⑥结论

3.实验三:依赖注入之setter注入

①创建Student类

public class Student {private Integer sid;private String sname;private Integer age;private String gender;public Student() {}public Student(Integer sid, String sname, Integer age, String gender) {this.sid = sid;this.sname = sname;this.age = age;this.gender = gender;}public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "Student{" +"sid=" + sid +", sname='" + sname + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}

②配置bean时为属性赋值

<bean id="studentTwo" class="com.ykx.spring.pojo.Student"><!-- property标签:通过组件类的setXxx()方法给组件对象设置属性 --><!-- name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关)--><!-- value属性:指定属性值 --><property name="sid" value="1001"></property><property name="sname" value="张三"></property><property name="age" value="23"></property><property name="gender" value="男"></property>
</bean>

 ③测试

@Test
public void test(){//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");//获取BeanStudent student = ioc.getBean("studentTwo",Student.class);System.out.println(student);
}

4.实验四:依赖注入之构造器注入

①在Student类中添加有参构造

public Student() {
}public Student(Integer sid, String sname, Integer age, String gender) {this.sid = sid;this.sname = sname;this.age = age;this.gender = gender;
}

②配置bean

<bean id="studentThree" class="com.ykx.spring.pojo.Student"><constructor-arg value="1002"></constructor-arg><constructor-arg value="李四"></constructor-arg><constructor-arg value="33"></constructor-arg><constructor-arg value="女"></constructor-arg>
</bean>

③测试

@Test
public void test5(){//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");//获取BeanStudent student = ioc.getBean("studentThree",Student.class);System.out.println(student);
}

5.实验五:特殊值处理

①字面量赋值

②null值

③xml实体

④CDATA节

6.实验六:为类类型属性赋值

①创建班级类Clazz

public class Clazz {private Integer clazzId;private String clazzName;public Clazz() {}public Clazz(Integer clazzId, String clazzName) {this.clazzId = clazzId;this.clazzName = clazzName;}public Integer getClazzId() {return clazzId;}public void setClazzId(Integer clazzId) {this.clazzId = clazzId;}public String getClazzName() {return clazzName;}public void setClazzName(String clazzName) {this.clazzName = clazzName;}@Overridepublic String toString() {return "Clazz{" +"clazzId=" + clazzId +", clazzName='" + clazzName + '\'' +'}';}}

②修改Student类

③方式一:引用外部已声明的bean

<bean id="clazzOne" class="com.ykx.spring.pojo.Clazz"><property name="clazzId" value="1111"></property><property name="clazzName" value="财源滚滚班"></property>
</bean><bean id="studentFive" class="com.ykx.spring.pojo.Student"><property name="sid" value="1004"></property><property name="sname" value="赵六"></property><property name="age" value="26"></property><property name="gender" value="女"></property><!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 --><property name="clazz" ref="clazzOne"></property>
</bean>

测试

@Test
public void test6(){//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");//获取BeanStudent student = ioc.getBean("studentFive",Student.class);System.out.println(student);
}

④方式二:内部bean

<bean id="studentSix" class="com.ykx.spring.pojo.Student"><property name="sid" value="1004"></property><property name="sname" value="赵六"></property><property name="age" value="26"></property><property name="gender" value="女"></property><property name="clazz"><!-- 在一个bean中再声明一个bean就是内部bean --><!-- 内部bean只能用于给属性赋值,不能在外部通过IOC容器获取,因此可以省略id属性 --><bean id="clazzInner" class="com.ykx.spring.pojo.Clazz"><property name="clazzId" value="2222"></property><property name="clazzName" value="远大前程班"></property></bean></property>
</bean>

⑤方式三:级联属性赋值

<bean id="studentSeven" class="com.ykx.spring.pojo.Student"><property name="sid" value="1004"></property><property name="sname" value="赵六"></property><property name="age" value="26"></property><property name="gender" value="女"></property><!-- 一定先引用某个bean为属性赋值,才可以使用级联方式更新属性 --><property name="clazz" ref="clazzOne"></property><property name="clazz.clazzId" value="3333"></property><property name="clazz.clazzName" value="最强王者班"></property>
</bean>

7.实验七:为数组类型属性赋值

①修改Student类

在Student类中添加以下代码:

private String[] hobbies;public String[] getHobbies() {return hobbies;
}public void setHobbies(String[] hobbies) {this.hobbies = hobbies;
}

②配置bean

<bean id="studentFour" class="com.ykx.spring.pojo.Student"><property name="sid" value="1004"></property><property name="sname" value="赵六"></property><property name="age" value="26"></property><property name="gender" value="女"></property><!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 --><property name="clazz" ref="clazzOne"></property><property name="hobbies"><array><value>lol</value><value>cf</value><value>云顶之弈</value><value>金铲铲之战</value></array></property>
</bean>

8.实验八:为集合类型属性赋值

①为List集合类型属性赋值

在Clazz类中添加以下代码:

private List<Student> students;public List<Student> getStudents() {return students;
}public void setStudents(List<Student> students) {this.students = students;
}

配置bean:.

<bean id="clazzTwo" class="com.ykx.spring.pojo.Clazz"><property name="clazzId" value="4444"></property><property name="clazzName" value="Javaee0222"></property><property name="students"><list><ref bean="studentOne"></ref><ref bean="studentTwo"></ref></list></property>
</bean>

测试结果:

@Test
public void test7(){//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");//获取BeanClazz clazz = ioc.getBean("clazzTwo", Clazz.class);System.out.println(clazz);
}

②为Map集合类型属性赋值

创建教师类

public class Teacher {private Integer teacherId;private String teacherName;public Teacher() {}public Teacher(Integer teacherId, String teacherName) {this.teacherId = teacherId;this.teacherName = teacherName;}public Integer getTeacherId() {return teacherId;}public void setTeacherId(Integer teacherId) {this.teacherId = teacherId;}public String getTeacherName() {return teacherName;}public void setTeacherName(String teacherName) {this.teacherName = teacherName;}@Overridepublic String toString() {return "Teacher{" +"teacherId=" + teacherId +", teacherName='" + teacherName + '\'' +'}';}
}

在Student类中添加以下代码:

private Map<String, Teacher> teacherMap;public Map<String, Teacher> getTeacherMap() {return teacherMap;
}public void setTeacherMap(Map<String, Teacher> teacherMap) {this.teacherMap = teacherMap;
}

配置bean:

<bean id="teacherOne" class="com.ykx.spring.pojo.Teacher"><property name="teacherId" value="10010"></property><property name="teacherName" value="大宝"></property>
</bean>
<bean id="teacherTwo" class="com.ykx.spring.pojo.Teacher"><property name="teacherId" value="10086"></property><property name="teacherName" value="二宝"></property>
</bean>
<bean id="studentEight" class="com.ykx.spring.pojo.Student">
<property name="sid" value="1004"></property>
<property name="sname" value="赵六"></property>
<property name="age" value="26"></property>
<property name="gender" value="女"></property>
<!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
<property name="clazz" ref="clazzOne"></property>
<property name="hobbies"><array><value>lol</value><value>cf</value><value>云顶之弈</value></array>
</property>
<property name="teacherMap">
<map>
<entry>
<key><value>10010</value>
</key><ref bean="teacherOne"></ref>
</entry><entry><key><value>10086</value></key><ref bean="teacherTwo"></ref></entry>
</map>
</property>
</bean>

③引用集合类型的bean

使用util:list、util:map标签必须引入相应的命名空间,可以通过idea的提示功能选择

<!--list集合类型的bean-->
<util:list id="students"><ref bean="studentOne"></ref><ref bean="studentTwo"></ref><ref bean="studentThree"></ref>
</util:list>
<!--map集合类型的bean-->
<util:map id="teacherMap"><entry><key><value>10010</value></key><ref bean="teacherOne"></ref></entry><entry><key><value>10086</value></key><ref bean="teacherTwo"></ref></entry>
</util:map><bean id="clazzTwo" class="com.atguigu.spring.bean.Clazz"><property name="clazzId" value="4444"></property><property name="clazzName" value="Javaee0222"></property><property name="students" ref="students"></property>
</bean><bean id="studentFour" class="com.atguigu.spring.bean.Student">
<property name="id" value="1004"></property>
<property name="name" value="赵六"></property>
<property name="age" value="26"></property>
<property name="sex" value="女"></property>
<!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
<property name="clazz" ref="clazzOne"></property>
<property name="hobbies"><array><value>抽烟</value><value>喝酒</value><value>烫头</value></array>
</property>
<property name="teacherMap" ref="teacherMap"></property>
</bean>

9.实验九:p命名空间

10.实验十:引入外部属性文件(以jdbc为例)

①加入依赖

<!-- MySQL驱动 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version>
</dependency>
<!-- 数据源 -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.31</version>
</dependency>

②创建外部属性文件

jdbc.user=root
jdbc.password=ykxykx
jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
jdbc.driver=com.mysql.cj.jdbc.Driver

③引入属性文件

④配置bean

<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="url" value="${jdbc.url}"/><property name="driverClassName" value="${jdbc.driver}"/><property name="username" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/>
</bean>

⑤测试

@Test
public void test() throws Exception {//获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-datasource.xml");//获取BeanDruidDataSource ds = ioc.getBean(DruidDataSource.class);Connection connection = ds.getConnection();System.out.println(connection);
}

11.实验十一:bean的作用域

12.实验十二:bean的生命周期

①具体的生命周期过程

②bean的后置处理器

13.实验十三:FactoryBean

①简介

②创建类UserFactoryBean

public class UserFactoryBean implements FactoryBean<User> {@Overridepublic User getObject() throws Exception {return new User();}@Overridepublic Class<?> getObjectType() {return User.class;}}

③配置bean

<bean id="user" class="com.ykx.spring.factory.UserFactoryBean"></bean>

④测试

@Test
public void testUserFactoryBean(){//获取IOC容器ApplicationContext ac = new ClassPathXmlApplicationContext("spring-factory.xml");User user = (User) ac.getBean("user");System.out.println(user);
}

14.实验十四:基于xml的自动装配

①场景模拟

②配置bean

byType

<bean id="userController"class="com.ykx.spring.controller.UserController" autowire="byType">
</bean>
<bean id="userService"class="com.ykx.spring.service.impl.UserServiceImpl" autowire="byType">
</bean>
<bean id="userDao" class="com.ykx.spring.dao.impl.UserDaoImpl"></bean>

byName

<bean id="userController"class="com.ykx.spring.controller.UserController" autowire="byName">
</bean>
<bean id="userService"class="com.ykx.spring.service.impl.UserServiceImpl" autowire="byName">
</bean>
<bean id="userServiceImpl"class="com.ykx.spring.service.impl.UserServiceImpl" autowire="byName">
</bean>
<bean id="userDao" class="com.ykx.spring.dao.impl.UserDaoImpl"></bean>
<bean id="userDaoImpl" class="com.ykx.spring.dao.impl.UserDaoImpl">
</bean>

③测试

@Test
public void test(){ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire.xml");UserController userController = ioc.getBean(UserController.class);userController.saveUser();}

 

内容来源于黑马程序员SSM课程的笔记,仅作为学习笔记参考

 

这篇关于从头开始学Spring—02基于XML管理bean的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988661

相关文章

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推