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 ,并且存储到 FactoryBeanObjectCacheMap 当中,如果再次调用则直接从这个 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
相关推荐
萝卜白菜。1 天前
关于Java EE应用中xml解析类的问题
xml·java·java-ee
ejinxian3 天前
protobuf 、JSON、XML传输格式
xml·json·protobuf
yue0083 天前
C# XML文件的读写V2.0
xml·开发语言·c#
emma羊羊5 天前
【weblogic】XML反序列化漏洞
xml·安全
研來如此6 天前
XML与HTML
xml·html
一个W牛6 天前
报文比对工具(xml和sop)
xml·前端·javascript
Java&Develop7 天前
使用 JDOM 库生成 XML 文件并返回 File
xml
关关长语7 天前
Dotnet使用System.Xml.Serialization处理Xml序列化
xml·c#·.net
Dolphin_Home7 天前
轻量实用的 XML 与 JSON / 对象互转工具类(Jackson 实现)
xml·java·json
huluang7 天前
XML文档差异分析工具:深入解析Word XML结构变化
xml·word