Spring容器中的那些事——javaconfig篇

126 阅读4分钟

本人已参与[新人创作礼]活动,一起开启掘金创作之路。

Spring容器中的那些事——注解配置

在一个阳光明媚的下午,一名脱发中的程序猿正在准备让一个朋友帮他创建管理一个对象。

程序猿刚刚和Spring搞好了关系,准备见识一下他的厉害.....

Spring是一位大名鼎鼎的生产工,他能把委托者给他的一个对象在自己的仓库里就造好收藏起来,等委托者想用的时候直接拿就可以。

猿猿前去问Spring,怎么才能把我创建的User类交给你管理呢?


Spring说:“hey兄弟,想把一个对象的信息传给我,就要创建一个配置兄,让那位配置兄带着一群类们来我这里。”

Spring补充道:“啊当然啦,要是只有一个对象信息就让他带一个就行。但是啊,咱俩现在这么唠嗑没问题,程序是个严谨的家伙,你得通过某些特殊手段告诉我,来送信的是这位配置兄”


猿猿问:“道理我都懂,那到时候他怎么证明自己是配置兄呢”


Spring:“注解呀,注解就是我和你程序交互的根本手段,咱俩的通用语言♂(斜眼笑)”


猿猿:“害,你看我这脑子,行!那我先去请个配置兄,我用@configuration这个注解表示他是配置兄,别认错了昂!然后@Bean表示这是我携带的类,里面的name属性就是我要给他起的别名”


Spring:“得嘞!”


接下来的一段时间里,猿猿先创造了User类:

package com.tomatoin.pojo;

import org.springframework.beans.factory.annotation.Value;

public class User {
    private String name;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    @Value("我是User")
    public void setName(String name) {
        this.name = name;
    }
}

然后又创建了携带所有类的配置兄弟:ConfigTest

package com.tomatoin.config;

import com.tomatoin.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConfigTest {

    @Bean(name = "iAmUser")
    public User user(){
        return new User();
    }
}

程序中configTest头上戴的小帽子@configuration就是通知Spring他是配置兄最好的证据。


“呼呼”

“Spring在吗,Spring在吗?我是配置,这里有人托我带的一封信!!”

Spring探出脑袋:“oh你终于来了,把信给我吧,辛苦你了”

config:“给,这封叫做“iAmUser”的。”

Spring收下了信,他要按照这封信上的数据去创建一个对象并把它收藏起来,等我想要的时候随时取。


猿猿:“Spring老兄,我来拿一下前几天送你这里管理的对象,就是叫做“iAmUser”的那个


Spring:“行,你去写个测试类拿吧”

猿猿随后写了这段测试类:

package com.tomatoin;

import com.tomatoin.config.ConfigTest;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MyTest {
    @Test
    public void test1(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConfigTest.class);
        Object user = context.getBean("iAmUser");
        System.out.println(user.toString());
    }
}

Spring:“好了给你~,不过你说你也是,你让人家config跑一趟,就带一个对象数据过来,下次多带几个,我让你请config兄的目的也正是如此,他能一下子带好多呢,都放我这儿管理,下次拿着也方便”


猿猿:“好的。不过兄弟我有一点不太懂,我们程序员自己也能new对象来拿到他们啊,为啥很多人都不自己new对象,而是都放你这儿托管然后再拿呢”


Spring:“害,这不是既能照顾我的生意,又能方便你们。我问你,当你自己去new对象的时候是不是就在后台写死了?人家用户让你改动的时候你是不是还得自己重新new,慢慢改”


猿猿:“这倒是...但是我重新new一下很麻烦吗,我这还得请配置还得找你的这不更麻烦”


Spring:“兄弟...你真以为我这生意白做的?你现在是一个对象重新弄你觉得方便,当有成千上万个的时候呢?你也自个慢慢改?咋的?还嫌加班少?交给我管理之后,你俩之间就不耦合在一块了,修改的时候也只需要改该改动的那部分,比如配置文件,而不用动你的代码”


猿猿:“奥~我想起来了,这就是人们经常提到的IOC控制反转吧,我获得对象的行为由主动行为变成了被动行为,你来干活,我被动接收就行”


终于,Spring结束了一天的工作,猿猿也拿着他想要的对象回了家,当然更重要的是他明白了Spring干的是一件神圣的职业,这使猿猿对它有了几分敬重。

天色已晚,关于那个叫做IOC的话题,两人没有再多聊些什么,毕竟那是一个比较庞大的体系,更是前人们留下的优秀的思想。

To be continued.....

补图:

不使用情况下: 在这里插入图片描述 使用Spring IOC思想: 在这里插入图片描述

在这里插入图片描述