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

简介: 怎样使用Spring的配置文件?带大家一起玩转Spring配置文件(二)

二、✔Spring配置文件使用

💦1、Bean标签基本配置

💨基本介绍

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


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


💨基本属性

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

class:Bean的全限定名称


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


💨Bean标签范围配置(Scope)

image.png

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


<bean id="userdao" class="com.sht.dao.impl.UserDaoImpl" scope="singleton"></bean>


写一个测试代码


 

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",即表明,我们用其创建对象时,不是同一个对象实例


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

image.png


💨Bean标签实例化时机

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


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


 

public UserDaoImpl(){
        System.out.println("UserDaoImpl开始创建");
    }


🔥scope为singleton时

运行debug,点击F8

image.png

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

image.png


🔥scope为prototype时

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

image.png

再次按F8下一步

image.png

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

image.png


🔥总结

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


💨Bean生命周期配置

在UserDaoImpl类中添加两个方法


public void init(){
        System.out.println("初始化方法");
    }
  public void destory(){
        System.out.println("销毁方法");
    }

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


<bean id="userdao" class="com.sht.dao.impl.UserDaoImpl"
          scope="singleton"
          init-method="init"
          destroy-method="destory">
</bean>


编写测试代码


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();
    }


运行结果:

image.png

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


💨Bean实例化三种方式

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

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


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

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


public class StaticFactory {
    public static UserDao getUserDao(){
        return new UserDaoImpl();
    }
}


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


<bean id="userdao" class="com.sht.factory.StaticFactory" factory-method="getUserDao"></bean>


编写代码测试


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


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


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

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


public class DynamicFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}


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


<bean id="factory" class="com.sht.factory.DynamicFactory"></bean>
<bean id="userdao" factory-bean="factory" factory-method="getUserDao"></bean>


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


💨总结

image.png


💦2、Bean的依赖注入

💨基本介绍

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


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


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

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


💨Bean的依赖注入方式

🔥方式一:有参构造方法

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


public interface UserService {
    void save();
}


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是引入引入数据类型,即表示着对象属性的注入


 

<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 类,需要注意的是,setUserdao()的权限是public,不能写成private哦


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()方法了


<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>


测试代码:


public void test5(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) context.getBean("userService");
        userService.save();
    }


运行结果:

image.png

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


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


<?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>


相关文章
|
4天前
|
存储 运维 Java
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
17 2
|
4天前
|
XML 运维 Java
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
11 1
|
8天前
|
前端开发 安全 Java
实现Spring Boot中的文件分片上传通常涉及到以下几个步骤和考虑的关键点
实现Spring Boot中的文件分片上传通常涉及到以下几个步骤和考虑的关键点
24 2
|
1月前
|
Java 容器 Spring
Spring的加载配置文件、容器和获取bean的方式
Spring的加载配置文件、容器和获取bean的方式
30 3
Spring的加载配置文件、容器和获取bean的方式
|
19小时前
|
Java 数据库连接 Spring
JDBC配置文件抽取-spring11
JDBC配置文件抽取-spring11
|
1天前
|
Java Spring
spring如何引入配置文件
spring如何引入配置文件
|
22天前
|
设计模式 Java 关系型数据库
Spring的配置文件,如何配置端口号,,properties,yml获取配置项等方法,外观模式及其优缺点,日志代表的信息
Spring的配置文件,如何配置端口号,,properties,yml获取配置项等方法,外观模式及其优缺点,日志代表的信息
|
22天前
|
JSON 前端开发 Java
Spring第一课,了解IDEA里面的文件,回顾Cookie和Session,获取Session,Cookie,Header的方式
Spring第一课,了解IDEA里面的文件,回顾Cookie和Session,获取Session,Cookie,Header的方式
|
7天前
|
JavaScript Java 数据库连接
【Spring Boot】掌握Spring Boot:深入解析配置文件的使用与管理
【Spring Boot】掌握Spring Boot:深入解析配置文件的使用与管理
15 0
|
1月前
|
XML 监控 Java
Spring Boot 配置文件
Spring Boot 配置文件
27 2