이 글에서는 주로 Spring 의존성 주입의 여러 방법을 자세히 소개하고 있습니다. 편집자가 꽤 좋다고 생각해서 지금부터 공유하고 참고용으로 올려보겠습니다. 에디터를 따라가서 살펴보겠습니다
IoC 소개
일반적인 Java 개발에서 프로그래머는 특정 클래스에서 다른 클래스의 메서드에 의존해야 합니다.
보통 new는 클래스에 의존한 후 클래스 인스턴스를 호출하는 메서드입니다. 이런 개발의 문제점은 새 클래스 인스턴스를 균일하게 관리하기가 쉽지 않다는 것입니다.
Spring은 종속성 주입이라는 아이디어를 제안했습니다. 즉, 종속 클래스는 프로그래머에 의해 인스턴스화되지 않지만 Spring 컨테이너는 새 인스턴스를 지정하고 객체가 필요한 클래스에 인스턴스를 주입하는 데 도움이 됩니다.
의존성 주입의 또 다른 용어는 "제어 역전"입니다. 대중적인 이해는 다음과 같습니다: 일반적으로 우리는 새로운 인스턴스를 생성하고 이 인스턴스의 제어는 프로그래머입니다.
제어 반전이란 새로운 인스턴스 작업이 프로그래머에 의해 수행되지 않고 Spring 컨테이너로 넘겨진다는 것을 의미합니다.
Spring에는 다양한 형태의 종속성 주입이 있습니다. 이 기사에서는 Spring이 xml을 통해 IOC 구성을 수행하는 방법만 소개합니다.
1.Set 주입
가장 간단한 주입 방법입니다. SpringAction이 있고 클래스에서 SpringDao 객체를 인스턴스화해야 한다고 가정하면 다음과 같이 정의할 수 있습니다. 개인 SpringDao 멤버 변수를 만들고 SpringDao set 메서드를 만듭니다(이것은 ioc의 주입 항목입니다).
그런 다음 spring xml 파일을 작성합니다.
<!--配置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 파일 형식에서
<!--配置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>
인스턴스 팩토리의 의미는 객체 인스턴스를 얻는 방법이 정적이지 않다는 것입니다. 먼저 새 팩토리 클래스를 생성한 다음 일반 인스턴스 메서드를 호출해야 합니다.
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>
가장 일반적으로 사용되는 Spring IOC 주입 방법은 (1)(2)입니다. 글을 쓰고 연습할수록 당신은 더욱 능숙해질 것입니다.
참고: Spring을 통해 생성된 객체는 기본적으로 싱글톤입니다. 여러 인스턴스 객체를 생성해야 하는 경우
<bean name="..." class="..." scope="prototype">
위 내용은 Java Spring 의존성 주입의 여러 방법에 대한 자세한 설명입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!