IoC注入的方式

2020-02-11  本文已影响0人  摸摸脸上的胡渣
  1. Setter注入
    对应的field必须有setter方法,在xml中配置或在@Configuration修饰的类中,书写相应的@Bean方法
public class AccountServiceImpl implements AccountService {

    /**
     * 需要注入的对象
     */
    private AccountDao accountDao;

    /**
     * 对应的setter方法
     */
    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }
 }
xml注入方式
<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
        ">
    <!-- 声明accountDao对象,交给spring创建 -->
    <bean name="accountDao" class="com.zejian.spring.springIoc.dao.impl.AccountDaoImpl"/>
    <!-- 声明accountService对象,交给spring创建 -->
    <bean name="accountService" class="com.zejian.spring.springIoc.service.impl.AccountServiceImpl">
          <!-- 注入accountDao对象,需要set方法-->
          <property name="accountDao" ref="accountDao"/>
    </bean>
</beans>
@Configuration注入方式

package com.zejian.spring.springIoc.conf;

import com.zejian.spring.springIoc.dao.AccountDao;
import com.zejian.spring.springIoc.dao.impl.AccountDaoImpl;
import com.zejian.spring.springIoc.service.AccountService;
import com.zejian.spring.springIoc.service.impl.AccountServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfiguration {

    @Bean
    public AccountDao accountDao(){
        return new AccountDaoImpl();
    }

    @Bean
    public AccountService accountService(){
        AccountServiceImpl bean=new AccountServiceImpl();
        //注入dao
        bean.setAccountDao(accountDao());
        return bean;
    }
}
  1. 构造方法注入
    首先需要为被注入的field,书写对应的构造方法,比如
public class AccountServiceImpl implements AccountService{
    /**
     * 需要注入的对象Dao层对象
     */
    private AccountDao accountDao;

    /**
     * 构造注入
     * @param accountDao
     */
    public AccountServiceImpl(AccountDao accountDao){
        this.accountDao=accountDao;
    }
}

其次要在xml配置文件中,使用<constructor-arg>标签,完成对被注入field的注入。

<bean name="accountDao" class="com.zejian.spring.springIoc.dao.impl.AccountDaoImpl"/>
<!-- 通过构造注入依赖 -->
<bean name="accountService" class="com.zejian.spring.springIoc.service.impl.AccountServiceImpl">
    <!-- 构造方法方式注入accountDao对象,-->
    <constructor-arg  ref="accountDao"/>
</bean>

但是要注意,使用构造方法进行注入时,有可能会出现无法解决的循环依赖,所以还是建议使用基于注解的自动注入。

  1. 自动装配
    3.1 基于xml自动装配
    不同于以上两种的xml配置,xml的自动装配,不需要使用<property>或者<constructor-arg>标签,而是需要使用"autowire"属性,属性值有
    "byType"——通过类型匹配注入,当存在相同类型多个实例时,会注入失败,可通过使用"autowire-candidate="false"属性,来对不想注入的bean进行屏蔽";
    "byName"——通过变量名注入,如果没有发现变量名一致的bean,则不会注入;
    "constructor"——,先按照类型再按照名字进行bean的匹配;
    详细可参考关于Spring IOC (DI-依赖注入)你需要知道的一切
    3.2 基于注解自动装配
    使用的注解有两个@Autowire和@Resource
    @Autowire是通过byType进行bean的匹配,也可以在同类型多实例的情况下,搭配使用@Qualifier通过byName进行匹配;
    @Resource是通过byName进行bean的匹配

以上两种自动装配的方式,只能对引用类型变量进行装配,无法对基本类型进行装配,若要对基本类型进行装配,则要使用@Value。

3.3 对基本类型的自动装配
@Value和.properties文件搭配使用,可以对基本类型变量进行装配。

上一篇下一篇

猜你喜欢

热点阅读