springboot成神之——ioc容器(依賴注入)

springboot成神之——ioc容器(依賴注入)

spring,maven環境請自行搭建,本文重點放在ioc容器的工做原理java

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
相關文章
相關標籤/搜索