spring maven地址:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.23</version> </dependency>
1.首先定义一个pojo类
public class Hello { private String str; public String getStr() { return str; } public void setStr(String str) { this.str = str; } @Override public String toString() { return "Hello{" + "str='" + str + '\'' + '}'; } }
2.配置Spring元数据
Spring IoC 容器使用一种形式的配置元数据。此配置元数据表示您作为应用程序开发人员如何告诉 Spring 容器实例化,配置和组装应用程序中的对象
传统上,配置元数据以简单直观的 XML 格式提供
以下示例显示了基于 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.xsd"> <bean id="..." class="..."> (1) (2) <!-- collaborators and configuration for this bean go here --> </bean> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <!-- more bean definitions go here --> </beans>
id属性是标识单个 bean 定义的字符串
class属性定义 bean 的类型并使用完全限定的类名
实例:
<?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"> <!-- 使用Spring来创建对象,Spring中被创建的对象都被称为Bean --> <bean id="hello" class="top.imustctf.pojo.Hello"> <property name="str" value="Spring"/> </bean> </beans>
3.实例化容器
提供给ApplicationContext构造函数的位置路径是资源字符串,这些资源字符串使容器可以从各种外部资源(例如本地文件系统,Java CLASSPATH等)加载配置元数据
// 获取Spring的上下文对象 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
现在,我们来愉快的开始测试吧!
通过context.getBean,我们可以通过Spring获取具体的对象实例,而不需手动的去new,这是革命性的变化!🙌
这个过程就叫做控制反转!
@Test public void test() { // 获取Spring的上下文对象 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Hello hello = (Hello) context.getBean("hello"); System.out.println(hello); // Hello{str='Spring'} }
4.IOC创建对象的方式
使用无参构造创建对象(默认):
例如:在pojo中覆盖掉无参构造,beans.xml文件会产生一个错误:
public class Hello { private String str; public Hello(String str) { this.str = str; } public String getStr() { return str; } public void setStr(String str) { this.str = str; } @Override public String toString() { return "Hello{" + "str='" + str + '\'' + '}'; } }
使用有参构造创建对象:
构造函数参数索引
您可以使用index属性来显式指定构造函数参数的索引,如以下示例所示:
<bean id="hello" class="top.imustctf.pojo.Hello"> <constructor-arg index="0" value="我爱你中国!"/> </bean>
测试类:
@Test public void test() { // 获取Spring的上下文对象 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Hello hello = (Hello) context.getBean("hello"); System.out.println(hello); // Hello{str='我爱你中国!'} }
构造函数参数类型匹配
在上述情况下,如果您使用type属性显式指定了构造函数参数的类型,则容器可以使用简单类型的类型匹配。如下例所示:
<bean id="hello" class="top.imustctf.pojo.Hello"> <constructor-arg type="java.lang.String" value="我爱你祖国!"/> </bean>
测试类:
@Test public void test() { // 获取Spring的上下文对象 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Hello hello = (Hello) context.getBean("hello"); System.out.println(hello); // Hello{str='我爱你祖国!'} }
- 构造函数参数解析(直接通过参数名)
<bean id="hello" class="top.imustctf.pojo.Hello"> <constructor-arg name="str" value="大河"/> </bean>
测试类:
@Test public void test() { // 获取Spring的上下文对象 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Hello hello = (Hello) context.getBean("hello"); System.out.println(hello); // Hello{str='大河'} }