Spring IOC\DI
Spring IOC
什么是IOC
Spring IOC(控制反转):是一种实现思想,通过第三方完成我们对实例Bean的管理,而不是通过传统的方式构建实例,交给第三方进行实例化,从而降低代码之间的耦合度
Spring IOC 控制反转,由Spring容器控制程序之间的关系,而非传统实现中,由程序代码直接控制,IOC发生了 “主从换位” 的变化
高内聚,低耦合概述
高内聚低耦合是软件工程中的概念,在软件设计中通常用耦合度与内聚度作为衡量模块独立程度的标准
划分模块的准则:高内聚低耦合
专业术语 | 描述含义 |
---|---|
高内聚 | 尽可能的每个成员只完成一件事情(最大限度的聚合) |
低耦合 | 减少类内部,一个成员方法调用另一个成员方法 |
从类的角度考虑:减少类内部,对其它类的调用
IOC底层实现原理
Spring IOC是通过工厂模式与反射原理的结合
- 工厂模式:对我们用户注入的Bean进行实例化
- 反射原理:便于用户获取实例,而获取的过程是通过反射原理
Spring IOC的理解
我们在平时的Java Web应用程序开发中,若需要构建一个对象进行使用时,都需要将他们创建出来,也就是传统的使用new操作符的方式进行对象的构建,而这个创建对象的过程是我们自己手动的创建。譬如:有一个A对象要连接数据库需要通过Connection对象,但这个连接数据库的过程中,A对象需要Connextion对象,从而A对象就对Connection对象产生了依赖,提高了两个对象对象之间的耦合度
为了降低耦合度就需要通过第三方工具的使用来降低耦合度,便于更好的提高内聚度。若使用IOC容器的话,我们的A对象与Connection对象的创建就会交给IOC容器,从而既降低了对象与对象之间的依赖,又提高了内聚度
因此,Spring IOC具体来说不是一种技术的实现,而是一种设计思想,在我们开发的角度,就不需要去过度的关注怎么来的对象,而是当需要某一个对象时我们更好的进行应用调度
Spring IOC日常生活中的案例
富士康直接从中介劳务公司中获取劳动力并直接使用,而不用与每一个员工建立劳务关系,就降低了耦合度
- 富士康:就是我们程序员自己
- 中介劳务公司:Spring IOC 容器
- 员工:我们的实例Bean
Spring DI
Spring DI 概述
Spring DI我们又称依赖注入, 是一种实现思想的手段,将参数注入及给参数赋值的过程
Spring IOC与Spring DI的关系
当我们需要去构建对象时,一般都会有两个步骤:①构建对象 ②给对象的属性赋值
专业术语 | 作用 |
---|---|
Spring IOC | 构建我们的Bean实例 |
Spring DI | 给我们Spring IOC容器构建的实例对应的属性进行赋值 |
使用Spring DI 前提
我们使用的Spring DI 依赖注入本质是对属性赋值的一个过程,而我们前提就是需要实例,但实例的构建是通过我们的Spring IOC容器。因此,在Spring容器中使用依赖注入是建立在IOC容器基础之上,且POJO中必须包括无参构造方法
实现依赖注入的四种实现方式
以下实现方式中我贴出对应的纯净类
@Data //包括get/set/toString/equals/hashCode等
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
public class User {
private int id;
private String name;
private String pwd;
}
set注入(set方法)
实现步骤:① 纯净类中加入set方法[可以使用lombok中的 @Date 注解添加set方法] ② 在IOC容器中配置实例对象
属性 | 作用 |
---|---|
name | 纯净类中对应相关属性的名称 |
value | 设置纯净类中对应属性的属性值 |
Spring配置文件相关配置
<?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">
<!--Bean注入方式:set方法注入-->
<bean id="user" class="com.spring.pojo.User">
<property name="id" value="1"/>
<property name="name" value="刘一"/>
<property name="pwd" value="321"/>
</bean>
</beans>
构造注入(构造方法)
实现步骤:① 纯净类中需要添加构造方法,可通过lombok注解添加 ②IOC容器中配置实例对象
bean节点的相关属性描述
节点 | 作用描述 |
---|---|
index | 纯净类中属性名称的索引,初值为0 |
name | 纯净类中属性名称 |
type | 纯净类中属性对应的数据类型 |
value | 纯净类中对应的属性值 |
Spring配置文件相关配置
<?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">
<!--Bean注入方式:构造方法注入-->
<bean id="user1" class="com.spring.pojo.User">
<constructor-arg index="0" name="id" type="int" value="2"/>
<constructor-arg index="1" name="name" type="java.lang.String" value="小二"/>
<constructor-arg index="2" name="pwd" type="java.lang.String" value="321"/>
</bean>
</beans>
工厂注入
工厂注入的方式顾名思义我们需要结合工厂类。通过工厂注入实例的步骤:①构建纯净类 ② 构建工厂类,并设计方法,在方法体中完成对象的创建 ③在IOC容器中写入相关配置项
纯净类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int id;
private String name;
private String pwd;
private Dog dog;
}
工厂类
public class UserFactory {
//非静态工厂方式[没有static修饰的方法]
public User createUser(){
User user = new User();
user.setId(3);
user.setName("小仓鼠");
user.setPwd("321");
return user;
}
//静态工厂
public static User createUser1(){
User user = new User();
user.setId(5);
user.setName("热爱分享的小仓鼠");
user.setPwd("123456");
return user;
}
}
配置相关文件
<?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">
<!--构建工厂实例-->
<bean id="userFactory" class="com.spring.config.UserFactory"/>
<!--Bean注入方式:非静态工厂注入-->
<bean id="user3" factory-bean="userFactory" factory-method="createUser"/>
<!--Bean注入方式:非静态工厂注入-->
<bean id="user4" class="com.spring.config.UserFactory" factory-method="staticCreateUser"/>
</beans>
bean节点中相关属性使用描述
bean节点属性名称 | 描述 |
---|---|
factory-bean | 用于引入工厂类bean得id |
factory-method | 用于指定工厂类中设计得方法 |
注解注入
注解相关描述如下
注解名称 | 注解作用 |
---|---|
@Autowired | 根据default-autowired得byType方式进行自动注入 |
@Qualifier | 根据default-autowired得byName方式进行自动注入 |
@Resource | 是@Autowired与@Qualifier两注解得结合 |
@Repository | 该注解适用于dao层 |
@Service | 适用于service层(业务层),默认值value为类名得首字母小写 |
@Controller | 适用于控制层,主要在Spring MVC中使用 |
@Value | 适用于给成员完成赋值 |
@Component | 该注解为元注解,可以在任意层使用,类似Object类性质 |
补充
关于注解得方式大家知道对应的作用,如何使用就可以了,核心还是在IOC容器得配置项,注解也是在配置配件上做的更彻底得一次封装,从而提高开发的效率,不需要在配置文件中配置大量的内容
感谢大家的阅读,热爱分享的仓鼠,请大家多多指教,么么哒~~~~~