Spring详解-------依赖注入的三种方式实例详解
目录
1、什么是依赖注入
1.1类的关系
1.1.1 依赖关系(Dependency)
1.1.2 聚合(Aggregation)
1.2关系强度
2 为什么使用依赖注入
2.1开闭原则
2.1.1 定义
2.1.2 开闭原则优点
2.2高内聚,低耦合
3 依赖注入的方式
3.1通过 Set 方法注入
1、什么是依赖注入
1.1类的关系
1.1.1 依赖关系(Dependency)
1.1.2 聚合(Aggregation)
1.2关系强度
2 为什么使用依赖注入
2.1开闭原则
2.1.1 定义
2.1.2 开闭原则优点
- 易扩展。开闭原则的定义就要求对扩展开放。
- 易维护。软件开发中,对现有代码的修改是一件很有风险的事情,符合开闭原则的设计
- 在扩展时无需修改现有代码,规避了这个风险,大大提交了可维护性。
2.2高内聚,低耦合
3 依赖注入的方式
public interface UserDao {void InitUserDao();
}
持久层userDaoIml实现
public class UserDaoImpl implements UserDao {@Overridepublic void InitUserDao() {System.out.println("InitUserDao......");}
}
3.1通过 Set 方法注入
持久层的UserDao使用上面的内容。
业务层UserService接口
public interface UserService {public void addUser();
}
业务层UserServiceImpl实现
使用set方法进行依赖注入的时候必须给需要注入的对象创建set方法
public class UserServiceImpl implements UserService {private UserDao userDao;//使用set方法实现依赖注入public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void addUser() {userDao.InitUserDao();System.out.println("UserService........addUser");}
}
配置文件(配置UserServiceImpl对象)
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置UserServiceImpl对象--><!--bean中的name属性可以有多个值,多个值可以使用逗号分隔开.(name属性不是必须的)--><bean id="userService" name="name1,name2,name3" class="com.xjx.service.impl.UserServiceImpl"/>
</beans>
测试依赖注入(测试UserDao是否注入成功)
public class UserServiceTest {public static void main(String[] args) {//启动IOC容器ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//从容器中获取 userService对象 使用getBean("");来获取容器中存在的对象//在IOC容器中除了可以用bean的id来获取对象还可以使用bean的name属性来获取对象//(1)可以通过bean的id属性值来获取IOC容器中的对象UserService userService = (UserService) applicationContext.getBean("userService");userService.addUser();//(2)可以通过bean的name属性值来获取IOC容器中的对象UserService name1 = (UserService) applicationContext.getBean("name1");System.out.println("调用name1");name1.addUser();UserService name2 = (UserService) applicationContext.getBean("name2");System.out.println("调用name2");name2.addUser();UserService name3 = (UserService) applicationContext.getBean("name3");System.out.println("调用name3");name3.addUser();}
}
3.2通过构造方法注入
持久层
使用构造方法进行注入的时候Bean对象必须有一个带参的构造方法
public class UserServiceImpl implements UserService {private UserDao userDao;//使用构造方法实现依赖注入public UserServiceImpl(UserDao userDao){this.userDao = userDao;}@Overridepublic void addUser() {userDao.InitUserDao();System.out.println("UserService........addUser");}
}
配置文件
使用构造方法进行注入的时候参数对象要使用 constructor-arg 一个constructor-arg注入一个参数
<!--通过 构造方法方法注入 (需要为注入的成员变量提供 Set 方法。)--><bean id="userDao2" class="com.xjx.dao.impl.UserDaoImpl"/><bean id="userService2" class="com.xjx.service.impl.UserServiceImpl"><!--constructor-arg用来通过构造方法注入参数时使用,一个constructor-arg注入一个参数构造方法中有几个需要注入的参数就需要几个constructor-arg与构造方法中的参数进行匹配注入的时候使用name 或 index 或 type属性来进行指定参数注入--><!--name属性表示的是参数中要注入的参数名称(name:根据参数名称识别参数)--><constructor-arg name="userDao"><ref bean="userDao2"/></constructor-arg><!--(index:根据参数位置识别参数)--><!--<constructor-arg index="0" ref="userDao2"/>--><!--(name:根据参数类型识别参数)--><!--<constructor-arg type="com.xjx.dao.UserDao" ref="userDao2"/>--></bean>
测试构造方法注入
public class UserServiceTest {public static void main(String[] args) {//启动IOC容器ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//从容器中获取 userService对象 使用getBean("");来获取容器中存在的对象UserService userService = (UserService) applicationContext.getBean("userService");userService.addUser();}
}
3.3自动注入
局部自动注入 : 通过 bean 标签中的 autowier 属性配置自动注入。有效范围:仅针对当前 bean 标签生效。 全局自动注入 :通过 beans 标签中的 default-autowire 属性配置自动注入。有效范围:配置文件中的所有 bean 标签都生效。 no:当 autowire 设置为 no 的时候,Spring 就不会进行自动注入。 byName:在 Spring 容器中查找 id 与(需要注入的bean)属性名相同的 bean,并进行注入。需要提供 set 方 法。 byType:在 Spring 容器中查找类型与属性名的类型相同的 bean,并进行注入。需要提供 set 方法。 constructor:仍旧是使用 byName 方式,只不过注入的时候,使用构造方式进行注入。 default:全局配置的 default 相当于 no,局部的 default 表示使用全局配置设置。
局部自动注入
<bean id="usersDaoMybatis" class="com.bjsxt.dao.impl.UsersDaoMybatisImpl"/>
<bean id="usersService" name="name1,name2,name3" class="com.bjsxt.service.impl.UsersServiceImpl" autowire="byType"> </bean>
全局自动注入(default-autowire="byName")
<?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"
default-autowire="byName">
4 依赖注入的数据类型
依赖注入的数据类型: 1.注入bean对象 2.注入基本数据类型和字符串 3.注入list集合 4.注入Set集合 5.注入Map集合 6.注入properties
业务层userServiceImp实现
所有的Bean对象都需要set方法
public class UserServiceImpl implements UserService {private UserDao userDao;private String name;private int age;private List<String> list;private Set<String> set;private Set<Users> users;private Map<String,String> map;private Map<String,Users> mapUser;private Properties properties;
//使用构造方法实现依赖注入public UserServiceImpl(UserDao userDao){this.userDao = userDao;}//使用set方法实现依赖注入public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public void setList(List<String> list) {this.list = list;}public void setSet(Set<String> set) {this.set = set;}public void setUsers(Set<Users> users) {this.users = users;}public void setMap(Map<String, String> map) {this.map = map;}public void setMapUser(Map<String, Users> mapUser) {this.mapUser = mapUser;}public void setProperties(Properties properties) {this.properties = properties;}@Overridepublic void addUser() {userDao.InitUserDao();System.out.println("注入基本数据类型"+name+age);System.out.println("注入list");for (int i = 0 ; i <list.size(); i++){System.out.println(list.get(i));}System.out.println("UserService........addUser");}
}
配置文件
<!--依赖注入的数据类型:1.注入bean对象2.注入基本数据类型和字符串3.注入list集合4.注入Set集合5.注入Map集合6.注入properties--><bean id="userServiceData" class="com.xjx.service.impl.UserServiceImpl"><property name="userDao" ref="userDao"/><!--注入的是基本数据类型或字符串的时候,注入的值不使用ref而是使用value来赋值--><property name="name" value="lance"/><property name="age" value="24"/><property name="list"><list><value>javaSE</value><value>javaEE</value><!--如果list中注入的是IOC中的对象时不使用value而使用ref来向list中注入对象例:向list中注入一个IOC容器中存在的id属性为userService对象<ref>要注入的IOC中已经存在的对象id</ref>如果list中注入的是IOC中不存在的对象时不使用value而使用bean创建对象来向list中注入对象例:向list中注入一个UserDaoImpl对象(这个时候是可以不添加id属性的)<bean class="com.xjx.dao.impl.UserDaoImpl"/>--></list></property><!--注入Set集合(Set集合为String类型)--><property name="set"><set><value>lance</value><value>admin</value></set></property><!--注入Set集合(Set集合为引用数据类型Users对象)--><property name="users"><set><bean class="com.xjx.pojo.Users"><property name="name" value="admin"/><property name="age" value="18"/></bean></set></property><!--注入Map集合(Map集合value为String类型)--><property name="map"><map><entry key="name" value="lance"/><entry key="age" value="24"/></map></property><!--注入Map集合(Map集合value为引用数据类型Users对象)--><property name="mapUser"><map><entry key="user1" value-ref="user1"/><!--注入值是IOC容器中已经存在的对象--><entry key="user2"><!--注入的值不是IOC中存在的对象,需要用bean创建--><bean class="com.xjx.pojo.Users"/></entry></map></property><!--注入properties--><property name="properties"><props><prop key="name">lance</prop><prop key="age">24</prop></props></property></bean><bean id="user1" class="com.xjx.pojo.Users"/><bean id="user2" class="com.xjx.pojo.Users"/>
测试依赖注入的数据类型:
/**依赖注入* 在使用依赖注入时,如果注入的是 Bean 对象,* 那么要求注入的 Bean 对象与被注入的 Bean 对象都需要 Spring IOC 容器来实例化。* 注入方式:* 1.使用set方式注入:需要为注入的成员变量提供 Set 方法。* 2.使用构造方法注入:Bean 对象中需要提供有参的构造方法*/
public class DependencyInjectionTest {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext_dependency_injection.xml");UserService userService = (UserService) applicationContext.getBean("userServiceData");userService.addUser();}
}
Spring详解-------依赖注入的三种方式实例详解相关推荐
- Spring系列之依赖注入的三种方式
目录 一.依赖注入方式 1.使用属性的setXXX方法注入 2.构造函数注入 (1)按类型匹配入参type (2)按索引匹配入参index (3)联合使用类型和索引匹配入参[type和index一起使 ...
- spring依赖注入的三种方式以及优缺点
spring依赖注入的三种方式以及优缺点 一.依赖注入的三种方式 1.通过构造器注入.(spring4.3之后,推荐使用) 2.通过setter注入.(spring4.3之前,推荐使用) 3通过fil ...
- 05.bean依赖注入的三种方式
05.bean依赖注入的三种方式 1.概述 依赖注入 DI(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现. 在编写程序时,通过控制反转,把对象的创建交给 ...
- php依赖注入的三种方式
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency Inject ...
- Spring IOC (DI) 依赖注入的四种方式
依赖注入的四种方式: set 注入 赋值,默认使用的是set() 方法,依赖注入底层是通过反射实现的 <bean id="student" class="cust. ...
- Spring注解依赖注入的三种方式的优缺点以及优先选择
当我们在使用依赖注入的时候,通常有三种方式: 1.通过构造器来注入: 2.通过setter方法来注入: 3.通过filed变量来注入: 那么他们有什么区别吗?应该选择哪种方式更好? 代码示例: Con ...
- Spring依赖注入的三种方式(好的 坏的和丑的)
关于spring bean三种注入方式的优缺点对比,翻译自Spring DI Patterns: The Good, The Bad, and The Ugly,水平有限,如有错误请指正. Sprin ...
- 依赖注入的三种方式_一起学Spring之三种注入方式及集合类型注入
本文主要讲解Spring开发中三种不同的注入方式,以及集合数据类型的注入,仅供学习分享使用,如有不足之处,还请指正. 概述 Spring的注入方式一共有三种,如下所示: 通过set属性进行注入,即通过 ...
- 依赖注入的三种方式_Spring IoC是如何进行依赖注入的
依赖注入(DI) DI(Dependency Injection),Spring IoC 不是一种技术,而是一种思想,通过这种思想,能够指导我们设计出松耦合的程序代码.而Spring IoC这个思想的 ...
最新文章
- 虚拟机安装CentOS以及SecureCRT设置【完美无错版】
- linux java 替换jre_Linux系统 无需JRE配置Java
- IOS15全屏滑动返回
- kobject_create_and_add解析
- c++中wstring 和 string的转换
- 总结几种结构体初始化方法 (转)
- ClassLoader类加载器
- linux make指定目标平台,CMake on Linux:目标平台不支持动态链接
- 基于php重庆旅游设计网站作品
- python有类似spring_Python的Spring与J的Spring相比
- 统计学基础知识有哪些?看这一篇就够了
- [远程控制]木马伪装:图片
- HTTP与HTTPS请求过程
- 计算机硬盘与格式化,什么是磁盘格式化 格式化与快速格式化区别 - 驱动管家...
- 电脑硬件基础知识科普
- 台式低速常温离心机S400操作规程
- C# 获取微信二维码
- 浏览器打印功能---js
- STM32L051低功耗STOP模式串口中断唤醒
- 在Centos快速搭建dhcp服务器,详细讲解
热门文章
- Nacos命名空间与配置分组
- reverse函数—数组反转
- 工程图样中粗实线的用途_《道路工程制图标准》规定:中粗实线的一般用途是( )。_学小易找答案...
- 一款人见人爱的软件是什么样子?了解一下uTools吧
- pycharm破解教程
- 0欧姆电阻能流过无穷大电流吗
- mysql sqlserver 性能优化_SQLServer性能优化之---数据库级日记监控
- 基于百问网IMX6ULL_PRO开发板移植LCD多点触摸驱动(GT911)
- c语言表单文件上传,requests实现文件上传(对应postman form-data)
- 领英创始人里德·霍夫曼退出OpenAI;微软推出多模态模型 Kosmos-1;谷歌推出PaLM-E...