SpringBoot原理篇:bean的3种加载方法

目录

准备工作

一 使用xml方式定义bean

1 创建 spring config类型的配置文件

2 读取配置文件,获取bean

二 xml+注解方式定义bean

2.1 加载自己开发的bean

1 bean上加@Component注解  

 2 配置文件加上搜索bean的范围

3 范围内扫描获取bean

2.2 加载第三方的bean

1 创建一个配置类

2 配置文件加上搜索bean的范围

3 范围内扫描获取bean

三 使用全注解方式定义bean

1 写一个配置类把配置文件干掉

2 把bean放入spring容器

3 获取bean


准备工作

1 创建maven工程

(不选spring initializr,选maven)

2 添加 spring-context 的依赖

添加druid依赖是为了测试 定义第3方开发的bean

<!--    添加依赖-->
    <dependencies>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.9</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.6</version>
        </dependency>

    </dependencies>

3 创建bean


一 使用xml方式定义bean

1 创建 spring config类型的配置文件


    里面声明bean

 resources--applicationContext1.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">

<!--    xml的方式声明自己开发的bean-->
    <bean id="cat" class="com.qing.bean.Cat"/>
    <bean class="com.qing.bean.Dog"/>
    <bean class="com.qing.bean.Dog"/>

<!--    xml形式声明第3方开发的bean-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"/>
</beans>

2 读取配置文件,获取bean

package com.qing.app;

import com.qing.bean.Dog;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App1 {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext1.xml");
        Object cat = ctx.getBean("cat");
        System.out.println(cat);
//        Object dog = ctx.getBean(Dog.class);
//        System.out.println(dog);
        System.out.println("==========");
        String[] names = ctx.getBeanDefinitionNames();
        for (String name: names) {
            System.out.println(name);
        }

    }
}

 结果

 备注: #0  #1 ,是因为 没给配置文件里的bean起id, spring自动给了他名字,然后为了区分加了 #0  #1 编号 

总结

二 xml+注解方式定义bean

2.1 加载自己开发的bean

1 bean上加@Component注解  

package com.qing.bean;

import org.springframework.stereotype.Component;

//即id为"jerry"的bean
@Component("jerry")
public class Mouse {

}
package com.qing.bean;

import org.springframework.stereotype.Service;

@Service
public class Cat {
}


 2 配置文件加上搜索bean的范围

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

<!--    指定加载bean的位置 component-->

    <context:component-scan base-package="com.qing.bean"/>

</beans>


   

3 范围内扫描获取bean

package com.qing.app;

import com.qing.bean.Cat;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App2 {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext2.xml");
        Object jerry = ctx.getBean("jerry");
        System.out.println(jerry);
        Object cat = ctx.getBean(Cat.class);
        System.out.println(cat);
        System.out.println("==========");
        String[] names = ctx.getBeanDefinitionNames();
        for (String name: names) {
            System.out.println(name);
        }

    }
}

结果

2.2 加载第三方的bean

1 创建一个配置类


        加@Configuration注解
        写一个方法返回第三方的bean

package com.qing.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Component
//备注:@Configuration 就是 @Component,他俩几乎没有区别
@Configuration
public class DBconfig {

    @Bean
    public DruidDataSource druidDataSource(){
        return new DruidDataSource();
    }
}

备注:@Bean → 注入当前方法的 返回值 ,存入spring 的IOC 容器中

2 配置文件加上搜索bean的范围

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

<!--    指定加载bean的位置 component-->

    <context:component-scan base-package="com.qing.bean,com.qing.config"/>

</beans>


3 范围内扫描获取bean

package com.qing.app;

import com.qing.bean.Cat;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App2 {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext2.xml");
        Object jerry = ctx.getBean("jerry");
        System.out.println(jerry);
        Object cat = ctx.getBean(Cat.class);
        System.out.println(cat);
        System.out.println("==========");
        String[] names = ctx.getBeanDefinitionNames();
        for (String name: names) {
            System.out.println(name);
        }

    }
}

结果

备注:@Configuration 就是 @Component,他俩几乎没有区别

总结:

三 使用全注解方式定义bean

1 写一个配置类把配置文件干掉

告诉spring扫描的范围

package com.qing.config;

import org.springframework.context.annotation.ComponentScan;

@ComponentScan({"com.qing.bean","com.qing.config"})
public class SpringConfig3 {
}


2 把bean放入spring容器

bean上加@Component注解 

or 创建一个配置类:加@Configuration注解,写一个方法返回第三方的bean

(同 二 xml+注解方式定义bean 一样,此处省略)


3 获取bean

 用这个new AnnotationConfigApplicationContext() 读取配置类    

package com.qing.app;

import com.qing.bean.Cat;
import com.qing.config.SpringConfig3;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App3 {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig3.class);
        Object jerry = ctx.getBean("jerry");
        System.out.println(jerry);
        Object cat = ctx.getBean(Cat.class);
        System.out.println(cat);
        System.out.println("==========");
        String[] names = ctx.getBeanDefinitionNames();
        for (String name: names) {
            System.out.println(name);
        }

    }
}


  结果

 如果是获取第三方的bean,两个配置类可以合在一起如下:

package com.qing.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan({"com.qing.bean","com.qing.config"})
public class SpringConfig3 {
    @Bean
    public DruidDataSource druidDataSource(){
        return new DruidDataSource();
    }
}

猜你喜欢

转载自blog.csdn.net/m0_45877477/article/details/125641426