SpringBoot Bean花式注解方法示例上篇

 更新时间:2023年02月10日 11:03:54   作者:零维展开智子  
这篇文章主要介绍了SpringBoot Bean花式注解方法,很多时候我们需要根据不同的条件在容器中加载不同的Bean,或者根据不同的条件来选择是否在容器中加载某个Bean

1.XML方式声明

这里我举两个例子,一个是自定义的bean,另一个是第三方bean,这样会全面一些。

你还可以定义这个bean的模式,有单例模式和多例模式,prototype代表多例,singleton代表单例。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">
        <bean class="yi.beans.Cat" id="cat" scope="prototype"/>
        <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource" scope="singleton"/>
</beans>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        String[] names = context.getBeanDefinitionNames();  //获取所有的beam名字
        for (String name : names) {
            System.out.println(name);
        }
    }
}

2.注解法@Component

第一种方式配置起来太复杂了,而且也不够灵活。

同样我也会拿自定义bean和第三方bean来举例子。

import lombok.Data;
import org.springframework.stereotype.Component;
@Component("Tom")
@Data
public class Cat {
}

注解法也是可以指定id的。

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = true)   //默认为true,代表从IOC容器中取对象
public class Dbconfig {
    @Bean
    public DruidDataSource source(){
        DruidDataSource dataSource=new DruidDataSource();
        return dataSource;
    }
}

对于第三方bean,我们没有办法直接给其加注解,就需要用配置类来书写,其中@Configuration和@Component几乎一模一样,不过其可以通过参数来指定是否生成新的bean对象还是直接从IOC容器里面拿原先的。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">
        <context:component-scan base-package="yi.beans,yi.config"/>
</beans>

扫描的时候可以通过逗号来分割开多个包。

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        String[] names = context.getBeanDefinitionNames();  //获取所有的beam名字
        for (String name : names) {
            System.out.println(name);
        }
    }
}

其中bean的name就是其id,没有的话就是它的类名或者方法名首字母小写。

中间那些我们暂时不做讨论。

Tom就是自定义的bean,dbconfig就是配置类的bean,source就是第三方bean。

3.完全注解式

第二种其实还没有完全做到全注解,其在扫描的时候还是需要书写xml,还是不够灵活。

我们需要在扫描的时候也由注解来安排。

import lombok.Data;
import org.springframework.stereotype.Component;
@Component("miao")
@Data
public class Cat {
}
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = true)   //默认为true,代表从IOC容器中取对象
public class Dbconfig {
    @Bean
    public DruidDataSource source(){
        DruidDataSource dataSource=new DruidDataSource();
        return dataSource;
    }
}
import org.springframework.context.annotation.ComponentScan;
@ComponentScan({"yi.config","yi.beans"})
public class ZConfig {
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App1 {
    public static void main(String[] args) {
        ApplicationContext context=new AnnotationConfigApplicationContext(ZConfig.class);
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

可以看到我们现在已经完全不需要xml文件了耶。

不过还有个问题,如果就是说我们想把一个比较远古的项目以前是xml配置的,现在要改为注解式怎末办呢?这里有一个注解。

可以建一个总的配置类。

import org.springframework.context.annotation.ImportResource;
@ImportResource("spring-config.xml")
public class ZConfig {
}

小插曲-工厂式定义

这种方式可以在bean被加载前对其进行一些操作。

import lombok.Data;
@Data
public class Dog {
}
import org.springframework.beans.factory.FactoryBean;
import yi.beans.Dog;
public class DogFactory implements FactoryBean<Dog> {
    @Override
    public Dog getObject() throws Exception {
        Dog dog=new Dog();
        //可以进行一些setter操作
        return dog;
    }
    @Override
    public Class<?> getObjectType() {
        return Dog.class;
    }
    @Override
    public boolean isSingleton() {    //是否为单例模式
        return true;
    }
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import yi.beans.factory.DogFactory;
@Configuration(proxyBeanMethods = true)   //默认为true,代表从IOC容器中取对象
public class Dbconfig {
    @Bean
    public DogFactory dog(){
        DogFactory dogFactory = new DogFactory();
        return dogFactory;
    }
}

这种算是比较像第三方bean的加载了,不过也不完全一样,它的bean类型不是方法的返回值类型,而是实际工厂类造出来的bean类型。因为工厂类不会自己造自己的。

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import yi.beans.Dog;
import yi.config.Dbconfig;
public class App1 {
    public static void main(String[] args) {
        ApplicationContext context=new AnnotationConfigApplicationContext(Dbconfig.class);
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
        Dog dog = context.getBean("dog", Dog.class);
        System.out.println(dog.getClass());
    }
}

4.简化注解@Import

这种方式也是在我们读源代码是最常见的一种bean定义方式。

自定义bean,这里无需使用@Component来声明了。

import lombok.Data;
@Data
public class Dog {
}

第三方定义的bean,我们也不需要使用@Configuration来声明了。

import org.springframework.context.annotation.Import;
@Import({Dbconfig.class,Dog.class})
public class ZConfig {
}

这里再导入字节码文件时没有路径,注意导包不要导错。

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App1 {
    public static void main(String[] args) {
        ApplicationContext context=new AnnotationConfigApplicationContext(ZConfig.class);
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

可以看到最后面的那两个就是,前两个是类对象,他们也被定义为bean加载进IOC容器了,不过一般不会使用。

到此这篇关于SpringBoot Bean花式注解方法示例上篇的文章就介绍到这了,更多相关SpringBoot Bean注解方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JVM指令的使用深入详解

    JVM指令的使用深入详解

    这篇文章主要给大家介绍了关于JVM指令使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • redisson特性及优雅实现示例

    redisson特性及优雅实现示例

    这篇文章主要为大家介绍了redisson特性及优雅实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • spring @Profiles和@PropertySource实现根据环境切换配置文件

    spring @Profiles和@PropertySource实现根据环境切换配置文件

    这篇文章主要介绍了spring @Profiles和@PropertySource根据环境切换配置文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring Boot 3.x 集成 Eureka Server/Client的详细过程

    Spring Boot 3.x 集成 Eureka Server/Cl

    随着SpringBoot 3.x版本的开发尝试,本文记录了在集成Eureka Server/Client时所遇到的问题和解决方案,文中详细介绍了搭建服务、配置文件和测试步骤,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • 查找native方法的本地实现函数native_function详解

    查找native方法的本地实现函数native_function详解

    JDK开放给用户的源码中随处可见Native方法,被Native关键字声明的方法说明该方法不是以Java语言实现的,而是以本地语言实现的,Java可以直接拿来用。这里介绍下查找native方法的本地实现函数native_function,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • 如何彻底删除SVN中的文件和文件夹(附恢复方法)

    如何彻底删除SVN中的文件和文件夹(附恢复方法)

    在SVN中如果删除某个文件或文件夹也可以在历史记录中进行找回,有的时候需要彻底删除某些文件,即不希望通过历史记录进行恢复,需要在服务器上对SVN的数据进行重新整理
    2014-08-08
  • Jmeter固定定时器的使用详解

    Jmeter固定定时器的使用详解

    jmeter提供了多种定时器以便于我们进行接口的测试,你知道jmeter提供的定时器有哪些吗,本文就详细的介绍了Jmeter固定定时器的使用,感兴趣的可以了解一下
    2021-11-11
  • 解决Spring导出可以运行的jar包问题

    解决Spring导出可以运行的jar包问题

    最近需要解决Maven项目导入可执行的jar包的问题,如果项目不包含Spring,那么使用mvn assembly:assembly即可,这篇文章主要介绍了Spring导出可以运行的jar包,需要的朋友可以参考下
    2023-03-03
  • Java中内核线程理论及实例详解

    Java中内核线程理论及实例详解

    在本篇文章里小编给大家整理了一篇关于Java中内核线程理论及实例详解内容,有兴趣的朋友们可以学习下。
    2021-03-03
  • Java中的Set集合简单汇总解析

    Java中的Set集合简单汇总解析

    这篇文章主要介绍了Java中的Set集合简单汇总解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论