xml方式bean的配置---实例化bean的方式

xml方式bean的配置---实例化bean的方式

  • 构造函数
  • 无参构造
  • 有参构造
  • 工厂方法
  • 静态工厂
  • 实例工厂
  • 实现 FactoryBean 规范延迟实例化 Bean

项目结构

pom.xml 文件

java 复制代码
<dependencies>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.10.RELEASE</version>
    </dependency>
</dependencies>
无参构造

默认调用无参构造

java 复制代码
<?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="userDao" class="com.kaiming.dao.impl.UserDaoImpl"></bean>

    <!-- userService中注入userDao-->
    <bean id="userService" class="com.kaiming.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>
    
</beans>    
java 复制代码
public class UserServiceImpl implements UserService {
    
    public UserServiceImpl() {
        System.out.println("UserServiceImpl无参构造方法");
    }
    
    public void setUserDao(UserDao userDao) {
        System.out.println("userDao" + userDao);
    }
}
java 复制代码
UserServiceImpl无参构造方法
userDaocom.kaiming.dao.impl.UserDaoImpl@319b92f3
com.kaiming.service.impl.UserServiceImpl@fcd6521
有参构造

beanx.xml 文件

java 复制代码
<?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="userDao" class="com.kaiming.dao.impl.UserDaoImpl"></bean>

    <!-- userService中注入userDao-->
    <bean id="userService" class="com.kaiming.service.impl.UserServiceImpl">
        <!-- 有参构造,不指定默认调用无参构造-->
        <constructor-arg name="name" value="haohao"></constructor-arg>
        <property name="userDao" ref="userDao"></property>
    </bean>
    
</beans>    
java 复制代码
public class UserServiceImpl implements UserService {
    
    public UserServiceImpl() {
        System.out.println("UserServiceImpl无参构造方法");
    }
    
    public UserServiceImpl (String name) {
        System.out.println("UserServiceImpl有参构造方法");
    }
    
    public void setUserDao(UserDao userDao) {
        System.out.println("userDao" + userDao);
    }
}
java 复制代码
UserServiceImpl有参构造方法
userDaocom.kaiming.dao.impl.UserDaoImpl@319b92f3
com.kaiming.service.impl.UserServiceImpl@fcd6521

工厂方法实例化

静态工厂方法实例化bean

factory 包下创建一个 MyBeanFactory ,且静态方法为无参

java 复制代码
public class MyBeanFactory {
    // 静态方法
    public static UserDao userDao() {
        // bean 创建前后可以做一些初始化的工作,执行一些业务逻辑
        return new UserDaoImpl();
    }
}
java 复制代码
<?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="userDao1" class="com.kaiming.factory.MyBeanFactory" factory-method="userDao"></bean>
    
    <bean id="userDao" class="com.kaiming.dao.impl.UserDaoImpl"></bean>

    <!-- userService中注入userDao-->
    <bean id="userService" class="com.kaiming.service.impl.UserServiceImpl">
        <constructor-arg name="name" value="haohao"></constructor-arg>
        <property name="userDao" ref="userDao"></property>
    </bean>
    
</beans>    

test 测试

java 复制代码
public class ApplicationContextTest {

    public static void main(String[] args) {

        BeanFactory beanFactory = new ClassPathXmlApplicationContext("beans.xml");

        Object userDao1 = beanFactory.getBean("userDao1");
        System.out.println(userDao1);
    }
}
java 复制代码
UserServiceImpl有参构造方法
com.kaiming.dao.impl.UserDaoImpl@436a4e4b

factory 包下创建的 MyBeanFactory ,且静态方法为有参 ,若有多个参数,配置多个 <constructor-arg>

java 复制代码
public class MyBeanFactory {
    
    public static UserDao userDao(String name) {
        return new UserDaoImpl();
    }
}
java 复制代码
<!--静态方法-->
<bean id="userDao1" class="com.kaiming.factory.MyBeanFactory" factory-method="userDao">
    <constructor-arg name="name" value="haohao"></constructor-arg>
</bean>
实例工厂

factory 包下创建一个 MyBeanFactory2 ,且实例方法为无参

java 复制代码
public class MyBeanFactory2 {
    public  UserDao userDao() {
        return new UserDaoImpl();
    }
}
java 复制代码
<?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="MyBeanFactory" class="com.kaiming.factory.MyBeanFactory2"></bean>
    <bean id="userDao2" factory-bean="MyBeanFactory" factory-method="userDao"></bean>
    
    
    <bean id="userDao1" class="com.kaiming.factory.MyBeanFactory" factory-method="userDao"></bean>
    <bean id="userDao" class="com.kaiming.dao.impl.UserDaoImpl"></bean>
    <!-- userService中注入userDao-->
    <bean id="userService" class="com.kaiming.service.impl.UserServiceImpl">
        <constructor-arg name="name" value="haohao"></constructor-arg>
        <property name="userDao" ref="userDao"></property>
    </bean>
    
</beans>    

factory 包下创建的 MyBeanFactory2 ,且静态方法为有参 ,若有多个参数,配置多个 <constructor-arg>

java 复制代码
<bean id="MyBeanFactory" class="com.kaiming.factory.MyBeanFactory2"></bean>
    <bean id="userDao2" factory-bean="MyBeanFactory" factory-method="userDao">
    <constructor-arg name="name" value="haha"></constructor-arg>
</bean>
实现 FactoryBean 规范延迟实例化 Bean

对 bean 的创建有延迟加载的功能,只有用到时,才调用 getObject() 返回 bean ,并且存储到 FactoryBeanObjectCache 的 Map 当中,如果再次调用则直接从这个 Map 中获取并返回,而不会调用 getObject() 方法

java 复制代码
public interface FactoryBean<T> {
    String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
	
    // 返回bean
    @Nullable
    T getObject() throws Exception;
	
    // 返回对象类型
    @Nullable
    Class<?> getObjectType();
	
    // 是否为单例
    default boolean isSingleton() {
        return true;
    }
}

factory 包下创建的 MyBeanFactory3 实现 FactoryBean 接口

java 复制代码
public class MyBeanFactory3 implements FactoryBean<UserDao> {
    

    @Override
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    @Override
    public Class<?> getObjectType() {
        return UserDao.class;
    }
}

test 测试

java 复制代码
public class ApplicationContextTest {

    public static void main(String[] args) {

        BeanFactory beanFactory = new ClassPathXmlApplicationContext("beans.xml");

        Object userDao3 = beanFactory.getBean("userDao3");
        System.out.println(userDao3);
    }
}
java 复制代码
UserServiceImpl有参构造方法
com.kaiming.dao.impl.UserDaoImpl@3c153a1
相关推荐
泡海椒19 小时前
从 XML 到 Excel:JQuick-Excel 代理与解析器如何协作
xml·excel
流烟默2 天前
Spring Boot 异常响应被序列化为 XML 的排查与修复
xml·spring boot·后端
mmsx2 天前
Android 地图上绘制 KML:解析、样式与渲染
android·xml
不会C语言的男孩2 天前
libxml2 源码编译与 XML 读取验证(x86 / ARM)
xml·c语言·嵌入式
泡海椒4 天前
Spring 项目中如何组织 JQuick-Excel 的 XML 与 Bean
xml·spring·excel
驭渊的小故事4 天前
MyBatis XML 开发实战:从配置到 CRUD 全解析
xml·java·mybatis
芦芭荞5 天前
QT使用xml模版生成word文档
xml·qt·word
楚识科技8 天前
XML配置OCR接入实战:自定义OCR模板从字段定义到API调用全流程
xml·java·ocr
hasty13 天前
policy.xml 在,不代表策略生效:ImageMagick 补丁给安全配置验收的提醒
xml·mysql·安全
泡海椒16 天前
JQuick-Excel JQuickRow 数据准备实战:JObjectConverter、JQuickRow.toRows 与 XML 导出链路
xml·windows·excel