springboot成神之——ioc容器(依賴注入)
spring,maven環境請自行搭建,本文重點放在ioc容器的工作原理
spring的ioc功能
一個對象的實例和字段的值被一個特殊的對象從外部注入,這個特殊的對象就是ioc
ioc容器包含了所有的Spring Beans
文件目錄結構
lang
// 定義此接口,用來作為Chinese和English類的公共實現接口
package com.springlearn.learn.lang;
public interface Language{
public String getGreeting();
public String getBye();
}
Chinese
// 具體功能實現類
package com.springlearn.learn.langimpl;
import com.springlearn.learn.lang.Language;
public class Chinese implements Language{
@Override
public String getGreeting(){
return "你好";
}
@Override
public String getBye() {
return "再見";
}
}
English
// 具體功能實現類
package com.springlearn.learn.langimpl;
import com.springlearn.learn.lang.Language;
public class English implements Language{
@Override
public String getGreeting(){
return "Hello";
}
@Override
public String getBye() {
return "Bye bye";
}
}
GreetingService
// 此類就是ioc容器中的一個bean,內部屬性通過外部注入
// @Service的作用就是聲明他是一個bean
// @Autowired的作用就是依賴注入
package com.springlearn.learn.bean;
import com.springlearn.learn.lang.Language;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class GreetingService{
@Autowired
private Language language;
public GreetingService() {
}
public void sayGreeting() {
String greeting = language.getGreeting();
System.out.println("Greeting:" + greeting);
}
}
MyRepository
// @Repository聲明此類是一個bean,主要用於內部數據注入到其他bean中,比如MyComponent.java
package com.springlearn.learn.bean;
import java.util.Date;
import org.springframework.stereotype.Repository;
@Repository
public class MyRepository{
public String getAppName(){
return "Hello my first Spring App";
}
public Date getSystemDateTime() {
return new Date();
}
}
MyComponent
// @Component聲明這是一個bean,並且字面上表示這個類是個組件依賴於其他的bean,也就是上面定義的Repository
package com.springlearn.learn.bean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyComponent {
@Autowired
private MyRepository repository;
public void showAppInfo(){
System.out.println("Now is:" + repository.getSystemDateTime());
System.out.println("App Name" + repository.getAppName());
}
}
AppConfiguration
// 此類是一個定義bean和集中bean的文件
// @Configuration聲明這個類是定義bean的
// @ComponentScan掃描bean目錄
// @Bean(name="language") 定義了一個名為language的bean,只要訪問此bean就會自動調用getLanguage方法
package com.springlearn.learn.config;
import com.springlearn.learn.lang.Language;
import com.springlearn.learn.langimpl.Chinese;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan({"com.springlearn.learn.bean"})
public class AppConfiguration{
@Bean(name="language")
public Language getLanguage() {
return new Chinese();
}
}
DemoApplication
// 此類是程序的啟動類
// AnnotationConfigApplicationContext會調用配置類
// 通過調用context.getBean("language");會創建Chinese類實例
// context.getBean("greetingService");greetingService其中的@Autowired會將language實例注入
package com.springlearn.learn;
import com.springlearn.learn.bean.GreetingService;
import com.springlearn.learn.bean.MyComponent;
import com.springlearn.learn.config.AppConfiguration;
import com.springlearn.learn.lang.Language;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfiguration.class);
System.out.println("-------------");
Language language = (Language)context.getBean("language");
System.out.println("Bean Language: "+ language);
System.out.println("Call language.sayBye(): "+ language.getBye());
GreetingService service = (GreetingService) context.getBean("greetingService");
service.sayGreeting();
System.out.println("----------");
MyComponent myComponent = (MyComponent) context.getBean("myComponent");
myComponent.showAppInfo();
}
}
運行結果
-------------
Bean Language: com.springlearn.learn.langimpl.Chinese@258d79be
Call language.sayBye(): 再見
Greeting:你好
----------
Now is:Sun Sep 09 13:48:45 CST 2018
App NameHello my first Spring App