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

2023-09-17 21:25:22

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

    }
}
  • 运行结果

更多推荐

典型数据结构-图,图的存储、基本操作和遍历

图引自:《数据结构教程》。概念图可以使得元素之间的关系是多对多。图中任意两个数据元素之间都可能存在连接关系。图作为一种数据结构,可以表达数据元素之间广泛存在着的更为复杂的关系。在众多应用之中,如电子线路分析、工程计划分析、寻找最短路径等等,图是描述这类关系的一个十分自然的模型。有关图论的内容是离散数学的主要内容之一,这

go语言操作数据库

1.10GO连接MySQL因为Go语言没有提供任何官方数据库驱动,所以需要安装第三方函数库。由于在github上安装,所以需要安装git软件,安装过程一直点击下一步即可。安装完成后需要配置环境变量1.10.1安装gitgit软件安装完毕后,配置git的环境变量,这样可以使用get的指令1.10.2安装数据库驱动设置GO

简单几个配置 Go 实现敏感数据脱敏,可以自定义数据脱敏规则(附完整实现源码)

简单几个配置Go实现敏感数据脱敏,可以自定义数据脱敏规则(附完整实现源码)。介绍为了保障企业的数据安全和隐私安全,godlp提供了一系列针对敏感数据的识别和处置方案,其中包含敏感数据识别算法,数据脱敏处理方式,业务自定义的配置选项和海量数据处理能力。godlp能够应用多种隐私合规标准,对原始数据进行分级打标、判断敏感级

pytorch环境配置

pytorch安装与基础pytorch相关配置一:安装cuda1:找到nvidiacontrolpanel2:打开控制面板,找到系统信息中的,组件即可查看到cuda版本,这里我的cuda版本为12.0.1503:下载对应版本的cudatoolkit(我下载的12.0.1)4:安装流程5.验证是否安装成功二:配置cuDN

5-2 Pytorch中的模型层layers

深度学习模型一般由各种模型层组合而成。torch.nn中内置了非常丰富的各种模型层。它们都属于nn.Module的子类,具备参数管理功能。例如:nn.Linear,nn.Flatten,nn.Dropout,nn.BatchNorm2d,nn.Embeddingnn.Conv2d,nn.AvgPool2d,nn.Con

Go并发可视化解释 – select语句

上周,我发布了一篇关于如何直观解释Golang中通道(Channel)的文章。如果你对通道仍然感到困惑,请先查看那篇文章。Go并发可视化解释—Channel作为一个快速复习:Partier、Candier和Stringer经营着一家咖啡店。Partier负责接受顾客的订单,然后将这些订单传递给厨房,Candier和St

go学习-基本知识点

string转[]byte通用的转换会发生内存拷贝,但是如下利用unsafe.Pointer实现的强转则不需要拷贝funcTestDemo(t*testing.T){a:="aaa"b:="bbbbbbb"//ssh是a的内存地址//通过将字符串的底层地址强制转换成StringHead结构来获取字符串的底层指针和长度/

kafka消费者模式

一、单线程消费者模式packagenj.zb.kb23.kafka;importorg.apache.kafka.clients.consumer.ConsumerConfig;importorg.apache.kafka.clients.consumer.ConsumerRecord;importorg.apache

Python与数据分析--Matplotlib-2

目录1.写在文前2.实例1--武汉新冠趋势图3.简单散点图实例4.灵活散点图实例5.饼图操作实例1.写在文前"""Matplotlib库我们大致已经学完了,但是缺乏一定的实战经验。今天我们就来进行一下matplotlib的实战操作。"""#导入对应的库函数importnumpyasnpimportmatplotlib.

day40 设计模式、jdk8新特性

一、代理模式为其他对象提供一种代理控制此对象的访问若一个对象不适合直接引用另一个对象,代理对象在客户端和目标对象之间起到中介作用组成:抽象角色:通过接口抽象类真实角色实现了哪些方法代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法可以附加自己的操作真实角色:实现抽象角色,定义业务逻辑,供

【Redis 多机服务的简单认识】

目录主从同步哨兵模式集群服务随着业务的不断发展,单机Redis的性能已经不能满⾜我们的需求了,此时我们需要将单机Redis扩展为多机服务,Redis多机服务主要包含以下3个内容:Redis主从同步Redis哨兵模式Redis集群服务(Redis3.0新增功能)主从同步主从同步(主从复制)是Redis⾼可⽤服务的基⽯,也

热文推荐