SpringBoot---SpringBoot配置

在之前用Spring framework的IOC和AOP时,我们都会去创建一个配置文件,去创建一个IOC容器和端口扫描之类的标签。而SpringBoot不这么做,一般都不会去创建这么一个配置文件(xml),而是去创建一个配置类,也就是全注解配置。

实践演示:

练习bean类:

public class Parent {

    private String name;
	//........
	//省略构造方法,get,set方法,toString
}
public class Children {

    private String name;
    
}

配置类:

如果按照以前的做法就是去写bean.xml(配置文件)。
现在的话,写一个配置类:

@Configuration(proxyBeanMethods = true)
public class MyConfiguration {


    //@Bean("parent")
    @Bean  //以方法名作为组件id
    public Parent getParent(){
        return new Parent("Tom");
    }

    @Bean
    public Children getChildren(){
        return new Children("Sam");
    }
}

测试方法:


    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        
        Parent parent = run.getBean("getParent", Parent.class);
        System.out.println(parent);
    }

关注点:

我们需要注意的是,配置类上方的注解:

@Configuration(proxyBeanMethods = true)

这个如果里面这个属性的意思是:
当我们通过这个配置类对象去调用里边的方法时,获得的对象是新建一个还是从容器里边拿。

例子:

    public static void main(String[] args) {
    	//获得容器对象
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
		//从容器中取得Parent类对象
        Parent parent = run.getBean("getParent", Parent.class);
        //获得配置类对象
        MyConfiguration bean = run.getBean(MyConfiguration.class);
        //调用配置类方法
        Parent parent1 = bean.getParent();
        
        System.out.println(parent==parent1);
    }

结果是true。
表示所取的对象不是新建的,而是从容器中拿的。


当proxyBeanMethods=false时。
结果则返回false,通过配置类对象调用方法时,不去容器中寻找是否有该组件,直接新建一个。

组件的依赖:

通过上面我们来用一个例子来更快了解下。

比如:有一位家长拥有一名自己的孩子。

public class Parent {

    private String name;
    private Children children;

	//........
	//省略构造方法,get,set方法,toString
}

则配置类代码为:

@Configuration(proxyBeanMethods = true)
public class MyConfiguration {
    
    //@Bean("parent")
    @Bean  //以方法名作为主键id
    public Parent getParent(){
        Parent tom = new Parent("Tom");
        //调用组件注册方法,返回的还是容器的实例
        tom.setChildren(getChildren());
        return tom;
    }
    
    @Bean
    public Children getChildren(){
        return new Children("Sam");
    }
}

上面的情况称为:Parent组件依赖Children组件。

扩张内容

proxyBeanMethods:代理bean的方法

  • Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
  • Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】

最佳实战

  • 配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
  • 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式

获取所有配置组件

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

        //查看容器里面的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值