SpringBoot容器功能

容器功能[重点]

1.组件添加【就是创建Bean对象[重点]】

组件添加,就是在容器创建Bean对象

A.@Configuration注解

@Configuration注解表示是一个配置类,可以添加相关的组件

基本使用:

Full模式和Lite模式

  • 配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断,加载快,启动快

    @Configuration(proxyBeanMethods = false)
    
  • 配置类组件之间有依赖关系,方法会调用得到之前单实例组件,用Full模式

    @Configuration(proxyBeanMethods = true)也是默认值
    

作用是:如果需要使用到单例模式Full也就是组件依赖也是默认模式,就设置成Full模式,其他就使用Lite模式

示例:

User

public class User {
    private String name;
    private Integer age;
    private Pet pet;
	
	提供seting和geting方法及toString
	有参构造器和无参构造器
}

Pet

public class Pet {
    private String name;
    	
	提供seting和geting方法及toString
	有参构造器和无参构造器
}

Config类【配置类】

/**
 *  表示该类是一个配置类
 * 1.配置类里面使用`@Bean`标注在方法上给容器注册组件,默认是单实例的
 * 2.配置类本身也是一个组件
 * 3.proxyBeanMethods:代理Bean方法
 *      Full[@Configuration(proxyBeanMethods = true)]:保证每个`@Bean`方法被调用多少次返回的组件都是单实例的
 *      Lite[@Configuration(proxyBeanMethods = false]:每个`@Bean`方法被调用多少次返回组件都是新创建的
 *
 * 4.作用是:组件依赖:如果在容器需要单实例的,就使用`Full`模式也是默认方式,否则其他方式是Lite模式
 */
@Configuration(proxyBeanMethods = true)
public class MyConfig {

    /**
     * Full:外部无论对配置类的这此组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
     */

    @Bean//给容器中添加组件,以方法名作为组件的`id`,返回类型就是组件类型,返回的值就是组件在
    // 容器中的实例
    public User user(){
        //如果是:Full模式的, 获取的组件Pet在容器中只有一个就是单例的
        User user = new User("湛江",23,pet());
        return user;
    }

    @Bean("tom")// 返回是组件的`ID`是`tom`
    public Pet pet(){
        return new Pet("tom");
    }

}

测试

/**
 * @SpringBootApplication注解标注的表示是:是一个SpringBoot应用
 * 同时也是程序的入门
 */
@SpringBootApplication(scanBasePackages={"com.haikang"})// 这个注解等同下面三个注解
//@SpringBootConfiguration
//@EnableAutoConfiguration
//@ComponentScan("com.haikang")
public class MainApplication {
    // 表示是程序的入口
    public static void main(String[] args) {
        // 获取 Spring 容器的IOC
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        // 获取容器中的所有组件
        String[] strings = run.getBeanDefinitionNames();
        for (String name:
             strings) {
            System.out.println(name);
        }


        // 获取容器中的User对象和Pet对象,比较User中的Pet属性和Pet对象是否是同一个对象
        User user = run.getBean("user", User.class);
        Pet tom = run.getBean("tom", Pet.class);
        System.out.println("判断用户中的宠物是否和Pet是同一个对象:"+(user.getPet()==tom));
        //返回值:判断用户中的宠物是否和Pet是同一个对象:true
    }
}

B.@Bean @Component @Controller @Repository 注解创建Bean对象【添加组件】
C.@ComponentScan @Import注解创建Bean对象【添加组件】

注意是:@Import注解可以使用在任何组件上对象类上

例如:

/**
 * @Import({User.class, DBHelper.class})
 *      给容器中自动创建出两个类型的组件,默认组件的名字就是全类名
 */
@Import({User.class})

测试:

/**
 * @SpringBootApplication注解标注的表示是:是一个SpringBoot应用
 * 同时也是程序的入门
 */
@SpringBootApplication(scanBasePackages={"com.haikang"})// 这个注解等同下面三个注解
//@SpringBootConfiguration
//@EnableAutoConfiguration
//@ComponentScan("com.haikang")
public class MainApplication {
    // 表示是程序的入口
    public static void main(String[] args) {
        // 获取 Spring 容器的IOC
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
       
       
        // 获取组件中所有名称
        String[] names = run.getBeanNamesForType(User.class);
        for (String name:
             names) {
            System.out.println(name);
        }
    }
}

@Import注解源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {

	/**
	 * {@link Configuration @Configuration}, {@link ImportSelector},
	 * {@link ImportBeanDefinitionRegistrar}, or regular component classes to import.
	 */
	Class<?>[] value();

}
D.@Conditional注解【非常重要在底层】

@Conditional注解是可以作用在类上,表示该类满足条件才装配,可以在方法上

条件装配:满足@Conditional指定的条件,则进行组件注入

@Conditional是一个父注解,下面有很多子注解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yqzpQlSl-1655553478294)(img\1654250232341.png)]

例如:

@ConditionalOnBean(User.class)
//表示要MyConfig类中包含User.class类型的组件才进行添加组件【就是才创建Bean对象,不创建】
=====================测试条件装配==========================
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
//@ConditionalOnBean(name = "tom")
@ConditionalOnMissingBean(name = "tom")
public class MyConfig {


    /**
     * Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
     * @return
     */

    @Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
    public User user01(){
        User zhangsan = new User("zhangsan", 18);
        //user组件依赖了Pet组件
        zhangsan.setPet(tomcatPet());
        return zhangsan;
    }

    @Bean("tom22")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

public static void main(String[] args) {
        //1、返回我们IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

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

        boolean tom = run.containsBean("tom");
        System.out.println("容器中Tom组件:"+tom);

        boolean user01 = run.containsBean("user01");
        System.out.println("容器中user01组件:"+user01);

        boolean tom22 = run.containsBean("tom22");
        System.out.println("容器中tom22组件:"+tom22);


    }

2.原生配置文件引入@ImportResouce注解

例如:由于很多在项目中使用了xml方式创建Bean对象,所以使用@ImportRResource注解,引入xml文件

示例:

需要使用xml的类上添加该注解引入bean创建

@ImportResource("classpath:bean.xml")
public class MyConfig {}

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user1" class="com.haikang.boot.pojo.User">
        <property name="name" value="海康"/>
        <property name="age" value="21"/>
    </bean>
</beans>

测试:

@SpringBootApplication(scanBasePackages={"com.haikang"})// 这个注解等同下面三个注解
//@SpringBootConfiguration
//@EnableAutoConfiguration
//@ComponentScan("com.haikang")
public class MainApplication {
    // 表示是程序的入口
    public static void main(String[] args) {
        // 获取 Spring 容器的IOC
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
  
        // 测试:@ImportResource注解
        User user1 = run.getBean("user1", User.class);
        System.out.println(user1);
        // 返回值:User{name='海康', age=21, pet=null}
    }
}

3.配置绑定@ConfigurationProperties注解

注意配置信息一定要放在主配置文件中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A6aT4zGT-1655553478296)(img\1654257348479.png)]

配置绑定就是读取properties配置文件中内容,完成相关配置,如:数据库连接等

如何使用java读取到properties配置文件内容,并且把它封装到JavaBean

配置绑定方式一:@ConfigurationProperties注解+@Component注解

需要配置绑定的类必须在容器中,使用@Component注解标识目的就是让容器创建该类对象

示例:

主配置文件中配置信息

#配置绑定演示
mycar.brand="EEJE"
mycar.price=888888

在需要配置绑定类上添加@ConfigurationProperties@Component注解

/**
 * @Component表示将该类,让容器创建对象
 * 只有在容器中的组件,才会拥有SpringBoot提供的强大功能
 */
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
    private String brand;
    private Integer price;
    
 	提供seting和geting及toString
    有参构造器和无参构造器
 }

测试

@RestController
public class WordController {
    @Autowired
    private Car car;

    //测试配置绑定
    @RequestMapping("/car")
    public Car car(){
        return car;
    }
}

页面显示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EP8HIcDY-1655553478298)(img\1654257746000.png)]

配置绑定方式二:@ConfigurationProperties注解+@EnableConfigurationProperties注解

注意是:一定要在配置类上添加@EnableConfigurationProperties注解,并且配置信息要写在主配置文件中,使用场景是使用第三方类

示例:

主配置文件中配置信息

#配置绑定演示
mycar.brand="EEJE"
mycar.price=888888

在需要配置绑定类上添加@ConfigurationProperties

@ConfigurationProperties(prefix = "mycar")
public class Car {
    private String brand;
    private Integer price;
    
 	提供seting和geting及toString
    有参构造器和无参构造器
 }

配置类中添加@EnableConfigurationProperties注解,表示开启配置绑定

@Configuration(proxyBeanMethods = true)
@EnableConfigurationProperties(Car.class)// 传入需要开启Car配置绑定功能类字节码
/**
 * @EnableConfigurationProperties注解作用
 * 1.开户Car配置绑定功能
 * 2.把这个Car这个组件自动注册到容器中【就是将Car在容器中创建对象】
 */
public class MyConfig {
}

测试

@RestController
public class WordController {
    @Autowired
    private Car car;

    //测试配置绑定
    @RequestMapping("/car")
    public Car car(){
        return car;
    }
}

说明了:@EnableConfigurationProperties(Car.class) ----> @ConfigurationProperties(prefix = "mycar") ----> application.properties三者之间建立了,关系,我们只需要修改application.properties配置文件中的内容,就是可以修改掉相关配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值