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
相关推荐
行百里er5 小时前
Redis 完结篇——Redis 热点问题在 Spring Boot 项目中实战
redis·后端
高频因子挖掘机6 小时前
只取最近 60 个交易日,却每次拉全历史:量化脚本变慢的原因与改法
后端·github·api
孟健7 小时前
从5000亿Token到83%字节匹配:AI逆向工程与重构的工程闭环实践
后端·架构·ai编程
码事漫谈8 小时前
丢得静悄悄,谈一谈 Agent 的记忆是怎么没的
后端
迪飞特科技8 小时前
智慧物业平台实战:Spring Boot 整合小程序实现报修巡检费用全流程
spring boot·后端·小程序
考虑考虑8 小时前
@JsonInclude注解使用
spring boot·后端·spring
IT_陈寒8 小时前
Vite的这个问题坑了我三天,原来如此解决!
前端·人工智能·后端
网易云信8 小时前
大模型能上岗做销售吗?我们让 12 款国产模型交了 420 份作业
前端·后端
CCblandy8 小时前
HTTP 长连接 3 类故障实测:[WinError 10053]、99 个 TIME_WAIT、69 次多余握手,4 种对策怎么选
后端·python·网络协议·http·云原生·性能优化·架构
蜗牛互联网9 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python