前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >怎样使用Spring的配置文件?带大家一起玩转Spring配置文件

怎样使用Spring的配置文件?带大家一起玩转Spring配置文件

原创
作者头像
我是一棵卷心菜
发布2022-01-18 14:04:26
1.1K0
发布2022-01-18 14:04:26
举报
文章被收录于专栏:Java学习记录

📕前言

整理了自己的学习笔记,包括Spring程序的快速使用、Bean标签的使用和其属性的具体使用,每个属性都用代码来解释,运行结果和案例写的都很明白,喜欢大家喜欢。

一、✔Spring程序快速入门

🌻步骤一:导入 Spring 开发的基本包坐标

创建一个maven工程,导入Spring需要的依赖,为了方便测试,我还导入了一个Junit测试包

代码语言:html
复制
<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.14</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

🌻步骤二:编写 Dao 接口和实现类

接下里,需要编写一个Dao接口和其实现类,用来搭建测试的环境,话多不说,直接上代码

代码语言:java
复制
public interface UserDao {
    void save();
}
代码语言:java
复制
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("保存成功~~");
    }
}

🌻步骤三:创建 Spring 核心配置文件

接口和类写完后,就开始进入正题,在类路径下(resources)创建Spring的核心配置文件,我取名为applicationContext.xml

代码语言:html
复制
<?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>

🌻步骤四:在 Spring 配置文件中配置 UserDaoImpl类

创建好xml配置文件后,我要想调用save()方法,就需要创建UserDaoImpl类的对象,这里采用容器的方式。

代码语言:html
复制
    <bean id="userdao" class="com.sht.dao.impl.UserDaoImpl"></bean>

这里的id是自定义的,最好是类名的首字母小写,方便于记忆。class属性值是要创建类对象的所在包路径,我的这个UserDaoImpl类所在的包路径就是com.sht.dao.impl.UserDaoImpl,这一点都不能写错哦!

🌻步骤五:使用 Spring 的 API 获得 Bean 实例

接下来测试一下:

代码语言:java
复制
public class UserDaoDemo {
    public static void main(String[] args) {
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userdao = (UserDao) applicationContext.getBean("userdao");
        userdao.save();
    }
}

通过new ClassPathXmlApplicationContext("applicationContext.xml")获取到容器——applicationContext,然后通过id对应的属性值获取到UserDaoImpl类的对象</font>,这样我们就不需要用new的方式来创建对象了!

以上java代码还可以写成另一种方式:

代码语言:java
复制
public class UserDaoDemo {
    public static void main(String[] args) {
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDaoImpl userDao = applicationContext.getBean(UserDaoImpl.class);
        userDao.save();
    }
}

其中,当参数的数据类型是字符串时,表示根据Bean的id从容器中获得Bean实例,返回是Object,需要强转。

当参数的数据类型是Class类型时,表示根据类型从容器中匹配Bean实例,特别注意的是:当容器中相同类型的Bean有多个时,则此方法会报错。

运行结果:

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

结果正确,到了这里,spring的配置文件你已经有了基本的了解,接下来让我们看看spring配置文件中其它的细节使用吧!

二、✔Spring配置文件使用

💦1、Bean标签基本配置

💨基本介绍

用于配置对象交由Spring 来创建

默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功,对于有参构造器,后面会慢慢讲到

💨基本属性

id:Bean实例在Spring容器中的唯一标识

class:Bean的全限定名称

这两个基本属性在快速入门中已经使用过了,就不最多介绍了

💨Bean标签范围配置(Scope)

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

修改xml配置文件,在原来的bean中加入scope="singleton",这就意味着,我们不管创建多少个对象,都是同一个

代码语言:html
复制
<bean id="userdao" class="com.sht.dao.impl.UserDaoImpl" scope="singleton"></bean>

写一个测试代码

代码语言:java
复制
    public void test1(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userdao1 = (UserDao) context.getBean("userdao");
        System.out.println(userdao1);
        UserDao userdao2 = (UserDao) context.getBean("userdao");
        System.out.println(userdao2);
        System.out.println("是否为同一个对象实例:" + (userdao1 == userdao2));
    }

运行结果:

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

继续修改xml配置文件,把scope="singleton"改为scope="prototype",即表明,我们用其创建对象时,不是同一个对象实例

上面的测试代码不变,运行结果:

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

💨Bean标签实例化时机

小伙伴们可能就有疑问了,上面这两种方式是什么时候创建对象实例的呢?不要急,咱们慢慢道来。

为了方便效果的展现,我在UserDaoImpl类的无参构造器中加入一句代码,用来区别创建实例的时机

代码语言:java
复制
  public UserDaoImpl(){
        System.out.println("UserDaoImpl开始创建");
    }
🔥scope为singleton时

运行debug,点击F8

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

我们可以发现,从加载配置文件的时候就开始创建了对象实例

在这里插入图片描述
在这里插入图片描述
🔥scope为prototype时

运行debug,按下F8,发现控制台并没有打印“UserDaoImpl开始创建”,说明配置文件并没有加载对象实例

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

再次按F8下一步

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

我们可以发现控制台终于打印了“UserDaoImpl开始创建”

在这里插入图片描述
在这里插入图片描述
🔥总结

当scope的取值为singleton时,当应用加载,创建容器时,对象就被创建了;当scope的取值为prototype时,当使用对象时,才创建新的对象实例。

💨Bean生命周期配置

UserDaoImpl类中添加两个方法

代码语言:java
复制
  public void init(){
        System.out.println("初始化方法");
    }
  public void destory(){
        System.out.println("销毁方法");
    }

修改xml配置文件,init-method:指定类中的初始化方法名称,destroy-method:指定类中销毁方法名称

代码语言:html
复制
<bean id="userdao" class="com.sht.dao.impl.UserDaoImpl"
          scope="singleton"
          init-method="init"
          destroy-method="destory">
</bean>

编写测试代码

代码语言:java
复制
public void test3(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userdao1 = (UserDao) context.getBean("userdao");
        System.out.println(userdao1);
        UserDao userdao2 = (UserDao) context.getBean("userdao");
        System.out.println(userdao2);
        System.out.println("是否为同一个对象实例:" + (userdao1 == userdao2));
        //这里用来关闭容器
        ((ClassPathXmlApplicationContext) context).close();
    }

运行结果:

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

从这个例子,相信大家可以自己推测出创建对象、初始化、方法调用以及销毁的先后顺序了

💨Bean实例化三种方式

🔥方式一:无参构造方法实例化(重点)

其实我们前面一直使用的就是这一种方法,但是需要注意的是,这种方法会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败

🔥方式二:工厂静态方法实例化(了解)

创建一个静态工厂类,直接返回UserDaoImpl类的对象实例

代码语言:java
复制
public class StaticFactory {
    public static UserDao getUserDao(){
        return new UserDaoImpl();
    }
}

编写xml配置文件的bean,这里的class属性值是静态工厂类对应的包的路径,factory-method对应的属性值是类中的方法名

代码语言:html
复制
<bean id="userdao" class="com.sht.factory.StaticFactory" factory-method="getUserDao"></bean>

编写代码测试

代码语言:java
复制
public class UserDaoDemo {
    public static void main(String[] args) {
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userdao = (UserDao) applicationContext.getBean("userdao");
        userdao.save();
    }
}

最终的运行结果还会是:“保存成功~~”

🔥方式三:工厂实例方法实例化(了解)

创建一个工厂类,同样返回UserDaoImpl类的对象实例

代码语言:java
复制
public class DynamicFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}

编写xml配置文件的bean,这里的class属性值是工厂类对应的包的路径,第一个bean可以得到工厂类的对象,再写一个bean,用来获取UserDaoImpl类的对象实例。factory-bean属性值代表从哪个工厂里面拿,factory-method对应的属性值是类中的方法名

代码语言:html
复制
<bean id="factory" class="com.sht.factory.DynamicFactory"></bean>
<bean id="userdao" factory-bean="factory" factory-method="getUserDao"></bean>

最终的运行结果也是:“保存成功~~”

💨总结

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

💦2、Bean的依赖注入

💨基本介绍

依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。

在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。

那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。

简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。

💨Bean的依赖注入方式

🔥方式一:有参构造方法

前面讲的都是无参构造方法,现在讲讲有参构造方法。我们先创建一个UserService接口和其实现类UserServiceImpl

代码语言:java
复制
public interface UserService {
    void save();
}
代码语言:java
复制
public class UserServiceImpl implements UserService {
    private UserDao userdao;
    public UserServiceImpl(UserDao userdao) {
        this.userdao = userdao;
    }
    @Override
    public void save() {
        userdao.save();
    }
}

编写xml配置文件的bean,class属性值分别对应类下的包路径。<constructor-arg name="userdao" ref="userdao"></constructor-arg>name属性值是相应set方法名的去掉set后的首字母小写,ref是引入引入数据类型,即表示着对象属性的注入

代码语言:html
复制
  <bean id="userdao" class="com.sht.dao.impl.UserDaoImpl"></bean>
  <bean id="userService"  class="com.sht.service.impl.UserServiceImpl">
        <constructor-arg name="userdao" ref="userdao"></constructor-arg>
  </bean>
🔥方式二:set方法

接口不变,改变一下UserServiceImpl 类,<font color=#AAA000>需要注意的是,setUserdao()的权限是public,不能写成private哦

代码语言:java
复制
public class UserServiceImpl implements UserService {
    private UserDao userdao;
    //权限是public
    public void setUserdao(UserDao userdao){
        this.userdao = userdao;
    }
    @Override
    public void save() {
        userdao.save();
    }
}

编写xml配置文件的bean,class属性我就不再说明了。重点讲解的是<property name="userdao" ref="userdao"></property>name属性值是相应set方法名的去掉set后的首字母小写,ref是引入引入数据类型,即表示着对象属性的注入;这里把UserDaoImpl类的对象注入到UserServiceImpl类中,就可以调用其save()方法了

代码语言:html
复制
  <bean id="userdao" class="com.sht.dao.impl.UserDaoImpl"></bean>
  <bean id="userService"  class="com.sht.service.impl.UserServiceImpl">
        <property name="userdao" ref="userdao"></property>
  </bean>

测试代码:

代码语言:java
复制
public void test5(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) context.getBean("userService");
        userService.save();
    }

运行结果:

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

此外,set方法中有一个特殊的方法:P命名空间注入。其本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下:

引入xmlns:p="http://www.springframework.org/schema/p"名称空间,其次p:userdao-ref属性值是跟ref对应的属性值的含义是一样的,这种方法可以作为了解

代码语言:html
复制
<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
       
    <bean id="userdao" class="com.sht.dao.impl.UserDaoImpl"></bean>  
    <bean id="userService" class="com.sht.service.impl.UserServiceImpl" p:userdao-ref="userdao"></bean>
</beans>

💦3、Bean的依赖注入数据类型

💨普通数据类型的注入

我用set方法的方式,讲解bean的依赖注入。继续在UserDaoImpl类中添加两个基本数据类型和它们的set方法

代码语言:java
复制
    private String name;
    private Integer age;
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public void show() {
        System.out.println("名字是" + name + "的年龄是" + age);
    }

修改xml配置文件的bean,name的属性值代表着set方法的名,value的属性值表示你想要填入的属性值

代码语言:html
复制
<bean id="userDao" class="com.sht.dao.impl.UserDaoImpl">
        <property name="name" value="卷心菜"></property>
        <property name="age" value="20"></property>
</bean>

写一个测试类:

代码语言:java
复制
   public void test7(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDaoImpl contextBean = context.getBean(UserDaoImpl.class);
        contextBean.show();
    }

运行结果:

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

💨集合数据类型的注入

🔥List<String>类型的注入

继续在UserDaoImpl类中改动代码:

代码语言:java
复制
    private List<String> stringList;
    public void setStringList(List<String> stringList) {
        this.stringList = stringList;
    }
    public void showStringList() {
        System.out.println(stringList);
    }

修改xml配置文件,注入基本数据类型就是两个关键字<list><value>

代码语言:html
复制
  <bean id="userDao" class="com.sht.dao.impl.UserDaoImpl">
       <property name="stringList">
          <list>
              <value>111</value>
              <value>222</value>
              <value>333</value>
          </list>
       </property>
  </bean>

运行结果:

在这里插入图片描述
在这里插入图片描述
🔥List<User>类型的注入

先创建一个User类,有对应的get和set方法,还有toString方法,方便测试使用

代码语言:java
复制
public class User {
    private Integer id;
    private String username;
    private String password;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

修改xml配置文件的bean,可以看出,与之前不同的是,<list>中用的是<ref>标签,这个标签表示的是注入引用数据类型

代码语言:html
复制
 <bean id="user01" class="com.sht.domain.User">
        <property name="id" value="1"></property>
        <property name="username" value="卷心菜"></property>
        <property name="password" value="123456"></property>
 </bean>
 
    <bean id="user02" class="com.sht.domain.User"></bean>
    
    <bean id="userDao" class="com.sht.dao.impl.UserDaoImpl">
       <property name="userList">
           <list>
               <ref bean="user01"></ref>
               <ref bean="user02"></ref>
           </list>
       </property>
    </bean>

运行结果:

在这里插入图片描述
在这里插入图片描述
🔥Map<String,User> 类型的注入

继续在UserDaoImpl类中改动代码:

代码语言:java
复制
    private Map<String, User> stringUserMap;
    public void setStringUserMap(Map<String, User> stringUserMap) {
        this.stringUserMap = stringUserMap;
    }
    public void showStringUserMap() {
        System.out.println(stringUserMap);
    }

修改xml配置文件,与之前不同的是,当使用的是map时,标签用的是<map>和标签<entry>,使用方法跟list标签差不多

代码语言:html
复制
    <bean id="user01" class="com.sht.domain.User">
        <property name="id" value="1"></property>
        <property name="username" value="卷心菜"></property>
        <property name="password" value="123456"></property>
    </bean>

    <bean id="userDao" class="com.sht.dao.impl.UserDaoImpl">
        <property name="stringUserMap">
         <map>
             <entry key="key1" value-ref="user01"></entry>
         </map>
        </property>
    </bean>

运行结果:

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

需要注意的是,我们在选择key属性时,会有一个如图所示的key-ref的提示,这代表着我们要用的key是一个引入数据类型,因为我用的key是String,所以选择key

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

当使用value-ref时,也会出现value的值,其用法跟上面一样

在这里插入图片描述
在这里插入图片描述
🔥Properties类型的注入

继续在UserDaoImpl类中改动代码:

代码语言:java
复制
    private Properties properties;
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
    public void showProperties(){
        System.out.println(properties);
    }

修改xml配置文件,与之前的不同之处就是标签使用的是<props>和标签<prop>,使用的方法也是跟上面的方法类似

代码语言:html
复制
 <bean id="userDao" class="com.sht.dao.impl.UserDaoImpl">
       <property name="properties">
           <props>
               <prop key="key01">value1</prop>
               <prop key="key02">value2</prop>
           </props>
       </property>
 </bean>

运行结果:

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

💦4、引入其他配置文件(分模块开发)

创建一个新的配置文件applicationContext1.xml,实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载

applicationContext1.xml配置文件中的配置内容引入到applicationContext.xml的实现方式:

代码语言:html
复制
<import resource="applicationContext1.xml"></import>

📕总结

以上就是Spring配置文件的相关知识点,带大家来看看<font color=#ff000>Spring的重点配置:

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 📕前言
  • 一、✔Spring程序快速入门
    • 🌻步骤一:导入 Spring 开发的基本包坐标
      • 🌻步骤二:编写 Dao 接口和实现类
        • 🌻步骤三:创建 Spring 核心配置文件
          • 🌻步骤四:在 Spring 配置文件中配置 UserDaoImpl类
            • 🌻步骤五:使用 Spring 的 API 获得 Bean 实例
            • 二、✔Spring配置文件使用
              • 💦1、Bean标签基本配置
                • 💨基本介绍
                • 💨基本属性
                • 💨Bean标签范围配置(Scope)
                • 💨Bean标签实例化时机
                • 💨Bean生命周期配置
                • 💨Bean实例化三种方式
                • 💨总结
              • 💦2、Bean的依赖注入
                • 💨基本介绍
                • 💨Bean的依赖注入方式
              • 💦3、Bean的依赖注入数据类型
                • 💨普通数据类型的注入
                • 💨集合数据类型的注入
              • 💦4、引入其他配置文件(分模块开发)
              • 📕总结
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档