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
相关推荐
用户922396103272819 小时前
mongod社区版 + mongot社区版,实现数据库+向量库检索等功能
后端
苏州第一深情19 小时前
终结加班眼酸?明基RD280U测评:程序员的双倍快乐,竟是4K护眼大屏给的!
前端·后端
开始学java19 小时前
时间处理相关类
后端
i18nsite19 小时前
互联网重构日记:1 - 开篇
前端·后端
自由生长202419 小时前
算法思考-动态规划、马尔科夫链与RNN:贯穿AI的状态依赖哲学
后端
武子康19 小时前
大数据-127 - Flink StateBackend详解:Memory、Fs、RocksDB 与 OperatorState 管理机制与重分配原理
大数据·后端·flink
间彧19 小时前
Java transient关键字详解与项目实战
后端
华仔啊19 小时前
Java 重试机制没写对,线上很容易出问题!这份生产级方案请收好
java·后端
CodeSheep20 小时前
大家有没有发现一个奇特现象:你能在一个公司工作 12 年以上,无论你多忠诚多卖力,一旦公司赚的少了,那你就成了“眼中钉肉中刺”
前端·后端·程序员