文章已托管到GitHub,你们能够去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各类学习资料!java
Dependency Injection即为依赖注入,简称DI 。git
简单来讲,在Spring建立对象的同时,为其属性赋值,称之为依赖注入。github
形象来讲,组件之间依赖关系由容器在运行期决定的,即由容器动态的将某个依赖关系注入到组件之中。spring
简单了解了DI(依赖注入),在看依赖注入这个词,咱们也能够将依赖注入以IOC(控制反转)的形式拆分它。数组
顾名思义,依赖注入是由“依赖”和“注入”两个词汇组合而成,那么咱们再一次顺藤摸瓜,分别分析这两个词语!微信
依赖一词,能够拆分红不少元素。好比说,达成依赖条件必须是两个对象 ,谁依赖谁 ,某一个对象依赖另外一个对象的什么 。这里咱们能够根据这几个条件列举出这几种状况:框架
注入一次,能够也能够拆分红不少元素。好比说,注入能够分解成谁注入谁 ,注入了什么 。这里咱们也能够根据这两个条件来列举出这几种状况:ide
Setter方法注入,它只须要提供对应的Setter方法接口实现注入,因为JavaBean通常都实现了Setter方法,因此Setter方法注入也成为了咱们经常使用的注入方法之一。学习
定义一个JavaBean并赋予其Setter方法测试
package com.mylifes1110.bean;
import java.util.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
//Lombok@Data注解提供了Setter方法
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String password;
private String sex;
private Integer age;
private Date bornDate;
private String[] hobbys;
private Set<String> phones;
private List<String> names;
private Map<String, String> countries;
private Properties files;
}
复制代码
注意:Spring底层对Date日期类型作了处理,默认处理格式为“yyyy/MM/dd”
<bean id="User" class="com.mylifes1110.bean.User">
<!--注入基本数据类型-->
<property name="id" value="1"/>
<property name="password" value="123456"/>
<property name="sex" value="male"/>
<property name="age" value="18"/>
<!--注入日期类型-->
<property name="bornDate" value="1999/09/09"/>
<!--注入数组类型-->
<property name="hobbys">
<array>
<value>Run</value>
<value>Jump</value>
<value>Climb</value>
</array>
</property>
<!--注入List集合类型-->
<property name="names">
<list>
<value>Ziph</value>
<value>Join</value>
<value>Marry</value>
</list>
</property>
<!--注入Set集合类型-->
<property name="phones">
<set>
<value>110</value>
<value>119</value>
<value>120</value>
</set>
</property>
<!--注入Properties类型-->
<property name="files">
<props>
<prop key="first">One</prop>
<prop key="second">Two</prop>
<prop key="third">Three</prop>
</props>
</property>
<!--注入Map集合类型-->
<property name="countries">
<map>
<entry key="CHINA" value="中国"/>
<entry key="USA" value="美国"/>
<entry key="UK" value="英国"/>
</map>
</property>
</bean>
复制代码
将Service层须要一个Dao层实现类对象,咱们能够使用注入方式来实现对Service层和Dao层的对象关联
<bean id="UserDao" class="com.mylifes1110.dao.impl.UserDaoImpl"/>
<bean id="UserService" class="com.mylifes1110.service.impl.UserServiceImpl">
<property name="userDao" ref="UserDao"/>
</bean>
复制代码
将建立的Bean对象注入到另外一个对象中,好比一个JavaBean对象中做为了另外一个JavaBean对象的属性
<!--次要bean,被做为属性-->
<bean id="address" class="com.mylifes1110.bean.Address">
<property name="position" value="上海市" />
<property name="zipCode" value="100001" />
</bean>
<!--主要bean,操做的主体-->
<bean id="user" class="com.mylifes1110.bean.User">
<!--address属性引用address对象-->
<property name="address" ref="address" />
</bean>
复制代码
建立对象时,Spring工厂会经过构造方法为对象的属性赋值。因为某些框架或者项目中并无为JavaBean提供Setter方法,咱们就能够利用其构造方法来注入。不要和我说,没有提供构造方法哈!(开个玩笑!)
定义一个JavaBean对象,为其提供构造方法
public class Student {
private Integer id;
private String name;
private String sex;
private Integer age;
//Constructors
public Student(Integer id , String name , String sex , Integer age){
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
}
复制代码
<!--构造注入-->
<bean id="u3" class="com.mylifes1110.bean.Student">
<!-- 除标签名称有变化,其余均和Set注入一致 -->
<constructor-arg name="id" value="1234" />
<constructor-arg name="name" value="tom" />
<constructor-arg name="age" value="20" />
<constructor-arg name="sex" value="male" />
</bean>
复制代码
不用在配置中 指定为哪一个属性赋值,及赋什么值。由spring自动根据某个 "原则" ,在工厂中查找一个bean,为属性注入属性值。
将Dao层实现类对象注入到Service层并调用方法得以测试
package com.mylifes1110.service.impl;
import com.mylifes1110.bean.User;
import com.mylifes1110.dao.UserDao;
import com.mylifes1110.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public int insertUser(User user) {
System.out.println("------insertUser and UserService------");
return userDao.insertUser(null);
}
}
复制代码
基于名称自动注入值
<bean id="UserDao" class="com.mylifes1110.dao.impl.UserDaoImpl"/>
<!--为UserServiceImpl中的属性基于名称自动注入值-->
<bean id="userService" class="com.mylifes1110.service.impl.userServiceImpl" autowire="byName"/>
</beans>
复制代码
基于类型自动注入值,根据实现的接口来判断并自动注入值,若是实现此接口的实现类太多,它会在不少实现此接口的实现类中选择名字相同的实现类进行注入。(现根据判断,若是不成功,则根据名称注入)
<bean id="userDao" class="com.mylifes1110.dao.UserDaoImpl" />
<!--为UserServiceImpl中的属性基于类型自动注入值-->
<bean id="userService" class="com.mylifes1110.service.impl.UserServiceImpl" autowire="byType"/>
</beans>
复制代码
注解名称 | 描述 |
---|---|
@Autowired | 基于类型自动注入 |
@Resource | 基于名称自动注入 |
@Qualifier("userDAO") | 限定要自动注入的bean的id,通常和@Autowired联用 |
@Value | 注入简单类型数据 (jdk8种基本数据类型+String类型) |
使用基于类型自动注入,将Dao层注入到Service层
@Service
public class UserServiceImpl implements UserService {
@Autowired //注入类型为UserDao的bean
@Qualifier("userDao") //若是有多个类型为UserDao的bean,能够用此注解从中指定一个
private UserDao userDao;
}
复制代码
使用基于名称自动注入,将Dao层注入到Serivce层
@Service
public class UserServiceImpl implements UserService {
@Resource("userDao") //注入id=“userDao”的bean
private UserDao userDao;
}
复制代码
使用注入简单类型数据注解来完成简单注入JavaBean
public class User{
@Value("1") //注入数字
private Integer id;
@Value("Ziph") //注入String
private String name;
}
复制代码