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
相关推荐
code2cat6 天前
Java工具篇之Maven:从pom.xml到测试通过的JAR
xml·java·maven
郭小李8 天前
mybatis的 Mapper.xml语法
xml·java·mybatis
步行cgn8 天前
为什么既要 web.xml 又要 springmvc.xml?能不能只配一个?
xml·前端·hive
SEO_juper10 天前
Go 站点地图生成器:从首页爬全站,一键生成 sitemap.xml
xml·开发语言·人工智能·golang·node.js·seo·外贸独立站
可爱系程序猿12 天前
XML 导入失败并指向 msxml6.dll:用最小样本区分解析错误与组件加载
xml·程序人生·电脑
SEO_juper13 天前
Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清
xml·开发语言·python·node.js·json·bash
步行cgn13 天前
Spring MVC 核心配置文件详解:springmvc.xml 每一行配置的意义
xml·spring·mvc
泡海椒14 天前
JQuick-SQL JQuickTable 模型:XML 动态 SQL 的表封装边界
xml·数据库·sql
supabc12315 天前
欧盟电子发票(XRechnung/Peppol/ZUGFeRD)踩坑记:用 Python 不装 Java 跑官方校验规则
xml·python·开源·电子发票·1024程序员节
zzu123zsw15 天前
当 GPU 加速渲染遇上无头组件:拆解 Yororen UI 在 GPUI 生态下的状态解耦与 XML 模板实践
xml·ui·rust·gui·gpui