IoC注入的方式
2020-02-11 本文已影响0人
摸摸脸上的胡渣
- 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;
}
}
- 构造方法注入
首先需要为被注入的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>
但是要注意,使用构造方法进行注入时,有可能会出现无法解决的循环依赖,所以还是建议使用基于注解的自动注入。
- 自动装配
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文件搭配使用,可以对基本类型变量进行装配。