《我不会-Spring初学》(1)IDEA-Maven从0搭建极简Spring(2)用XML创建Bean实例及赋初值来体会“控制反转,依赖注入”

本文详细介绍如何使用Maven搭建Spring框架,包括构建工程、导入依赖、创建XML配置文件等步骤,并深入解析XML配置Bean实例及其初始化过程,同时展示了如何在三层架构中应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欲高屋建瓴,方得始终

一:Maven搭建Spring

(1)构建工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

(2)导入Spring依赖包

然后将下面Spring依赖包加入pom圆圈中的位置

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.2.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.2.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.2.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>5.2.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

刷新一下maven后将会下载依赖包,这样Spring最简单的基本框架已经搭建好了
在这里插入图片描述

(3)构建resource包

随后我们观察一下包结构,发现会没有resource包(用来放xml文件),我们可以自己在main包下新建一个名字为resource的包
在这里插入图片描述
随后鼠标右键将这个包构建为源码包
在这里插入图片描述

(4)新建SpringXML文件

在resource包鼠标右键在这里插入图片描述

二:XML创建Bean实例及赋初值

原理: 通过xml文件创建bean,也就是创建对象实例,当我们需要使用时不再通过new的方式创建一个实例,而是通过从Spring的容器中拿到该对象的实例,这就体现了“控制反转”这一特性:将创建对象的权力从程序(由new方式创建)交给了Spring框架,由xml文件控制生成,当使用时,从容器中取便是; 而这一流程可分为3个步骤:

  • 新建java类
  • 在xml文件中配置类的信息
  • 加载xml文件,然后取得对象

所以最关键的几段代码如下:
(1)加载xml,通过它获得bean,等一系列操作:ApplicationContext applicationContext=new ClassPathXmlApplicationContext(“applicationContext.xml”);
(2)写xml文件,配置bean:class是类所在路径,id是下文将要引用时使用的:< bean id=“UserDao” class=“com.learn.UserDao”>< /bean>
(3)取得对象: applicationContext.getBean(“UserDao”);

(1)创建bean

首先创建一个简单的类


public class UserDao {
    void findUser(){
        System.out.println("UserDao->findUser");
    }
}

xml写入这个类
    <bean id="UserDao" class="com.learn.UserDao"></bean>

在主类中通过Spring容器取得对象

public class App
{
    public static void main( String[] args )
    {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
       UserDao userDao= (UserDao) applicationContext.getBean("UserDao");
       userDao.findUser();
    }
}

从打印的结果来看,成功创建并取得对象并执行了方法
在这里插入图片描述

(2)赋予初值

在这一块体现的是Spring的依赖注入的特性

方式一:

(1)新建java类,必须要带有getter,setter方法


public class Person {
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }
}

(2)在xml文件中使用 < property name=“age” value=“20” >< /property>配置初始值,主要name要与类中的字段保持一致。

<bean id="Person" class="com.learn.Person">
   <property name="age" value="20" ></property>
   <property name="name" value="张三" ></property>
      
 </bean>

(3)在主类中打印一下,看看能不能获得初始值

public class App
{
    public static void main( String[] args )
    {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
      Person person= (Person) applicationContext.getBean("Person");
        System.out.println(person.getAge());
        System.out.println(person.getName());
    }
}

结果显示有了初始值:
er)

方式二:

与方式一不同的是:在xml配置文件中,不是使用property了,而是下面这种:

<bean id="Person" class="com.learn.Person">
<!--        <property name="age" value="20" ></property>-->
<!--        <property name="name" value="张三" ></property>-->
        <constructor-arg index="0" value="20" />
        <constructor-arg index="1" value="ZhangSan" />
    </bean>

效果也是一样的:

在这里插入图片描述

方式三:

使用时要注意对Spring的版本有要求,而且现在还不是特别常用

在这里插入图片描述

(3)给数组赋予初值

(1)新建java类



import java.util.Arrays;
import java.util.List;

public class Student {
    private String[] ids;

    @Override
    public String toString() {
        return "Student{" +
                "ids=" + Arrays.toString(ids) +
                ", stringList=" + stringList +
                '}';
    }

    public List<String> getStringList() {
        return stringList;
    }

    public void setStringList(List<String> stringList) {
        this.stringList = stringList;
    }

    private List<String> stringList;
    public String[] getIds() {
        return ids;
    }


    public void setIds(String[] ids) {
        this.ids = ids;
    }
}

(2)配置xml文件,赋予初始值

 <bean class="comlearn.Student" id="student">
        <property name="ids">
            <array>
                <value>0001</value>
                <value>0002</value>
                <value>0003</value>
                <value>0004</value>

            </array>
        </property>
        <property name="stringList">
            <array>
                <value>0005</value>
                <value>0006</value>
                <value>0007</value>
                <value>0008</value>
            </array>
        </property>
    </bean>

(4)主类进行测试

public class App
{
    public static void main( String[] args )
    {

        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");

        Student student= (Student) applicationContext.getBean("student");
        System.out.println(student);

    }
}

在这里插入图片描述

(4)给map赋予初值



import java.util.Map;

public class TestMap {
    private Map<Integer, String>map;

    @Override
    public String toString() {
        return "TestMap{" +
                "map=" + map +
                '}';
    }

    public Map<Integer, String> getMap() {
        return map;
    }

    public void setMap(Map<Integer, String> map) {
        this.map = map;
    }
}

  <bean class="com.learn.TestMap" id="map">
        <property name="map">
            <map>
                <entry>
                    <key>
                        <value>1</value>
                    </key>
                    <value>ZhangSan</value>
                </entry>
                <entry>
                    <key>
                        <value>2</value>
                    </key>
                    <value>ZhangSan2</value>
                </entry>
            </map>
        </property>
    </bean>
public class App
{
    public static void main( String[] args )
    {

        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        TestMap map= (TestMap) applicationContext.getBean("map");
        System.out.println(map);

    }
}

在这里插入图片描述

三:如何从三层架构中使用

当另外一个类是一个类的成员变量时,如何通过xml获得对象实例 ?,比如有个UserDao,现在按照三层架构的写法,需要一个service来实现一些操作,那么该怎么做?那我们要在这个类中getter,setter这个类,然后在通过xml文件配置它,其代码如下:
新建一个类



public class UserService {
    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    public void findUser(){
        System.out.println("------------------service->");
        userDao.findUser();
    }
}

xml代码:

<bean id="UserDao" class="com.learn.UserDao"></bean>
<bean class="com.learn.UserService" id="userService">
        <property name="userDao" ref="UserDao"></property>
    </bean>

在主类中实验看可不可以调用UserDao的方法:

public class App
{
    public static void main( String[] args )
    {

        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");

      UserService userService= (UserService) applicationContext.getBean("userService");
        userService.findUser();
    }
}

在这里插入图片描述

在以上代码中,UserDao是其中的变量 ,通过xml配置它,然后利用UserService中的setter和getter方法,实现获得UserDao的实例,这个特性利用的就是注解
最后给大家看看xml全部代码及包结构

四:applicationContext.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="UserDao" class="com.learn.UserDao"></bean>
    <bean id="Person" class="com.learn.Person">
<!--        <property name="age" value="20" ></property>-->
<!--        <property name="name" value="张三" ></property>-->
        <constructor-arg index="0" value="20" />
        <constructor-arg index="1" value="ZhangSan" />
    </bean>
    <bean class="com.learn.Student" id="student">
        <property name="ids">
            <array>
                <value>0001</value>
                <value>0002</value>
                <value>0003</value>
                <value>0004</value>

            </array>
        </property>
        <property name="stringList">
            <array>
                <value>0005</value>
                <value>0006</value>
                <value>0007</value>
                <value>0008</value>
            </array>
        </property>
    </bean>
    <bean class="com.learn.TestMap" id="map">
        <property name="map">
            <map>
                <entry>
                    <key>
                        <value>1</value>
                    </key>
                    <value>ZhangSan</value>
                </entry>
                <entry>
                    <key>
                        <value>2</value>
                    </key>
                    <value>ZhangSan2</value>
                </entry>
            </map>
        </property>
    </bean>
    <bean class="com.learn.UserService" id="userService">
        <property name="userDao" ref="UserDao"></property>
    </bean>
</beans>



五:包结构

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值