【Spring】使用@Bean和@Import注解配置Bean,与Bean的实例化

这篇具有很好参考价值的文章主要介绍了【Spring】使用@Bean和@Import注解配置Bean,与Bean的实例化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、bean是什么

2、配置bean

2.1、使用@Bean注解配置Bean

2.2、使用@Import注解配置Bean

 3、实例化Bean

import和bean,spring,java,后端,笔记,idea

1、bean是什么

        在 Spring 中,Bean 是指由 Spring 容器管理的对象。Spring IOC 容器负责创建、配置和管理这些 Bean 对象的生命周期。Spring IOC 容器会管理应用程序中的组件,并通过依赖注入(DI)将它们组装在一起。Bean 是应用程序的核心构建块,它们通常代表应用程序中的各种对象,例如服务、数据访问对象(DAO)、控制器等。

        要在 Spring 中使用 Bean,通常需要在 Spring 配置文件(如 XML 文件)或使用注解(@Component)来声明 Bean,并告诉 Spring 容器如何创建和配置它们。一旦 Bean 被声明和配置好,Spring 容器将负责实例化它们,并在需要时将它们注入到其他 Bean 中。

        简单来说就是:在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是由Spring IoC 容器实例化、组装和管理的对象。

import和bean,spring,java,后端,笔记,idea 

2、配置bean

        配置bean可以通过在 xml 文件中用 <bean class=""> 这个标签的方式来进行显式的声明,但是这种方式太麻烦了。

        所以现在都是通过 @component注解 来把类配置成bean,在类级别上使用 @Component 注解或其派生注解(@Service、@Repository、@Controller 等)就可以将一个类声明为 Bean

        这两种配置方式可以看这一篇:【Spring】分别基于XML、注解和配置类实现Spring的IOC(控制反转)-CSDN博客

这里主要是使用@Bean和@Import注解配置Bean

2.1、使用@Bean注解配置Bean

@Bean 特性:

一、是放在方法上面的

二、必须放在配置类里面

        @Bean方法调用另外一个@Bean方法,会从spring容器中去获取

import和bean,spring,java,后端,笔记,idea

三、@Bean可以干预bean的实例化过程的,而且jar包中的类如果要配置bean就需要用@Bean

四、在这个方法中声明的参数,spring也会帮我们自动注入进来

import和bean,spring,java,后端,笔记,idea

相关代码:

//接口IUserDao
public interface IUserDao {
    //执行查询用户
    void getUser();
}


//接口IUserDao的实现类UserDao
public class UserDao implements IUserDao {
    @Override
    //执行查询用户
    public void getUser() {
        System.out.println("Holle Spring");
    }
}


//接口IUserService
public interface IUserService {
    void getUser();
}


//接口IUserService的实现类UserService
//@Service
public class UserService implements IUserService {

    @Autowired
    IUserDao userDao;
    @Override
    public void getUser() {
        userDao.getUser();
    }
}


//配置类SpringConfig
@Configuration
public class SpringConfig {

    @Bean  //使用@Bean配置UserService成为bean
    public IUserService userService(){
        IUserDao userDao = UserDao();
        UserService userService = new UserService();
        return userService;
    }

    @Bean  //使用@Bean配置UserDao成为bean
    public IUserDao UserDao(){
        return new UserDao();
    }
}


//测试类C3IocApplicationTests
@SpringBootTest
class C3IocApplicationTests {
    @Autowired
    IUserService userService;

    @Test
    void contextLoads() {
        userService.getUser();
    }
}

2.2、使用@Import注解配置Bean

@lmport 特性:

一、@lmport必须写在类上面,不能用于方法等其他的上面

二、标记的类必须是一个bean,否则不会起作用

 @lmport的三种使用方式

(1)普通类:就是直接@lmport(UserService.class)普通类,就会把这个普通类注入spring

示例:

import和bean,spring,java,后端,笔记,idea

(2)lmportSelector :用于根据完整限定名字符串批量注入Bean

        a、定义一个类实现lmportSelector

        b、批量注册bean(通过实现selectlmports,返回bean的完整类路径字符串数组)

        c、然后在配置类上加上@lmport(实现lmportSelector.class)

示例:

import和bean,spring,java,后端,笔记,idea 

其他代码和上面使用@Bean的例子是一样的,实现了 ImportSelector 接口的 MyImportSelector 类代码:

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{
            "com.lt.ioc.service.UserService",
            "com.lt.ioc.dao.UserDao"
        };
    }
}

(3)ImportBeanDefinitionRegistrar

        定义一个类实现lmportBeanDefinitionRegistrar,然后在方法里根据beanDefinition注册bean

示例:和上面的 lmportSelector 用法一样,把实现了 ImportBeanDefinitionRegistrar 接口的类传递给@Import注解就可以

实现了 ImportBeanDefinitionRegistrar 接口的 MyImportBeanDefinitionRegistrar 类代码:

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
        //创建BeanDefinition,只有这个类的BeanDefinition存在了,才能根据这个BeanDefinition去创建类的bean对象
        RootBeanDefinition definition = new RootBeanDefinition();
        //把要创建bean的类的完整限定名传递给BeanDefinition
        definition.setBeanClassName("com.lt.ioc.service.UserService");
        //注册这个BeanDefinition
        registry.registerBeanDefinition("userService",definition);
    }
}

 3、实例化Bean

1、spring会默认使用无参构造器(无参构造函数)实例化

  • 有多个构造函数依然会调用无参构造函数
  • 如果只有一个有参构造函数,spring就会调用这个有参构造函数,并且把参数自动装配进来
  • 如果有参构造函数有个多个,并且没有无参构造函数,那就会报错,因为spring不知道该选哪一个构造函数,这时候对spring来说,他需要一个默认的无参构造函数

2、使用实例工厂方法实例化--@Bean

  • 可以自由的选择构造函数进行实例化

 

3、使用工厂Bean。实例化--FactoryBean

  • FactoryBean是一个接口
  • 需要有一个Bean,一旦这个Bean实现FaétoryBean就成为了特殊的Bean
  • 需要实现2个方法

        1)getObject() ---->当通过Bean实际名称获取到的就是getObject 返回的对象(伪装)

        2)getObjecType()---->想通过容器去获取对应(getObject 返回的对象)的类型,就需要返回getObject 返回的对象的类型

  • 可以自由的选择构造函数进行实例化

示例:

import和bean,spring,java,后端,笔记,idea

OrderService类是加了@Service注解并且实现了FactoryBean接口的一个类,代码:

@Service
public class OrderService implements FactoryBean {
    // 加了@Service注解并且实现了FactoryBean接口的OrderService变成了一个特殊的bean
    // 特殊: 就是根据bean(这里是OrderService)的名字实际上是获取getObject方法返回的对象(狸猫换太子)
    @Override
    public Object getObject() throws Exception {//(这里getObject方法中返回的对象就是UserService)
        return new UserService();
    }

    @Override
    public Class<?> getObjectType() {//想通过容器去获取对应(getObject 返回的对象)的类型,就需要返回getObject返回的对象的类型
        return UserService.class;
    }
}

获取容器,并分别通过FactoryBean接口中的两种方法从容器中获取UserService的bean和获取实现了FactoryBean接口的OrderService实际的Bean

//启动类C3IocApplication
@SpringBootApplication
public class IocApplication {

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

        //OrderService是加了@Service注解并且实现了FactoryBean接口的一个类,他是一个特殊的bean
        System.out.println(ioc.getBean("orderService"));//通过OrderService中重写了的getObject()方法来获取UserService的bean
        System.out.println(ioc.getBean(UserService.class));//通过OrderService中重写了的getObjectType()方法来获取UserService的bean
        //如果想获取FactoryBean实际的Bean可以 1.通过类型; 2.在beanName前加上&
        System.out.println(ioc.getBean(OrderService.class));
        System.out.println(ioc.getBean("&orderService"));
    }

}

import和bean,spring,java,后端,笔记,idea

import和bean,spring,java,后端,笔记,idea

推荐: 

【Spring】分别基于XML、注解和配置类实现Spring的IOC(控制反转)-CSDN博客https://blog.csdn.net/m0_65277261/article/details/137237805?spm=1001.2014.3001.5501

 【java多线程】通过等待唤醒机制、局部变量、原子变量实现线程同步-CSDN博客https://blog.csdn.net/m0_65277261/article/details/137122461?spm=1001.2014.3001.5501

【java多线程】通过等待唤醒机制、局部变量、原子变量实现线程同步-CSDN博客https://blog.csdn.net/m0_65277261/article/details/137122461?spm=1001.2014.3001.5501文章来源地址https://www.toymoban.com/news/detail-851868.html

到了这里,关于【Spring】使用@Bean和@Import注解配置Bean,与Bean的实例化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring系列二:基于注解配置bean【建议收藏】

    上文中, 我们学习到了 Spring系列一:spring的安装与使用 接下来我们学习, 通过XML配置bean Bean管理包括两方面: 创建bean对象, 给bean注入属性 案例: 通过spring的ioc容器, 获取一个bean对象, 获取方式: 按类型. 演示通过bean的类型获取对象 细节 按照类型获取bean, 要求ioc容器中的同一个

    2024年02月14日
    浏览(41)
  • Spring使用注解管理Bean

    引入lib包 Spring对Bean管理的常用注解 @Component组件(作用在类上) Spring中提供了@Component的三个衍生注解:(功能在目前为止是一致的) @Controller WEB层 @Service 业务层 @Repository 持久层 属性注入的注解:(使用注解注入的方式,可以不用提供set方法) @Value  用于注入普通类型 @Autowired  自动装

    2024年01月17日
    浏览(38)
  • Spring使用注解存储Bean对象

    在前一篇博客中( Spring项目创建与Bean的存储与读取(DL))介绍的是通过配置文件注册对象从而存储到 Spring 中,这种方式其实还是挺繁琐的。 实际上,在使用学习使用 Spring过程中,当我们要实现一个功能的时候,先应该考虑的是有没有相应的注解是实现对应功能的,Spring 中

    2024年02月16日
    浏览(36)
  • Spring注解驱动开发之常用注解案例_告别在XML中配置Bean

    注解驱动开发就是不再使用Spring的bean.xml文件,改为纯使用注解的方式开发 @Configuration 此注解为配置类注解,相当于spring.xml文件,即配置类==配置文件 @Bean 给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id 示例 Person类(后续注解配置类中都会以此类举例),

    2024年01月21日
    浏览(45)
  • 【Spring】使用注解读取和存储Bean对象

     哈喽,哈喽,大家好~ 我是你们的老朋友: 保护小周ღ    谈起Java 圈子里的框架,最年长最耀眼的莫过于 Spring 框架啦,本期给大家带来的是:  将对象存储到 Spring 中、Bean 对象的命名规则、从Spring 中获取bean 对象、注入的、@Autowired 与 @Resource 的区别、解决@Bean 方

    2024年02月13日
    浏览(42)
  • 【Spring】(三)Spring 使用注解存储和读取 Bean对象

    前面的文章详细的介绍了 Spring 对象的创建,以及对 Bean 对象的存取操作,但是通过配置文件注册 Bean 对象以及使用 ApplicationContext 或 BeanFactory 的方式获取 Bean 对象的操作就显得格外的复杂。因此,本文主要就是详细介绍了一种更加简单的方式来实现对 Bean 对象更加简单的储

    2024年02月14日
    浏览(33)
  • 使用Spring的五大类注解读取和存储Bean

    目录 1.存储Bean对象的注解 1.1 五大类注解 1.2 方法注解 1.3添加注解的依赖 2.注解的使用 2.1  controller注解 2. 2Service注解  2.3.Resopsitory注解 2.4Component注解 2.5Configuration注解 2.6 注解之间的关系 3.方法注解 3.1 方法注解要配合类注解来使用。 3.2 重命名Bean 4.获取Bean对象(对象装配

    2024年02月01日
    浏览(38)
  • 【Spring框架全系列】方法注解@Bean的使用

    📬📬哈喽,大家好,我是小浪。上篇博客我们介绍了五大类注解的使用方法,以及如何解决Spring使用五大类注解生成bean-Name的问题;那么,谈到如何更简单的读取和存储对象,这里我们还需要介绍另外一个\\\"方法注解@Bean\\\"的使用,快来一起学习叭!🛳🛳 📲目录 一、如何使

    2024年02月04日
    浏览(38)
  • 【Spring篇】讲解Bean的三种配置和实例化方法

    🎊专栏【Spring】 🍔喜欢的诗句:天行健,君子以自强不息。 🎆音乐分享【如愿】 🎄欢迎并且感谢大家指出小吉的问题🥰 在Spring框架中,Bean的配置和实例化是很重要的基础内容。掌握各种配置方式,才能灵活管理Bean对象。本文将全面介绍Bean的别名配置、作用范围配置,以及

    2024年02月08日
    浏览(48)
  • 一起学SF框架系列5.8-spring-Beans-Bean注解解析3-解析配置component-scan

    本文主要讲述Spring是如何解析“context:component-scan”元素,扫描加载目录下的BeanDefinition。 1、解析的元素如下: 注:该元素解析过程中,会自动处理“context:annotation-config/”元素要解析的内容。 2、只扫描加载目录下的BeanDefinition,不对注解进行解析。在AbstractApplicationContext.

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包