本文主要是介绍Spring入门之DI(包含实例代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 什么是DI注入?
- DI注入的方式
- 代码示例
- 1. 创建一个UserDao类
- 2. 创建UserService类
- 3. 编写配置文件
- 4. 编写测试类
- 5. 测试结果
- DI注入方式汇总
- 实体类
- 配置文件
什么是DI注入?
DI(Dependency Injection):依赖注入,在spring框架负责创建bean对象时,动态的将依赖对象注入到bean对象中。
简单地说,依赖注入就是给变量赋值,但是为了避免将代码写死,需要在配置文件中进行变量赋值。
DI注入的方式
- 通过属性的set方法注入值
<!-- 这里反射默认调用的是无参构造方法,如果不存在无参构造方法就会报错 -->
<bean id = "us" class="实体类的路径(包含到类名)"><!-- 如果成员变量是简单类型(基本类型+String)用value赋值;如果是自定义引用类型用ref赋值 --><property name="name" value="张三"/><property name="userDao" ref="ud"/>
</bean><bean id = "ud" class="UserDao的路径(包含到类名)"/>
- 通过属性的构造方法注入值
<bean id = "us" class="实体类的路径(包含到类名)"><constructor-arg name="name" value="李四"></constructor-arg><constructor-arg name="userDao" ref="ud"/>
</bean><bean id = "ud" class="UserDao的路径(包含到类名)"/>
代码示例
- 示例项目在IOC项目的基础上进行了完善,完成了一次从
Service
层到Dao
层的模拟。 - 在
Test
测试类中,run()
方法通过IOC生成了一个USerService
实现类,然后通过USerService
操纵USerDao
。
1. 创建一个UserDao类
package com.qcby.dao;public interface UserDao {public void hello();
}
package com.qcby.dao.impl;import com.qcby.dao.UserDao;public class UserDaoImpl implements UserDao {public void hello() {System.out.println("持久层:你好!");}
}
2. 创建UserService类
package com.qcby.service;public interface UserService {public void hello();
}
package com.qcby.service.impl;import com.qcby.dao.UserDao;
import com.qcby.service.UserService;public class UserServiceImpl implements UserService {private UserDao userDao;private String name;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setName(String name) {this.name = name;}public UserServiceImpl() {}public UserServiceImpl(UserDao userDao, String name) {this.userDao = userDao;this.name = name;}public void hello() {System.out.println("业务层:你好!");userDao.hello(); //通过业务层去调用持久层的方法}@Overridepublic String toString() {return "UserServiceImpl{" +"userDao=" + userDao +", name='" + name + '\'' +'}';}
}
3. 编写配置文件
- 如果存在多个配置文件,可以在主配置文件中使用
<import>
标签导入其他的配置文件,例如:<import resource="applicationContext2.xml"></import>
;也可以创建IOC工厂时直接加载多个配置文件,例如:ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext1.xml","applicationContext2.xml");
。
<?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"><import resource="applicationContext2.xml"></import>
</beans>
<?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"><!-- DI 构造方法注入值的方式 --><bean id = "us" class="com.qcby.service.impl.UserServiceImpl"><constructor-arg name="name" value="李四"></constructor-arg><constructor-arg name="userDao" ref="ud"/></bean><bean id = "ud" class="com.qcby.dao.impl.UserDaoImpl"/></beans>
4. 编写测试类
import com.qcby.service.UserService;
import com.qcby.service.impl.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserServiceTest {@Testpublic void run() {//创建spring ioc工厂,加载spring配置文件ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext1.xml");//获取bean对象 (底层通过反射来获取到对象)UserService userService = (UserService)ac.getBean("us");//调用方法userService.hello();System.out.println(userService);}
}
5. 测试结果
DI注入方式汇总
实体类
package com.qcby.service;import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;public class CollectionBean {private String[] strings;private List<String> list;private Map<String, String> map;private Properties properties;//属性文件类private UserService[] userServices;public void setStrings(String[] strings) {this.strings = strings;}public void setList(List<String> list) {this.list = list;}public void setMap(Map<String, String> map) {this.map = map;}public void setProperties(Properties properties) {this.properties = properties;}public void setUserServices(UserService[] userServices) {this.userServices = userServices;}@Overridepublic String toString() {return "CollectionBean{" +"strings=" + Arrays.toString(strings) +", list=" + list +", map=" + map +", properties=" + properties +", userServices=" + Arrays.toString(userServices) +'}';}
}
配置文件
- 如果用构造方法注入值,只需要将
<property>
标签改为<constructor-arg>
标签即可。
<bean id="co" class="com.qcby.service.CollectionBean"><!-- 对不可变字符串数组进行赋值(set方法注入) --><property name="strings"><array><value>张三</value><value>李四</value><value>王五</value></array></property><!-- 对可变字符串数组进行赋值(set方法注入) --><property name="list"><list><value>熊大</value><value>熊二</value><value>光头强</value></list></property><!-- 对map数组进行赋值(set方法注入) --><property name="map"><map><entry key="name" value="张三"></entry><entry key="age" value="18"></entry><entry key="sex" value="男"></entry></map></property><!-- 对属性文件类数组进行赋值(set方法注入) --><property name="properties"><props><prop key="username">root</prop><prop key="password">123456</prop></props></property><!-- 对UserService类数组进行赋值(set方法注入) --><property name="userServices"><array><bean class="com.qcby.service.impl.UserServiceImpl"><!-- 给userServices类注入值(set方法注入) --><property name="name" value="zhangsan"></property><property name="userDao" ref="ud"></property></bean><ref bean="us"></ref></array></property>
</bean>
这篇关于Spring入门之DI(包含实例代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!