spring,maven環境請自行搭建,本文重點放在ioc容器的工做原理java
一個對象的實例和字段的值被一個特殊的對象從外部注入,這個特殊的對象就是ioc ioc容器包含了全部的Spring Beans
// 定義此接口,用來做爲Chinese和English類的公共實現接口 package com.springlearn.learn.lang; public interface Language{ public String getGreeting(); public String getBye(); }
// 具體功能實現類 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 "再見"; } }
// 具體功能實現類 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"; } }
// 此類就是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); } }
// @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(); } }
// @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()); } }
// 此類是一個定義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(); } }
// 此類是程序的啓動類 // 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