(二)spring 的依赖注入,您了解多少?

19 篇文章 0 订阅
5 篇文章 0 订阅

接上篇文章(上)spring 的依赖注入,您了解多少?,继续聊下依赖注入的类型:构造器注入、setter注入、字段注入、方法注入和接口注入,我们逐一介绍各种注入类型。

构造器注入

构造器注入方式也有自动注入和手动注入两种方式,先看下xml的手动注入方式,还是用(上)spring 的依赖注入,您了解多少?文章中的User和UserHodler类代码,在UsserHodler方法中声明了两个构造方法:一个默认无参和一个有参。OK,说再多也没有上代码直接。

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="*.User">
        <property name="id" value="1"/>
        <property name="name" value="李三"/>        
    </bean>

    <bean class="*.UserHolder">
        <constructor-arg name="user" ref="user" />
    </bean>

</beans>

是不是很简单,构造函数注入是不是很简单。其实还有另外实现方式,例如通过java注解元信息方式,还是直接上代码。

public class ConstructorDIDemo {

    public static void main(String[] args) {

        // 创建 BeanFactory 容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        // 注册 Configuration Class(配置类)
        applicationContext.register(ConstructorDIDemo .class);

        XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(applicationContext);

        String xmlResourcePath = "classpath:/META-INF/constructor-context.xml";
        // 加载 XML 资源,解析并且生成 BeanDefinition
        beanDefinitionReader.loadBeanDefinitions(xmlResourcePath);

        // 启动 Spring 应用上下文
        applicationContext.refresh();

        // 依赖查找并且创建 Bean
        UserHolder userHolder = applicationContext.getBean(UserHolder.class);
        System.out.println(userHolder);

        // 显示地关闭 Spring 应用上下文
        applicationContext.close();
    }

    @Bean
    public UserHolder userHolder(User user) {
        return new UserHolder(user);
    }
}

java注解注入比xml的注入稍微复杂,创建beanFactory容器==》注册配置类==》加载xml资源,解析并且生成BeanDefinition ==》启动spring应用上下文==》依赖查找并创建Bean==>最后关闭spring应用上下文。

上面介绍了两种手动构造器注入的方式,下面我看一种自动注入的方式,还是直接上代码

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="*.User">
        <property name="id" value="1"/>
        <property name="name" value="李三"/>        
    </bean>

    <bean class="*.UserHolder" autowire="constructor">       
    </bean>

</beans>

OK,这样就写完了。跟上篇文章一样,建议根据实际情况选择注入方式。

构造器注入使用场景:因为构造函数的参数不易过多,并且参数都是必须的,系统启动后,生成的对象是固定的。因此构造器注入一般使用在少依赖和强制依赖的场景。

这个问题还可以反过来思考,如果一个构造方法的参数比较多,每次使用的时候都传入很多参数,也许有一些参数没有必要,这样就适得其反了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值