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

本文详细介绍了Spring框架中Bean的实例化配置,包括构造方法实例化(无参和有参)、工厂方法实例化(静态和非静态),以及通过FactoryBean实现的延迟实例化。通过实例代码展示了如何在XML配置文件中应用这些技术。
摘要由CSDN通过智能技术生成

SpringBean的配置详解

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

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

        • 构造方法实例化bean又分为无参方法实例化和有参方法实例化,在Spring中配置的<bean>几乎都是无参构造该方式,默认是无参构造方法,在此处不赘述。下面讲解有参构造方法实例化Bean
          • 在配置文件中为有参构造方法中的参数指定值
          • <?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="userService" class="com.example.Service.Impl.UserServiceImpl">
                    <constructor-arg name="name" value="hahaha"></constructor-arg>
                    <property name="userDAO" ref="userDAO"></property>
                </bean>
                <bean id="userDAO" class="com.example.DAO.UserDAO"></bean>
            </beans>
          • package com.example.Service.Impl;
            
            import com.example.DAO.UserDAO;
            import com.example.Service.UserService;
            
            
            public class UserServiceImpl implements UserService {
                // todo 无参构造方法
                public UserServiceImpl() {
                    System.out.println("无参构造方法");
                }
            
                // todo 有参构造方法
                public UserServiceImpl(String name) {
                    System.out.println("有参构造方法");
                    System.out.println(name);
                }
            
                private UserDAO userDAO;
            
                public void setUserDAO(UserDAO userDAO) {
                }
            
            }
            
          • 测试类运行结果

          • package com.example.Test;
            
            import org.springframework.context.ApplicationContext;
            import org.springframework.context.support.ClassPathXmlApplicationContext;
            
            public class TestApplicationContext {
                public static void main(String[] args) {
                    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
                    Object userService1 = context.getBean("userService");
                    System.out.println(userService1);
                    context.close();
            
                }
            }
            

      • 工厂方法实例化Bean

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

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

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

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

          • 测试类

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

        • 实例工厂方法实例化Bean

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

          • package com.example.Factory;
            
            import com.example.DAO.Impl.UserDAOImpl;
            import com.example.DAO.UserDAO;
            import org.springframework.beans.factory.FactoryBean;
            
            public class MyBeanFactory3 implements FactoryBean<UserDAO> {
            
                @Override
                public UserDAO getObject() throws Exception {
                    return new UserDAOImpl();
                }
            
                @Override
                public Class<?> getObjectType() {
                    return UserDAO.class;
                }
            }
            
        • 配置文件

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

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

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

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

  • 工厂类及其方法
package com.example.Factory;

import com.example.DAO.Impl.UserDAOImpl;
import com.example.DAO.UserDAO;

public class MyBeanFactory1 {
    public static UserDAO userDAO(String name) {
        System.out.println(name);
        return new UserDAOImpl();
    }
}
  •  配置文件
    <bean id="userDAO1" class="com.example.Factory.MyBeanFactory1" factory-method="userDAO">
        <constructor-arg name="name" value="hkm"></constructor-arg>
    </bean>

依然使用的是 <constructor-arg>标签

  • 运行测试类
package com.example.Test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestApplicationContext {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        Object userDAO1 = context.getBean("userDAO1");
        System.out.println(userDAO1);

    }
}
  • 运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值