IoC(控制反转)和DI(依赖注入)
Posted 红颜莫知己
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IoC(控制反转)和DI(依赖注入)相关的知识,希望对你有一定的参考价值。
目录
IoC
1.添加工厂建立所需要的依赖
我们使用maven的时候,能使用依赖就使用依赖,可以方便我们很多,比如lombok,junit等依赖
<properties>
<spring-version>5.2.5.RELEASE</spring-version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
2.加入实体类
User
package edu.xalead;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private int age;
private String sex;
}
UserDao
package edu.xalead;
public class UserDao {
public User findUser(){
User u = new User(1000,"张三",22,"男");
return u;
}
}
3.创建配合文件beanFactory.xml
该文件放在resource目录底下
这里bean标签中的id为名字,class为所属类
<?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="userDao" class="edu.xalead.UserDao"></bean>
</beans>
写测试类TestSpringContext.java
public class TestSpringContext {
/**
* 测试Spring工厂实例化及获取对象
*/
@Test
public void test1(){
//创建工厂
BeanFactory beanFactory = new ClassPathXmlApplicationContext("beanFactory.xml");
//从工厂中拿配置好的实例
UserDao userDao = (UserDao) beanFactory.getBean("userDao");
User user = userDao.findUser();
System.out.println(user);
}
}
这里的ClassPath指的就是resource目录
在使用getBean()方法的时候,我们只能取到Object类,因为通过名字不知道是什么类型,所以我们要进行强转,当然我们还以为有另一种方法写
UserDao userDao = beanFactory.getBean(UserDao.class);
但是这样写有一个缺点,那就是你只能在xml文件里配置一个,如果配置两个系统就无法知道你指的是哪一个,所以我们一般还是使用名字来获取。
<bean id="userDao" class="edu.xalead.UserDao"></bean>
<bean id="userDao1" class="edu.xalead.UserDao"></bean>
这里报错不是唯一Bean
DI
创建实体类
UserServlet
package edu.xalead;
import lombok.Setter;
@Setter
public class UserServlet {
private UserService userService;
public void findUser(){
System.out.println("spring工厂的示例");
System.out.println(userService.findUser());
}
}
我们现在通过Servlet来访问刚才的数据,当然我们现在这里的servlet是一个假的,真正的Servlet是由服务器创建的
Spring对象间的依赖注入
property标签中的ref你注入对象的名字,name指你给这个所注入的对象起的名字
<bean id="userDao" class="edu.xalead.UserDao"></bean>
<bean id="userServlet" class="edu.xalead.UserServlet">
<property name="userDao" ref="userDao"/>
</bean>
测试案例
@Test
public void test2(){
//创建工厂
BeanFactory beanFactory = new ClassPathXmlApplicationContext("beanFactory.xml");
//从工厂中拿配置好的UserServlet实例
UserServlet userServlet = beanFactory.getBean(UserServlet.class);
userServlet.findUser();
}
若有误,请指教!
以上是关于IoC(控制反转)和DI(依赖注入)的主要内容,如果未能解决你的问题,请参考以下文章