Spring 使用指南 ~ 1、Spring 的 IOC 和 DI 简介
admin
2024-03-05 02:55:05

一、IOC && DI

1、概念介绍

  • IOC:控制反转,即把类的实例化交给 Spring 来管理
  • DI:依赖注入,即通过 Spring 为应用中被 Spring 管理的类实例注入其依赖的实例和其他信息

2、使用 XML 形式

1)、构造函数注入

package com.luo.spring.guides.iocdi.xml.constructorconfusion;import org.springframework.context.support.GenericXmlApplicationContext;/**
* @author : archer
* @date : Created in 2022/11/30 14:46
* @description :
*/
public class ConstructorConfusion {private String someValue;public ConstructorConfusion(String someValue) {System.out.println("ConstructorConfusion(String) called");this.someValue = someValue;}public ConstructorConfusion(int someValue) {System.out.println("ConstructorConfusion(int) called");this.someValue = "Number: " + Integer.toString(someValue);}public String toString() {return someValue;}
}

app-context-xml.xml

90

测试

package com.luo.spring.guides.iocdi.xml.constructorconfusion;import org.springframework.context.support.GenericXmlApplicationContext;/*** @author : archer* @date : Created in 2022/11/30 14:51* @description :*/
public class Main {public static void main(String... args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("classpath:iocdi/app-context.xml");ctx.refresh();ConstructorConfusion cc = (ConstructorConfusion) ctx.getBean("constructorConfusion");System.out.println(cc);ctx.close();}
}

输出

ConstructorConfusion(int) called
Number: 90

2)、setter 注入

package com.luo.spring.guides.iocdi.xml.setter;public class Dependency {@Overridepublic String toString() {return "Dependency{}";}
}
package com.luo.spring.guides.iocdi.xml.setter;public class SetterInjection {private Dependency dependency;public void setDependency(Dependency dependency) {this.dependency = dependency;}@Overridepublic String toString() {return dependency.toString();}
}

app-context-xml.xml



测试

package com.luo.spring.guides.iocdi.xml.setter;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author : archer* @date : Created in 2022/11/30 15:22* @description :*/
public class Main {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("iocdi/injection/setter/app-context-xml.xml");SetterInjection mr = ctx.getBean("setterInjection", SetterInjection.class);System.out.println(mr);}
}

输出

Dependency{}

3、使用注解形式

1)、构造函数注入

package com.luo.spring.guides.iocdi.annotation.constructorconfusion;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.stereotype.Service;@Service("constructorConfusion")
public class ConstructorConfusion {private String someValue;public ConstructorConfusion(String someValue) {System.out.println("ConstructorConfusion(String) called");this.someValue = someValue;}@Autowiredpublic ConstructorConfusion(@Value("90") int someValue) {System.out.println("ConstructorConfusion(int) called");this.someValue = "Number: " + Integer.toString(someValue);}public String toString() {return someValue;}
}

app-context-annotation.xml



测试

package com.luo.spring.guides.iocdi.annotation.constructorconfusion;import org.springframework.context.support.GenericXmlApplicationContext;/*** @author : archer* @date : Created in 2022/11/30 14:51* @description :*/
public class Main {public static void main(String... args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("classpath:iocdi/app-context-annotation.xml");ctx.refresh();ConstructorConfusion cc = (ConstructorConfusion) ctx.getBean("constructorConfusion");System.out.println(cc);ctx.close();}
}

输出

ConstructorConfusion(int) called
Number: 90

2)、setter 注入

package com.luo.spring.guides.iocdi.annotation.setter;import org.springframework.stereotype.Component;@Component("dependency")
public class Dependency {@Overridepublic String toString() {return "Dependency{}";}
}
package com.luo.spring.guides.iocdi.annotation.setter;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component("setterInjection")
public class SetterInjection {private Dependency dependency;@Autowiredpublic void setDependency(Dependency dependency) {this.dependency = dependency;}@Overridepublic String toString() {return dependency.toString();}
}

配置类

package com.luo.spring.guides.iocdi.annotation.setter;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;/*** @author : archer* @date : Created in 2022/11/30 15:32* @description :*/
@ComponentScan(basePackages = {"com.luo.spring.guides.iocdi.annotation"})
@Configuration
public class SetterInjectionConfiguration {
}

测试

package com.luo.spring.guides.iocdi.annotation.setter;import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** @author : archer* @date : Created in 2022/11/30 15:33* @description :*/
public class Main {public static void main(String... args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(SetterInjectionConfiguration.class);SetterInjection mr = ctx.getBean("setterInjection", SetterInjection.class);System.out.println(mr);}
}

输出

Dependency{}

3)、字段注入

package com.luo.spring.guides.iocdi.annotation.field;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** Created by iuliana.cosmina on 2/15/17.*/
@Service("singer")
public class Singer {@Autowiredprivate Inspiration inspirationBean;public void sing() {System.out.println("... " + inspirationBean.getLyric());}
}
package com.luo.spring.guides.iocdi.annotation.field;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** Created by iuliana.cosmina on 2/15/17.*/
@Component
public class Inspiration {private String lyric = "I can keep the door cracked open, to let light through";public Inspiration(@Value("For all my running, I can understand") String lyric) {this.lyric = lyric;}public String getLyric() {return lyric;}public void setLyric(String lyric) {this.lyric = lyric;}
}

测试

package com.luo.spring.guides.iocdi.annotation.field;import com.luo.spring.guides.iocdi.annotation.InjectionConfiguration;
import com.luo.spring.guides.iocdi.annotation.setter.SetterInjection;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;/*** @author : archer* @date : Created in 2022/11/30 20:46* @description :*/
public class Main {public static void main(String... args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(InjectionConfiguration.class);Singer singer = ctx.getBean("singer", Singer.class);Singer singerBean = ctx.getBean(Singer.class);System.out.println(singer == singerBean);singerBean.sing();singer.sing();}
}

输出

ConstructorConfusion(int) called
true
… For all my running, I can understand
… For all my running, I can understand

相关内容

热门资讯

小学感恩节校园广播稿 感恩节广...   甲:敬爱的老师们  乙:亲爱的同学们,大家好!  甲:很高兴,我们的红领巾广播又和大家如期相约了...
音乐电台节目广播稿 音乐电台节...   钢琴,旋律微微的风,颤颤的心  当我们在谈论爱情的时候,我们在谈什么  那么,就来一段沉默吧,让...
最新或2023(历届)元旦放假...  “元”有始之意,“旦”指天明的时间,也通指白天。元旦,便是一年开始的第一天。“元旦”一词,最早出自...
最新或2023(历届)春节放假...  说起春节想必大家都知道,春节的时间在公历1月21日至2月21日之间游动。“最早的春节”(如1966...
【通知】最新或2023(历届)...  导读:时光飞逝,转眼间新的一年又要到来了,最新或2023(历届)我们迎来的第一个节日就是元旦啦!元...