• 基于Xml方法的Bean的配置-实例化Bean的方法-构造方法


    SpringBean的配置详解

    • Bean的实例化配置
      • Spring的实例化方法主要由以下两种
        • 构造方法实例化

        • 底层通过构造方法对bean进行实例化

          • 构造方法实例化bean又分为无参方法实例化和有参方法实例化,在Spring中配置的几乎都是无参构造该方式,默认是无参构造方法,在此处不赘述。下面讲解有参构造方法实例化Bean
            • 在配置文件中为有参构造方法中的参数指定值
              1. "1.0" encoding="UTF-8"?>
              2. <beans xmlns="http://www.springframework.org/schema/beans"
              3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
              5. <bean id="userService" class="com.example.Service.Impl.UserServiceImpl">
              6. <constructor-arg name="name" value="hahaha">constructor-arg>
              7. <property name="userDAO" ref="userDAO">property>
              8. bean>
              9. <bean id="userDAO" class="com.example.DAO.UserDAO">bean>
              10. beans>
              1. package com.example.Service.Impl;
              2. import com.example.DAO.UserDAO;
              3. import com.example.Service.UserService;
              4. public class UserServiceImpl implements UserService {
              5. // todo 无参构造方法
              6. public UserServiceImpl() {
              7. System.out.println("无参构造方法");
              8. }
              9. // todo 有参构造方法
              10. public UserServiceImpl(String name) {
              11. System.out.println("有参构造方法");
              12. System.out.println(name);
              13. }
              14. private UserDAO userDAO;
              15. public void setUserDAO(UserDAO userDAO) {
              16. }
              17. }
            • 测试类运行结果

              1. package com.example.Test;
              2. import org.springframework.context.ApplicationContext;
              3. import org.springframework.context.support.ClassPathXmlApplicationContext;
              4. public class TestApplicationContext {
              5. public static void main(String[] args) {
              6. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
              7. Object userService1 = context.getBean("userService");
              8. System.out.println(userService1);
              9. context.close();
              10. }
              11. }

        • 工厂方法实例化Bean

        • 底层通过自定义的工厂方法对Bean进行实例化
          • 静态工厂方法实例化Bean

            • 自定义一个工厂,工厂内部自定义静态方法,在状态方法内部产生一个bean,最后bean交给Spring容器管理
            • 创建一个类,在该类中完成对象的创建,然后交给Spring容器管理,对象的创建前后,设置一些逻辑代码
            • 工厂类代码
                1. package com.example.Factory;
                2. import com.example.DAO.Impl.UserDAOImpl;
                3. import com.example.DAO.UserDAO;
                4. public class MyBeanFactory1 {
                5. public static UserDAO userDAO() {
                6. // todo 设置创建对象前的逻辑代码
                7. return new UserDAOImpl();
                8. // todo 设置创建对象后的逻辑代码
                9. }
                10. }
            • 配置类中的关键代码

              •     <bean id="userDAO1" class="com.example.Factory.MyBeanFactory1" factory-method="userDAO">bean>
                

                设置userDAO1的bean对象,且是指定类中UserDAO方法返回值作为该bean对象,而不是指定的类

            • 测试类

                1. package com.example.Test;
                2. import org.springframework.context.support.ClassPathXmlApplicationContext;
                3. public class TestApplicationContext {
                4. public static void main(String[] args) {
                5. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
                6. Object userDAO1 = context.getBean("userDAO1");
                7. System.out.println(userDAO1);
                8. }
                9. }
            • 运行结果如下

          • 实例工厂方法实例化Bean

            • 工厂内部的方法是非静态的。(需要工厂对象进行(由此要配置工厂对象)方法调用)
              • 由此配置代码如下
                  1. "BeanFactory2" class="com.example.Factory.MyBeanFactory2">
                  2. "userDAO2" factory-bean="BeanFactory2" factory-method="userDAO">
          • 实现FactoryBean接口,延迟实例化Bean

              1. package com.example.Factory;
              2. import com.example.DAO.Impl.UserDAOImpl;
              3. import com.example.DAO.UserDAO;
              4. import org.springframework.beans.factory.FactoryBean;
              5. public class MyBeanFactory3 implements FactoryBean {
              6. @Override
              7. public UserDAO getObject() throws Exception {
              8. return new UserDAOImpl();
              9. }
              10. @Override
              11. public Class getObjectType() {
              12. return UserDAO.class;
              13. }
              14. }
          • 配置文件

            •     <bean name="userDAO3" class="com.example.Factory.MyBeanFactory3">bean>
              
          • 测试类

              1. package com.example.Test;
              2. import org.springframework.context.support.ClassPathXmlApplicationContext;
              3. public class TestApplicationContext {
              4. public static void main(String[] args) {
              5. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
              6. Object userDAO = context.getBean("userDAO3");
              7. System.out.println(userDAO);
              8. }
              9. }
            •  (只有在调用getBean()方法时才会对bean对象进行实例化)

    在上述文章中,工厂类中的方法都是无参方法。

    下面介绍工厂类中的方法为有参方法

    • 工厂类及其方法
    1. package com.example.Factory;
    2. import com.example.DAO.Impl.UserDAOImpl;
    3. import com.example.DAO.UserDAO;
    4. public class MyBeanFactory1 {
    5. public static UserDAO userDAO(String name) {
    6. System.out.println(name);
    7. return new UserDAOImpl();
    8. }
    9. }
    •  配置文件
    1. <bean id="userDAO1" class="com.example.Factory.MyBeanFactory1" factory-method="userDAO">
    2. <constructor-arg name="name" value="hkm">constructor-arg>
    3. bean>

    依然使用的是 标签

    • 运行测试类
    1. package com.example.Test;
    2. import org.springframework.context.support.ClassPathXmlApplicationContext;
    3. public class TestApplicationContext {
    4. public static void main(String[] args) {
    5. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
    6. Object userDAO1 = context.getBean("userDAO1");
    7. System.out.println(userDAO1);
    8. }
    9. }
    • 运行结果

  • 相关阅读:
    2.13每日一题(根号下的定积分及去绝对值的定积分)
    基于SSM实现毕业设计管理系统
    如何提高网站安全防护?
    OpenHarmony实战开发-如何实现防盗链应用功能。
    ElasticSearch DSL与java API示例
    【软件工程】一文完全理解用例和用例图
    代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
    html--全魔乱舞
    java计算机毕业设计妇女健康保健系统MyBatis+系统+LW文档+源码+调试部署
    Maven高级-分模块开发和设计及依赖管理
  • 原文地址:https://blog.csdn.net/weixin_64939936/article/details/132953644