SpringBoot原理篇:bean的3种加载方法使用、8种bean的加载方式一览

目录

准备工作

一 使用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

四 bean的加载方式8种


准备工作

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();
    }
}

xml和注解同时使用请看这里

四 bean的加载方式8种

 关于第45678种方式,可以点下面的链接看

4 import导入bean类

5 register方法

6 ImportSelector

7 ImportBeanDefinitionRegistrar

8 BeanDefinitionRegistryPostProcessor

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
springboot启动报错 "Error creating bean with name" 是一个常见的错误信息,它通常表示在创建 bean(组件)时出现了问题。这个错误信息往往会伴随着更具体的错误信息和堆栈跟踪。 要解决这个问题,你可以尝试以下几个步骤: 1. 检查错误信息:查看完整的错误消息和堆栈跟踪,尤其是在 "Error creating bean with name" 行之后的信息。这些信息可以帮助你确定具体是哪个 bean 出现了问题,以及它的创建过程中可能存在的错误。 2. 检查依赖关系:如果你的 bean 之间存在依赖关系,确保这些依赖项正确配置和注入。检查注入的方式(如 @Autowired、@Resource)是否正确,并确保被依赖的 bean 已经正确定义和初始化。 3. 检查配置文件:如果你在配置文件中定义了 bean,确保配置没有错误,并且与实际代码中的定义一致。检查配置文件的路径、键名、值等,确保没有拼写错误或者其他语法问题。 4. 检查包扫描路径:如果你使用了自动扫描组件的方式(如 @ComponentScan),确保扫描路径正确,并且能够包含到需要创建的 bean。 5. 检查依赖版本:有时候,不同的依赖版本之间可能存在冲突,导致 bean 创建失败。尝试升级或降级相关的依赖版本,以解决可能的冲突问题。 如果以上步骤无法解决问题,建议提供完整的错误信息和代码,以便更准确地定位问题并提供帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值