zoukankan      html  css  js  c++  java
  • springboot成神之——ioc容器(依赖注入)

    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
    
  • 相关阅读:
    [luoguP2762] 太空飞行计划问题(最大权闭合图—最小割—最大流)
    [luoguP2680] 运输计划(lca + 二分 + 差分)
    [luoguP2758] 编辑距离(DP)
    [luoguP2890] [USACO07OPEN]便宜的回文Cheapest Palindrome(DP)
    Javascript对象拷贝(clone)
    使用JavaScript访问XML数据
    javascript 树形菜单
    Simple JavaScript Inheritance
    用 javascript 操作 xml
    javascript flash 弹框
  • 原文地址:https://www.cnblogs.com/ye-hcj/p/9613491.html
Copyright © 2011-2022 走看看