>  기사  >  类库下载  >  Spring의 제어 반전 및 종속성 주입을 쉽게 이해

Spring의 제어 반전 및 종속성 주입을 쉽게 이해

高洛峰
高洛峰원래의
2016-10-17 09:27:041723검색

컴퓨터 개발의 역사를 되돌아보자. 최초의 컴퓨터는 면적이 170평방미터에 무게가 30톤에 달했는데, 오늘날의 개인용 노트북은 더 가볍고 기능도 더 뛰어나다. 기술 분야에서도 개발 과정의 추세는 동일합니다. Enterprise JavaBean(Enterprise JavaBean, EJB)은 처음 만들어졌을 때 매우 성공적이었지만 시간이 지나면서 사람들은 보다 편리하고 단순하며 가벼운 기술 프레임워크를 추구하기 시작했습니다. Spring이 탄생했고 Spring은 지속적으로 다른 분야에 관여해 왔으며(여기서는 자세히 설명하지 않겠습니다) Spring의 본질에는 제어 반전과 종속성 주입이 포함됩니다.

IOC(Inversion of Control)에 대한 간략한 설명

먼저 제어라는 단어를 이해해 보겠습니다. 즉, "순방향" 제어의 경우 어떤 경우에도 기능을 요청하는 시스템에서 , 적어도 두 개의 클래스가 함께 작업해야 합니다. 다른 클래스의 객체 인스턴스를 생성하려면 항목 클래스 아래에 new 키워드를 사용해야 합니다. 이는 객체 지향 프로그래밍의 아이디어와 유사하며 "I"가 입구 클래스 역할을 합니다. , 이번 입문반에서는 식사할 때마다 일회용 젓가락을 사야 합니다(사용할 때마다 새 것). 이 관계에서 "나"(발신자)는 "매번"이 필요합니다. 일회용 젓가락(또 다른 카테고리) 젓가락에게 다가와서 솔직하게 손을 잡으라고 말해요. , 그리고 사람들은 게으르다. 그는 항상 자신의 삶에 더 편리한 아이디어를 만들 것입니다. 더 정확한 방법은 일반 젓가락 한 쌍(일회용이 아님)을 구입하여 컨테이너(Spring에서는 IOC 컨테이너라고 함)에 넣는 것입니다. , 사용해야 할 때 컨테이너에 IOC 젓가락을 사용하고 싶습니다(컨테이너에 요청 보내기)라고 말하면 젓가락이 손에 "주입"되며 이 과정에서 당신은 더 이상 제어 당사자가 아니지만 요청자(비록 여전히 호출자임에도 불구하고)로 진화하여 컨테이너에 의존하여 리소스를 제공하고 제어가 컨테이너에 있으므로 이를 일반적으로 제어 역전이라고 합니다. .

의존성 주입(Dependency Injection)에 대한 첫 번째 참여

위의 예를 계속해서 제어 역전의 통일성 하에서 젓가락은 어떻게 내 손에 왔는가? 요청 클래스 가져오기) 이는 종속성 주입 프로세스입니다.

Spring의 제어 반전 및 종속성 주입을 쉽게 이해

IOC와 DI에 대해 다시 이야기해보자

디자인 원칙 중 헐리우드 원칙은 “우리를 찾지 말고, 우리가 당신을 찾습니다.”라고 설명합니다. 바이두백과사전에서는 이렇게 설명하고 있습니다. “전화하지 마세요. 전화하겠습니다(전화하지 마세요. 전화하겠습니다)”라는 설명은 할리우드의 유명한 원칙입니다. 할리우드에서는 연기회사에 이력서를 제출한 뒤 집에 가서 기다리기만 하면 된다. 예능사업 전체를 공연예술회사가 전권을 갖고 있기 때문에 배우들은 회사의 일을 소극적으로 받아들이고 필요할 때만 공연을 완성할 수 있다. 이것이 IOC에 완벽하게 반영되어 있는데, IOC가 중점을 두고 있는 것은 객체를 생성하는 기존 방식, 즉 새로운 객체를 IOC 컨테이너에 제출하고 수동적으로 IOC 컨테이너를 기다리는 방식으로 변화하는 디자인 컨셉입니다. 당신을 위해 자원을 반환합니다. 통제의 역전이란 '연예인이 배우를 통제한다'는 뜻이고, 의존성이라고 하면 '배우가 회사에 의존해 일해야 한다'는 뜻이다. 프로세스는 종속성 주입입니다. 본질적으로 IOC와 DI는 동일한 아이디어 아래 서로 다른 차원의 표현입니다.

코드 구현

제어 역전에서 리소스를 얻는 과정을 종속성 주입이라고 하므로 여기서의 코드 구현도 종속성 주입에 중점을 둡니다. 의존성 주입에는 구성 주입, 설정 주입, 인터페이스 주입의 세 가지 방법이 있습니다.

1. 인터페이스 주입: 인터페이스에 주입할 정보를 정의하고, 인터페이스를 통해 주입을 완료합니다. (Spring은 이 주입 방법을 지원하지 않습니다 - 이를 지원하지 않는 이유는 - Spring은 이것이 비침습적이며 "이 프레임워크 없이도 작동할 수 있다"고 주장합니다. 인터페이스 주입을 사용하는 경우 이 원칙을 위반합니다.) 여기에서 완료되었습니다. 코드 구현 설명.

 2.세터 주입

먼저 Spring에서 벗어나 setter 주입을 구현합니다.

public interface UserDao{
  addUser(String username);      
}
public class UserDaoImpl implements UserDao{
    @Override    
    public void addUser(String username)
{
    System.out.println("添加用户:"+username);  
}  
}
public class UserMessage{    
    
    private UserDao userDao;    
    
    //使用设值方式赋值    
    public void setUserDao(UserDaoImpl userDao) {    
        this.userDao = userDao;    
    }    
        
    @Override    
    public void addUser(String userName, String password) {    
      
        userDao.addUser(userName, password);    
    }    
}

주의 깊게 관찰했는데, 실제로 여기서 접근 방식은 UserDao userDao=new UserDaoImpl()과 본질적으로 동일합니다. 즉, 부모 클래스가 하위 클래스의 메서드를 참조할 수 있다는 점을 언급해야 합니다. 여기서 한 가지 효과는 User Message와 UserDao 간의 결합을 줄이는 것입니다. 다시 생각해보면, 독자들은 당신이 언급한 제어 반전과 의존성 주입이 컨테이너로부터 자원을 요청해야 한다고 말할 수도 있습니다. 위에서는 주입이 수행되는 방식을 설명하겠습니다.

<!-- 使用spring管理对象的创建,还有对象的依赖关系 -->    
<bean id="userManager" class="scau.zzf.service.UserMessage">    
        <!-- (1)UserMessageImpl使用了userDao,Ioc是自动创建相应的UserDao实现,都是由容器管理-->    
        <!-- (2)在UserMessageImpl中提供构造函数,让spring将UserDao实现注入(DI)过来 -->    
        <!-- (3)让spring管理我们对象的创建和依赖关系,必须将依赖关系配置到spring的核心配置文件中 -->    
        <property name="userDao" ref="UserDao"></property>   
    <!-- 构造注入 -->
    <!-- <constructor-arg ref="userDao"/>  --> 
    </bean>   
<bean id="UserDao" class="scau.zzf.Dao.UserDao">
    
</bean>

먼저 Bean을 조립해야 합니다. 즉, Spring 컨테이너에서 Bean을 구성한 다음 Bean 객체 인스턴스를 반환해야 합니다. 관련 Bean 정보를 얻기 위해 XmlBeanFactory를 통해 xml 파일을 읽을 수 있습니다.

public class test {
    public static void main(String[] args) throws Exception {
    BeanFactory factory=new XmlBeanFactory(new FileSystemResource("src/appllication.xml"));
        UserMessage userMessage=(UserMessage)factory.getBean("UserMessage");
        userMessage.add("德玛西亚");

    }
}

실제 애플리케이션에서는 수동으로 정보를 읽지 않고 요청만 보내면 됩니다. 물론 이러한 과정을 이해하는 것이 필요합니다.

이제 Annotation을 통한 주입 구현 방법을 간략하게 설명하겠습니다.

@Configuration
public class UserConfig {
    @Bean
    public UserDao getUserDao(){
        return new UserDao();
    }
    @Bean
    public UserMessage getUserMessage(){
        return new UserMesssgae(getUserDao);
    }
}

@Configuration의 기능은 전체 클래스를 구성 클래스로 만드는 것입니다. @Bean 주석은 이 주석 아래의 메서드가 객체를 반환할 것임을 Spring에 알리고 이 객체는 해당 Bean을 등록해야 합니다. Spring 애플리케이션 컨텍스트를 유지합니다. 기본적으로 Spring의 빈은 싱글톤입니다. 즉, 위의 예에서 getUserDao()를 몇 번이나 사용하더라도 반환되는 객체는 처음부터 끝까지 동일합니다. JavaConfig 구성에 대한 추가 지침을 보려면 독자는 작성자의 다른 기사인 "SSH를 보다 우아하게 구성하기"를 참조하세요.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Java.1차원 배열다음 기사:Java.1차원 배열