Spring框架IOC (控制反转)和DI(依赖注入)

本文详细介绍了Spring框架的核心概念——IOC(控制反转)和DI(依赖注入)。通过实例演示了如何利用配置文件和注解两种方式实现对象的创建与依赖注入,并分析了Spring框架的优势及其对企业级开发项目的积极作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring框架IOC (控制反转)和DI(依赖注入)

一、Spring简介
1、作用:

​ spring框架是一个开源框架,它致力于提供一种方法管理,业务层的业务对象;它的主要目的是使javaEE开发更高效,更简洁;它不仅仅只作用于一层,它是企业级开发项目中,一站式首选的框架,它可以与其他框架无缝整合

2、spring优点:

​ <1、方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
​ <2、AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
​ < 3、声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
​ <4、方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序
​ <5、方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、
Quartz等)的直接支持
​ <6、降低JavaEE API的使用难度
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API
应用难度大大降低

二、IOC控制反转和DI依赖注入
1.1、IOC和DI的解释

​ 简单来说,就是将原来由我们实例化的对象,交由spring框架来进行实例化.这是对象的实例化的权利就会反转.
IOC 的思想是:用框架的方式替代耦合度高的 new 构造方法();的形式创建对象
这样可以在需要的时候去创建,不需要的时候销毁, 统一管理, 节约资源, 提高效率
DI 的思想是:Spring框架替我们完成属性赋值的操作

2.1、配置版
2.1.1、pom.xml
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.2.5.RELEASE</version>
    </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>4.2.5.RELEASE</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>4.2.5.RELEASE</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>4.2.5.RELEASE</version>
      </dependency>

2.1.2、applicationContext.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context.xsd
                ">
    <!--利用反射的原理,创建service的实例对象 体现出IOC:控制反转-->
    <bean name="service" class="com.K9503.service.impl.EmpServiceImpl">
        <!--调用set方法,为属性mapper赋值 体现出DI:依赖注入-->
        <property name="mapper" ref="mappers"></property>
    </bean>
    <!--创建mapper的实例对象-->
    <bean name="mappers" class="com.K9503.mapper.impl.EmpMapperImpl"></bean>
    <!--为emp中的属性赋值-->
    <bean name="emp" class="com.K9503.pojo.Emp">
        <property name="name" value="#{emp.name}"></property>
        <property name="age" value="#{emp.age}"></property>
    </bean>
</beans>

2.1.3、service实现类

private IEmpMapper mapper;
//配置版需要提供set方法
    public IEmpMapper getMapper() {
        return mapper;
    }

    public void setMapper(IEmpMapper mapper) {
        this.mapper = mapper;
    }
//调用mapper中的add方法
    @Override
    public void addEmp(Emp emp) {
        mapper.addEmp(emp);
    }

2.1.4、mapper实现类

 @Override
    public void addEmp(Emp emp) {
        System.out.println("新增成功!");
        System.out.println(emp);
    }

2.1.5、web测试

IEmpsService service;
    @Test
    public void addEmp(){
        //加载核心配文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/application.xml");
        //实例化service
        service = (IEmpService) context.getBean("service");
        //实例化Emp
        Emp emp = (Emp) context.getBean("emp");
        emp.setName("关羽");
        //调用mapper的add方法
        service.addEmp(emp);
    }
3.1、注解版
3.1.1、注解版简析
  1. 注解的原理和配置xml中的bean标签,property标签是相同的,注解的本质就是封装好的方法的调用。
  2. 类的注解相当于在xml中配置bean标签,利用反射的原理实例化对象
  3. 属性的注解相当于xml中配置property标签,借助反射实现为属性赋值。
  4. 使用属性注解不需要提供set方法
3.1.2类的注解有四个:

通用型:@Component
Dao层:@Repository
Service层:@Service
Web层:@Controller

属性注解:四个:

自动注入:@Autouired

声明实现类:@Qualifier

@Resource @Autouired和@Qualifier的搭配

@Value基本数据类型属性注入

3.1.3、applicationContext.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context.xsd
                ">
    <!--context:全局
    component:通用注解 : Controller  Service  Repository
    所有的类的注解都是默认关闭的。以包扫描的形式 开启 注解
    -->
    <context:component-scan base-package="com.K9503"></context:component-scan>
    <bean name="emp" class="com.K9503.pojo.Emps">
        <property name="name" value="#{emp.name}"></property>
    </bean>
</beans>

3.1.4、service层实现类

@Service("service")
public class EmpsServiceImpl implements IEmpsService {
    @Autowired
    @Qualifier("mapper")
    IEmpMappers mapper;

    @Override
    public void addEmp(Emps emp) {
        mapper.addEmp(emp);
    }
}

3.1.5、mapper实现类

@Repository("mapper")
public class EmpMappersImpl implements IEmpMappers {
    @Override
    public void addEmp(Emps emp) {
        System.out.println("emp1新增成功!");
        System.out.println(emp);
    }
}

3.1.6、web测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/applicationContext.xml")
public class TestIoc1 {
    /*@Autowired
    @Qualifier("service")
    IEmpsService service;*/
    @Resource(name = "service2")
    IEmpsService service2;
    /*@Autowired
    @Qualifier("emp")*/
    @Resource(name = "emp")
    Emps emp;
    @Test
    public void addEmp(){
        emp.setName("关羽");
        service2.addEmp(emp);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值