spring的xml方式配置bean全过程

 更新时间:2026年03月16日 10:05:26   作者:月731  
文章介绍了Spring框架中配置bean的四种情况:无参构造方法、有参构造方法、Setter方法和实现InitializingBean接口,还提到了IOC控制反转、DI依赖注入和AOP面向切面编程是Spring的三大特性

配置bean的4种情况

无参构造

首先定义UserDao,UserDaoImpl,UserService,UserServiceImpl如下

public interface UserDao {
}

public class UserDaoImpl implements UserDao {
}

public interface UserService {
    void normalMethod();
}

public class UserServiceImpl implements UserService, InitializingBean, DisposableBean {

    private UserDao userDao;

    public UserServiceImpl() {
        System.out.println("执行UserServiceImpl无参构造方法");
    }

    public UserServiceImpl(String name) {
        System.out.println("执行UserServiceImpl有参构造方法, name = " + name);
    }

    public void setUserDao(UserDao userDao) {
        System.out.println("自动依赖注入,设置UserDao");
        this.userDao = userDao;
    }

    @Override
    public void afterPropertiesSet() {
        System.out.println("执行InitializingBean的afterPropertiesSet");
    }

    public void init() {
        System.out.println("执行bean标签定义的初始化方法");
    }

    @Override
    public void normalMethod() {
        System.out.println("执行普通业务方法");
    }

    @Override
    public void destroy() {
        System.out.println("执行DisposableBean的destroy");
    }

    public void myDestroy() {
        System.out.println("执行bean标签定义的销毁方法");
    }
}

实例化UserDao的方式:

UserDao userDao = new UserDaoImpl();

以无参构造方法配置bean的方式:

<bean id="userDao" class="com.yt.dao.impl.UserDaoImpl"/>

验证

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        UserDao userDao = (UserDao) context.getBean("userDao");
        System.out.println(userDao);
        // 输出 com.yt.dao.impl.UserDaoImpl@103f852
    }

有参构造

实例化UserService的方式:

UserService userService = new UserServiceImpl("yt");

以有参构造方法配置bean的方式:

<bean id="userService"  class="com.yt.service.impl.UserServiceImpl">
        <constructor-arg name="name" value="yt"/>
</bean>

验证

    public static void main(String[] args) {
       ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println(context.getBean("userService"));
        // 输出
        // 执行UserServiceImpl有参构造方法, name = yt
        // com.yt.service.impl.UserServiceImpl@179bb86
    }

依赖注入

IOC控制反转,DI依赖注入,AOP面向切面编程是spring的三大特性。

配置bean时想要自动注入bean的属性需要提供:bean要注入的对象对应的setter方法,被注入的bean,property标签。

    <bean id="userService" class="com.yt.service.impl.UserServiceImpl">
        <constructor-arg name="name" value="yt"/>
        <property name="userDao" ref="userDao"/>
    </bean>
    <bean id="userDao" class="com.yt.dao.impl.UserDaoImpl"/>

验证

    public static void main(String[] args) {
       ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println(context.getBean("userService"));
        // 输出
        // 执行UserServiceImpl有参构造方法, name = yt
        // 自动依赖注入,设置UserDao
        // com.yt.service.impl.UserServiceImpl@179bb86
    }

bean标签的属性

<bean id="userService"
          name="aaa,bbb,ccc" // 别名,可起多个,getBean时可使用别名获取
          class="com.yt.service.impl.UserServiceImpl"
          scope="prototype" // 默认单例singleton,非默认原型prototype,即每次获取bean都是不同的实例
          lazy-init="true" //懒加载,只在获取bean时生成bean,默认非懒加载,启动容器就创建bean
          init-method="init" // 指定类里面的一个方法为初始化方法
          destroy-method="myDestroy"> // 指定类里面的一个方法为销毁方法,需要手动关闭容器才可看到执行
    </bean>

实现bean的初始化方法和销毁方法还有一种方式,实现InitializingBean, DisposableBean接口。bean标签指定的方法和实现接口的方法的执行顺序见运行结果

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println(context.getBean("userService"));
        userService.normalMethod();
        //当scope是prototype的时候,对象的生存周期spring就不管了。只有在tomcat或者容器关闭的时候,由tomcat调用
        context.close();
    }
// 输出
// 执行UserServiceImpl无参构造方法
// 执行InitializingBean的afterPropertiesSet
// 执行bean标签定义的初始化方法
// com.yt.service.impl.UserServiceImpl@179bb86
// 执行普通业务方法

静态工厂方法(字太多了,懒得写了)

    <bean id="userService1" class="com.yt.factory.MyBeanFactory1" factory-method="getUserService"/>

实例工厂方法

    <bean id="myBeanFactory2" class="com.yt.factory.MyBeanFactory2"/>
    <bean id="userService2" factory-bean="myBeanFactory2" factory-method="getUserService" lazy-init="true"/>

综合使用

记得导入坐标,再到mybaits官方文档的入门里面下一个xml配置文件模板,改成自己的,记得删掉mappe标签,因为没写

我还是贴出来

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/bai"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.23</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.23</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>

当前版本为jdk8

    <!--配置数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/bai"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    
    <!--配置Connection-->
    <bean id="clazz" class="java.lang.Class" factory-method="forName">
        <constructor-arg name="className" value="com.mysql.jdbc.Driver"/>
    </bean>
    <bean id="connection" class="java.sql.DriverManager" factory-method="getConnection" scope="prototype">
        <constructor-arg name="url" value="jdbc:mysql://localhost:3306/bai"/>
        <constructor-arg name="user" value="root"/>
        <constructor-arg name="password" value="123456"/>
    </bean>
    
    <!--配置一个当前时间-->
    <bean id="now" class="java.time.LocalDateTime" factory-method="now"/>
    <bean id="dateTimeFormatter" class="java.time.format.DateTimeFormatter" factory-method="ofPattern">
        <constructor-arg name="pattern" value="yyyy-MM-dd HH:mm:ss"/>
    </bean>
    <bean id="nowString" factory-bean="now" factory-method="format">
        <constructor-arg name="formatter" ref="dateTimeFormatter"/>
    </bean>

    <!--配置一个SqlSessionFactory-->
    <bean id="mybatisConfigInputStream" class="org.apache.ibatis.io.Resources" factory-method="getResourceAsStream">
        <constructor-arg name="resource" value="mybatis-config.xml"/>
    </bean>
    <bean id="sqlSessionFactoryBuild" class="org.apache.ibatis.session.SqlSessionFactoryBuilder"/>
    <bean id="sqlSessionFactory" factory-bean="sqlSessionFactoryBuild" factory-method="build">
        <constructor-arg name="inputStream" ref="mybatisConfigInputStream"/>
    </bean>

验证

public class ThirdPartyBeanTest {
    public static void main(String[] args) throws Exception {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println(context.getBean("dataSource"));
        System.out.println(context.getBean("connection"));
        System.out.println(context.getBean("connection"));
        System.out.println(context.getBean("nowString"));
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = builder.build(is);
        System.out.println(sqlSessionFactory);
        System.out.println(context.getBean("sqlSessionFactory"));
    }
}
// 输出
{
	CreateTime:"2022-11-10 23:53:05",
	ActiveCount:0,
	PoolingCount:0,
	CreateCount:0,
	DestroyCount:0,
	CloseCount:0,
	ConnectCount:0,
	Connections:[
	]
}
Thu Nov 10 23:53:05 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
com.mysql.jdbc.JDBC4Connection@1af006c
Thu Nov 10 23:53:07 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
com.mysql.jdbc.JDBC4Connection@1d1433e
2022-11-10 23:53:05
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@46293d
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@1997e9d

Process finished with exit code 0

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实现Http工具类的封装操作示例

    Java实现Http工具类的封装操作示例

    这篇文章主要介绍了Java实现Http工具类的封装操作,涉及java针对http请求与响应、远程交互与字符串拼接等操作封装技巧,需要的朋友可以参考下
    2018-01-01
  • 解决java后台登录前后cookie不一致问题

    解决java后台登录前后cookie不一致问题

    本文主要介绍了java后台登录前后cookie不一致的解决方案,具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • java实现酷狗音乐临时缓存文件转换为MP3文件的方法

    java实现酷狗音乐临时缓存文件转换为MP3文件的方法

    这篇文章主要介绍了java实现酷狗音乐临时缓存文件转换为MP3文件的方法,涉及java针对文件操作的相关技巧,需要的朋友可以参考下
    2016-08-08
  • SpringBoot集成Hera实现分布式应用监控与追踪解决方案

    SpringBoot集成Hera实现分布式应用监控与追踪解决方案

    Hera是一款由美团点评开源的分布式应用监控与追踪系统,专注于解决微服务架构下的性能监控、故障诊断和链路追踪问题,本文给大家介绍了SpringBoot集成Hera实现分布式应用监控与追踪的解决方案,需要的朋友可以参考下
    2026-01-01
  • 使用Java生成和识别二维码的简易教程

    使用Java生成和识别二维码的简易教程

    在当今瞬息万变的商业和技术环境中,二维码已成为快速、高效信息传递的代名词,本文将为您介绍 Spire.Barcode for Java 这一强大工具,它能帮助您轻松应对Java应用程序中的二维码生成与识别挑战,需要的朋友可以参考下
    2025-09-09
  • Mybatis-plus如何开启二级缓存

    Mybatis-plus如何开启二级缓存

    这篇文章主要介绍了Mybatis-plus如何开启二级缓存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java web项目启动Tomcat报错解决方案

    Java web项目启动Tomcat报错解决方案

    这篇文章主要介绍了Java web项目启动Tomcat报错解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java超详细分析继承与重写的特点

    Java超详细分析继承与重写的特点

    继承是Java面向对象编程中的一门。继承是子类继承父类的特征和行为,或者是继承父类得方法,使的子类具有父类得的特性和行为。重写是子类对父类的允许访问的方法实行的过程进行重新编写,返回值和形参都不能改变。就是对原本的父类进行重新编写,但是外部接口不能被重写
    2022-05-05
  • Java排序的那些事之sort方法的使用详解

    Java排序的那些事之sort方法的使用详解

    sort方法用于对数组的元素进行排序。排序顺序可以是字母或数字,并按升序或降序。默认排序顺序为按字母升序,当数字是按字母顺序排列时"40"将排在"5"前面。使用数字排序,你必须通过一个函数作为参数来调用。这些说起来可能很难理解,你可以通过本篇文章进一步了解它
    2021-09-09
  • Java不指定长度的二维数组实例

    Java不指定长度的二维数组实例

    今天小编就为大家分享一篇Java不指定长度的二维数组实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07

最新评论