IoC 소개
일반적인 Java 개발에서 프로그래머는 클래스 내 다른 클래스의 메서드에 의존해야 합니다.
보통 new는 클래스에 의존한 후 클래스 인스턴스를 호출하는 방식입니다. 이런 개발의 문제점은 새로운 클래스 인스턴스를 균일하게 관리하기가 쉽지 않다는 것입니다.
Spring은 종속성 주입이라는 아이디어를 제안했습니다. 즉, 종속 클래스는 프로그래머에 의해 인스턴스화되지 않지만 Spring 컨테이너는 새 인스턴스를 지정하고 객체가 필요한 클래스에 인스턴스를 주입하는 데 도움이 됩니다.
의존성 주입의 또 다른 용어는 "제어 역전"입니다. 대중적인 이해는 다음과 같습니다: 일반적으로 우리는 새로운 인스턴스를 생성하고 이 인스턴스의 제어는 프로그래머입니다.
제어 반전이란 새로운 인스턴스 작업이 프로그래머에 의해 수행되지 않고 Spring 컨테이너로 넘겨진다는 것을 의미합니다.
Spring에는 다양한 형태의 종속성 주입이 있습니다. 이 기사에서는 Spring이 xml을 통해 IOC 구성을 수행하는 방법만 소개합니다.
1.Set 주입
가장 간단한 주입 방법입니다. SpringAction이 있고 클래스에서 SpringDao 객체를 인스턴스화해야 한다고 가정하면 다음과 같이 정의할 수 있습니다. 개인 SpringDao 멤버 변수를 만들고 SpringDao set 메서드를 만듭니다(이것은 ioc의 주입 항목입니다).
그런 다음 spring xml 파일을 작성합니다. 60e23eb984d18edbb092da6b8f295aba의 name 속성은 클래스의 별칭입니다. 속성, 클래스 속성은 클래스의 전체 이름을 참조합니다. SpringAction에는 공용 속성인 Springdao가 있으므로 SpringDao를 지정하려면 60e23eb984d18edbb092da6b8f295aba 태그에 3fae3ea4a17115666873e9119ccef645 태그를 생성해야 합니다. 3fcb97bb666cd7884d4d3210fb47b5ef 태그의 이름은 SpringAction 클래스의 SpringDao 속성 이름이며 ref는 다음과 같은 e28f79c6b83cf28d814be19374e681e1를 참조합니다. 이러한 방식으로 Spring은 실제로 SpringDaoImpl 객체를 인스턴스화합니다. SpringAction의 setSpringDao 메서드를 SpringDao 주입으로 호출합니다.
<!--配置bean,配置后该类由spring管理--> <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> <!--(1)依赖注入,配置当前类中相应的属性--> <property name="springDao" ref="springDao"></property> </bean> <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>
2. 생성자 주입
이 주입 방법은 매개변수를 이용한 주입을 말합니다 생성자 주입, 아래 예를 보세요. 두 개의 멤버 변수 SpringDao와 User를 생성했지만 객체의 set 메서드를 설정하지 않았으므로 여기서 주입 방법은 지원되지 않습니다. 즉, SpringAction 객체를 생성할 때 SpringDao와 User의 두 매개변수 값인
public class SpringAction { //注入对象springDao private SpringDao springDao; private User user; public SpringAction(SpringDao springDao,User user){ this.springDao = springDao; this.user = user; System.out.println("构造方法调用springDao和user"); } public void save(){ user.setName("卡卡"); springDao.save(user); } }를 전달해야 합니다.
은 또한 XML 파일 형식에서 3fcb97bb666cd7884d4d3210fb47b5ef를 사용하지 않고 대신 f5875481c2ebcdf604d5780d2ac7575d 태그를 사용하며 ref 속성도 다른 60e23eb984d18edbb092da6b8f295aba 태그의 이름 속성을 가리킵니다. >
<!--配置bean,配置后该类由spring管理--> <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> <!--(2)创建构造器注入,如果主类有带参的构造方法则需添加此配置--> <constructor-arg ref="springDao"></constructor-arg> <constructor-arg ref="user"></constructor-arg> </bean> <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean> <bean name="user" class="com.bless.springdemo.vo.User"></bean>
메소드 매개변수의 구성 불확실성을 해결하기 위해 생성자가 전달한 두 매개변수가 동일한 유형인지를 구별해야 할 수도 있습니다. 해당 값을 찾으려면 약간의 처리가 필요합니다:
다음은 매개변수 위치인 인덱스를 설정하는 것입니다:
<bean name="springAction" class="com.bless.springdemo.action.SpringAction"> <constructor-arg index="0" ref="springDao"></constructor-arg> <constructor-arg index="1" ref="user"></constructor-arg> </bean>
다른 하나는 매개변수 유형을 설정하는 것입니다:
<constructor-arg type="java.lang.String" ref=""/>정적 팩토리 메소드 주입
정적 팩토리는 이름에서 알 수 있듯이 정적 팩토리 메소드를 호출하여 필요한 객체를 얻는 것입니다. 스프링이 모든 객체를 관리하기 위해서는 "Engineering Class.Static Method()"를 통해 직접 객체를 얻을 수는 없지만, 여전히 스프링 주입을 통해 얻습니다.
package com.bless.springdemo.factory; import com.bless.springdemo.dao.FactoryDao; import com.bless.springdemo.dao.impl.FactoryDaoImpl; import com.bless.springdemo.dao.impl.StaticFacotryDaoImpl; public class DaoFactory { //静态工厂 public static final FactoryDao getStaticFactoryDaoImpl(){ return new StaticFacotryDaoImpl(); } }
또한 주요 클래스를 살펴보세요. 여기서는 FactoryDao 객체를 주입해야 합니다. 첫 번째 객체와 완전히 동일해 보입니다. 그러나 후속 XML을 보면 큰 차이점을 발견할 수 있습니다.
public class SpringAction { //注入对象 private FactoryDao staticFactoryDao; public void staticFactoryOk(){ staticFactoryDao.saveFactory(); } //注入对象的set方法 public void setStaticFactoryDao(FactoryDao staticFactoryDao) { this.staticFactoryDao = staticFactoryDao; } }
Spring IOC 구성 파일, <가 가리키는 클래스에 유의하세요. ;bean name="staticFactoryDao">는 FactoryDao의 구현 클래스가 아니지만 정적 팩토리 DaoFactory를 가리키며 호출할 팩토리 메서드를 지정하도록 Factory-method="getStaticFactoryDaoImpl"을 구성합니다.
<!--配置bean,配置后该类由spring管理--> <bean name="springAction" class="com.bless.springdemo.action.SpringAction" > <!--(3)使用静态工厂的方法注入对象,对应下面的配置文件(3)--> <property name="staticFactoryDao" ref="staticFactoryDao"></property> </property> </bean> <!--(3)此处获取对象的方式是从工厂类中获取静态方法--> <bean name="staticFactoryDao" class="com.bless.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean>4. 인스턴스 팩토리의 메소드 주입
인스턴스 팩토리의 의미는 객체 인스턴스를 얻는 방법이 정적이지 않다는 것입니다. 먼저 새 팩토리 클래스를 생성한 다음 일반 인스턴스 메서드를 호출해야 합니다.
public class DaoFactory { //实例工厂 public FactoryDao getFactoryDaoImpl(){ return new FactoryDaoImpl(); } }
그런 다음 다음 클래스는 할 말이 없으며 다음과 매우 유사합니다. 이전 것, 그러나 FactoryDao 객체는 인스턴스 팩토리 클래스를 통해 생성되어야 합니다:
public class SpringAction { //注入对象 private FactoryDao factoryDao; public void factoryOk(){ factoryDao.saveFactory(); } public void setFactoryDao(FactoryDao factoryDao) { this.factoryDao = factoryDao; } }
마지막으로 스프링 구성 파일을 살펴보세요:
<!--配置bean,配置后该类由spring管理--> <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> <!--(4)使用实例工厂的方法注入对象,对应下面的配置文件(4)--> <property name="factoryDao" ref="factoryDao"></property> </bean> <!--(4)此处获取对象的方式是从工厂类中获取实例方法--> <bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory"></bean> <bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean>5. 요약
가장 일반적으로 사용되는 Spring IOC 주입 방법은 (1)(2)입니다. 글을 쓰고 연습할수록 당신은 더욱 능숙해질 것입니다.
참고: Spring을 통해 생성된 객체는 기본적으로 싱글톤입니다. 여러 인스턴스 객체를 생성해야 하는 경우 60e23eb984d18edbb092da6b8f295aba 태그 뒤에 속성을 추가할 수 있습니다.
<bean name="..." class="..." scope="prototype">
위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다. 또한 PHP 중국어 웹사이트를 지원해 주시기 바랍니다.
Spring 종속성 주입의 여러 방법과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!