다음과 같이 setter 메소드가
구성 파일에 삽입됩니다.
<bean id="helloAction" class="org.yoo.action.SpringSetterHelloAction"> <!-- setter injection using the nested <ref/> element --> <property name="helloservice"><ref bean="helloService"/></property> <!--可以不设置类型 --> <property name="name" value="yoo"></property> </bean>
액션 구현 클래스의 코드:
private IHelloService helloservice;private String name ; public void sayHello(){helloservice.sayHello(); System.out.println(this.name);} public void setHelloservice(IHelloService helloservice) {this.helloservice = helloservice;} public void setName(String name) {this.name = name;}
여기 name과 helloservice 모두 속성의 setter 메서드를 사용하여 주입됩니다. 즉, 클래스에 전역 속성을 설정하고 컨테이너 주입을 위한 속성에 대한 setter 메서드를 갖습니다.
2 생성자 주입
spring도 생성자 주입, 즉 일부 자료에서 생성자 또는 생성자 주입을 지원합니다.
먼저 구성 파일을 살펴보세요.
<!--普通构造器注入--> <bean id="helloAction" class="org.yoo.action.ConstructorHelloAction"> <!--type 必须为Java.lang.String 因为是按类型匹配的,不是按顺序匹配--> <constructor-arg type="java.lang.String" value="yoo"/> <!-- 也可以使用index来匹配--> <!--<constructor-arg index="1" value="42"/>--> <constructor-arg><ref bean="helloService"/> </constructor-arg> </bean>
액션 구현 클래스의 코드:
private HelloServiceImpl helloservice; private String name ; public SpringConstructorHelloAction(HelloServiceImpl helloservice,String name){this.helloservice = helloservice; this.name = name ;} @Overridepublic void sayHello() {helloservice.sayHello(); System.out.println(this.name);}
2개의 속성도 설정한 후 생성자에 삽입합니다.
세 가지 정적 팩토리 주입
구성 파일은 다음과 같습니다.
<!--静态工厂构造注入--> <!--注意这里的class 带factory-method参数--> <!--factory-method的值是FactoryHelloAction中的工厂方法名createInstance--> <bean id="helloAction" class="org.yoo.di.FactoryHelloAction" factory-method="createInstance"> <constructor-arg type="java.lang.String" value="yoo"/> <constructor-arg> <ref bean="helloService"/> </constructor-arg> </bean>
액션 구현 클래스:
private HelloServiceImpl helloservice; private String name = null; private SpringFactoryHelloAction(String name ,HelloServiceImpl helloservice){this.helloservice = helloservice ; this.name = name ;} public static SpringFactoryHelloAction createInstance(String name ,HelloServiceImpl helloservice) {SpringFactoryHelloAction fha = new SpringFactoryHelloAction (name,helloservice); // some other operationsreturn fha;} @Overridepublic void sayHello() {helloservice.sayHello(); System.out.println(this.name);}
4가지 구성 없는 파일 주입(자동 주입)
위의 세 가지 방법에는 구성 파일 작성이 필요하며 Spring 2.5에서는 구성 파일을 작성하지 않는 ioc 구현도 제공됩니다. Bean 간의 종속성을 참조하는 구성 파일이 없으며 구성 파일을 기반으로 하지 않지만 스프링 구성 파일이 없다는 의미는 아닙니다.
구성 파일은 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.php.cn/"> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> <bean id="helloService" class="org.yoo.service.HelloServiceImpl"> </bean> <bean id="helloAction" class="org.yoo.action.AutowiredHelloAction"> </bean> </beans>
위에서는 helloService와 helloAction 두 빈만 설정하고 helloService에 helloAction의 종속성을 설정하지 않은 것을 볼 수 있습니다.
또한 자동 주입을 지원하려면
액션 구현 클래스:
/* * 属性自动装载 */ /* @Autowired private HelloService helloservice; @Override public void sayHello() { helloservice.sayHello(); 。
위 코드는 매우 간단합니다. @Autowired 주석을 속성에 추가하면 Spring이 자동으로 HelloService를 주입합니다.
은 다음과 같이 생성자 및 setter 메서드 삽입도 지원합니다.
생성자 자동 삽입:
/* * 还可以使用构造函数设置 */ @Autowired public SpringAutowiredHelloAction(HelloServiceImpl helloservice){ this.helloservice = helloservice; }
setter 메서드 자동 삽입:
/* * 也可以使用set方法设置 */ /* @Autowired public void setHelloservice(HelloService helloservice) { this.helloservice = helloservice; }
마지막으로 스프링 참조 문서에 자동 주입을 사용하지 않는 경우에는 setter 메소드를 사용해 보도록 언급되어 있습니다. 일반적으로 setter 메소드도 사용됩니다.
자동 주입 방식을 사용할지, 구성 파일 방식을 사용할지, jdk가 1.5 미만이거나 spring이 2.5가 아닌 경우 구성 파일 방식만 사용할 수 있습니다. 나머지는 실제 프로젝트 선택에 따라 다릅니다.
이상은 Spring Ioc-의존성 주입 방법에 대한 자세한 소개입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!