SpringIoC详解

2020-02-20  本文已影响0人  暮秋moco

     IOC(Inversion of Control)翻译为控制反转,是面向对象编程中的一种设计思想,可以降低代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫依赖查找(Dependency Lookup,简称DL)。通过控制反转,对象在被创建的时候,由Spring容器将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
    Spring实现IoC的两种方式分别是使用配置文件方式和使用注解方式,这两种方式要实现的功能是一样的,都是为了降低程序之间的耦合,只是配置的形式不一样

1. 使用配置文件(xml)的方式实现IoC

以后程序间的依赖关系都交给spring容器来管理。在某个类需要用到其他类的对象时,由spring提供该对象,我们只需要在配置文件中说明。
可以注入的数据有三类:分别为基本类型与String类型、bean类型(类类型)、复杂类型(集合类型)
可以注入的方式有三种:分别为使用构造函数注入、使用set方法注入、使用注解注入

2. 使用注解的方式实现IoC

2.1 前提条件

<?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">

    <!--Spring容器在创建时要扫描的包-->
    <context:component-scan base-package="service"></context:component-scan>
    <context:component-scan base-package="dao"></context:component-scan>


</beans>

2.2 Spring中IoC的常用注解

2.2.1用于创建对象并保存到spring容器的注解(等同于在xml中编写一个<bean></bean>标签
package service;

import org.springframework.stereotype.Component;

@Component(value="userService")
public class UserService {

    public void showService(){
        System.out.println("UserService中的showService方法执行了===");
    }
}
2.2.2用于注入数据的注解(等同于在xml的<bean>标签内编写一个<property>标签

注:集合类型的数据注入只能通过xml实现

package service;

import dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component(value="userService")
public class UserService {

    //1.变量(field)注入   --不推荐--
//    @Autowired
//    public UserDao UserDao = null;

    //2.构造器注入
//    private UserDao userDao = null;
//    @Autowired
//    public UserService(UserDao userDao){
//        this.userDao = userDao;
//    }

    //3.set方法注入
    private UserDao userDao;
    @Autowired
    public void setUserDao (UserDao userDao) {
        this.userDao = userDao;
    }

    public void showService(){
        System.out.println("UserService中的showService方法执行了===");
    }
}

package dao;

import org.springframework.stereotype.Repository;

@Repository
public class UserDao {
    public void showDao(){
        System.out.println("UserDao中的showDao方法执行了===");
    }
}
package service;

import org.springframework.stereotype.Component;

@Component(value="userService")
public class UserService {

    @Autowired
    @Qualifier(value = "userDao")
    public UserDao UserDao = null;

    public void showService(){
        System.out.println("UserService中的showService方法执行了===");
    }
}
package service;

import org.springframework.stereotype.Component;

@Component(value="userService")
public class UserService {

    @Resource(name = "userDao")
    public UserDao UserDao = null;

    public void showService(){
        System.out.println("UserService中的showService方法执行了===");
    }
}
package service;

import org.springframework.stereotype.Component;

@Component(value="userService")
public class UserService {

    @Value(value = "你怎么这么好看---")
    private String testString;

    public String getTestString() {
        return testString;
    }

    public void showService(){
        System.out.println("UserService中的showService方法执行了===");
    }
}
2.2.3用于改变作用范围的注解(等同于在xml的<bean>标签内编写一个<scope>标签
package service;

import org.springframework.stereotype.Component;

@Component(value="userService")
//@Scope("singleton")
@Scope("prototype")
public class UserService {

    public void showService(){
        System.out.println("UserService中的showService方法执行了===");
    }
}
2.2.4和生命周期相关的注解(等同于在xml的<bean>标签内编写一个<init-method>和<destroy-method>标签
package service;

import org.springframework.stereotype.Component;

@Component(value="userService")
@Scope("singleton")
public class UserService {

    @PostConstruct
    public void init(){
        System.out.println("UserService中的init方法执行了===");
    }
    @PreDestroy
    public void destroy(){
        System.out.println("UserService中的destroy方法执行了===");
    }

    public void showService(){
        System.out.println("UserService中的showService方法执行了===");
    }
}
上一篇下一篇

猜你喜欢

热点阅读