Springboot中自定义组件

简介: Springboot中自定义组件

1、@configuration+@bean注入组件

spring是是通过xml给容器添加组件的,在Springboot可以通过@configuration配置类的方式添加组件

@Configuration //告诉boot这是一个配置类,相当于Spring中的配置文件
public class MyConfig {
     /**
     *1、通过配置类给容器添加组件 方法名作为组件的id返回类型就是组件的类型 返回的值就是组件在容器中的实列
     *2、如果不想让方法名作为组件id 可以在bean注解中传参
     *3、无论对这个方法调用多少次 获取到的都是之前注册进容器中的单实例对象
     * @Bean("testUser")
     */
    @Bean
    public User demoUser(){
        return new User("回去吧三哥",18);
    }
}

查看容器中注入的组件

@SpringBootApplication
public class DemoApplication {
 
    public static void main(String[] args) {
        //返回我们的容器
        ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
 
        //2.查看容器里的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}
fastJsonpResponseBodyAdvice
demoUser
restTemplate
simpleClientHttpRequestFactory
org.springframework.boot.autoconfigure.AutoConfigurationPackages
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
propertySourcesPlaceholderConfigurer

并且我们注入的组件在容器中是单例的,测试如下

@SpringBootApplication
public class DemoApplication {
 
    public static void main(String[] args) {
        //返回我们的容器
        ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
        //精确获取组件
        User user1 = run.getBean("demoUser", User.class);
        User user2 = run.getBean("demoUser", User.class);
        System.out.println(user1==user2);//打印true
    }
}

注意:配置类本身也是一个组件

@SpringBootApplication
public class DemoApplication {
 
    public static void main(String[] args) {
        //返回我们的容器
        ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
        //精确获取组件
        MyConfig myConfig = run.getBean(MyConfig.class);
        System.out.println(myConfig);
        //使用
        User user = myConfig.demoUser();
        System.out.println(user);
    }
}
 
 
com.common.config.MyConfig$$EnhancerBySpringCGLIB$$3ef8885e@1999e1f5
com.user.User@b1fa523

boot2版本对于Configuration注解新增了一个属性proxyBeanMethods,默认是true;会使用代理对象调用组件方法,boot总会检查容器中是否有这个容器,即保持组件单实例

@Configuration(proxyBeanMethods = true)
public class MyConfig {
    @Bean
    public User demoUser(){
        return new User("回去吧三哥",18);
    }
}
 
 
//打印true
 
@SpringBootApplication
public class DemoApplication {
 
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
        MyConfig myConfig = run.getBean(MyConfig.class);
        User user = myConfig.demoUser();
        User user1 = myConfig.demoUser();
        System.out.println(user==user1);//true
    }
}

如果改为false

@Configuration(proxyBeanMethods = false)
public class MyConfig {
    @Bean
    public User demoUser(){
        return new User("回去吧三哥",18);
    }
}
 
 
//打印true
 
@SpringBootApplication
public class DemoApplication {
 
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
        MyConfig myConfig = run.getBean(MyConfig.class);
        User user = myConfig.demoUser();
        User user1 = myConfig.demoUser();
        System.out.println(user==user1);//false
    }
}

上面两种方式就是boot2中的底层配置的两种方式,主要用来解决组件依赖,

Full(全配置),即增加proxyBeanMethods = true;如果注册的组件在别组件会用到,那就设置为true 保证单实例;

Lite(轻量级),即增加proxyBeanMethods = false;如果注册的组件在别组件不会用到,那就设置为false 减少判断 加快启动

2、@Controller @Service @Repository @Component注入组件

除了上面的@Configuration+@bean方式给容器注入一个组件,还可使用@Controller @Service @Repository @Component结合@bean注入组件

3、另外也可用@Import注册组件,但是要放在标有

@Configuration、@Controller、 @Service、 @Repository、 @Component注解标识的类上

@Import({User.class})
@Configuration
public class MyConfig {
    public User demoUser(){
        return new User("回去吧三哥",18);
    }
}
@SpringBootApplication
public class DemoApplication {
 
    public static void main(String[] args) {
        //返回我们的容器
        ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
 
        String[] beans = run.getBeanNamesForType(User.class);
        for (String name  : beans) {
            System.out.println(name);//com.user.User
        }
    }
}

4、根据条件注册组件

案例一:用在方法上

@Configuration
public class MyConfig {
    @ConditionalOnBean(name = "tom")//只有容器中有tom这个组件,才会注入demoUser组件
    @Bean
    public User demoUser(){
        return new User("回去吧三哥",18);
    }
}

案例二:用在类上

@Configuration
@ConditionalOnBean(name = "tom")//只有容器中有tom这个组件,才会注入demoUser组件和testUser组件
public class MyConfig {
    @Bean
    public User demoUser(){
        return new User("回去吧三哥",18);
    }
    @Bean
    public User testUser(){
        return new User("回去吧三哥",18);
    }
}


相关文章
|
18天前
|
缓存 监控 Java
造轮子能力大提升:基于SpringBoot打造高性能缓存组件
在快节奏的软件开发领域,"不重复造轮子" 常常被视为提高效率的金科玉律。然而,在某些特定场景下,定制化的高性能缓存组件却是提升系统性能、优化用户体验的关键。今天,我们将深入探讨如何利用SpringBoot框架,从零开始打造一款符合项目需求的高性能缓存组件,分享我在这一过程中的技术心得与学习体会。
41 6
|
1月前
|
SQL JavaScript 前端开发
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
这篇文章详细介绍了如何在Vue.js中使用分页组件展示从数据库查询出来的数据,包括前端Vue页面的表格和分页组件代码,以及后端SpringBoot的控制层和SQL查询语句。
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
|
1月前
|
Java 数据安全/隐私保护 Spring
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
|
1月前
|
JSON 安全 Java
|
22天前
|
监控 安全 Java
【开发者必备】Spring Boot中自定义注解与处理器的神奇魔力:一键解锁代码新高度!
【8月更文挑战第29天】本文介绍如何在Spring Boot中利用自定义注解与处理器增强应用功能。通过定义如`@CustomProcessor`注解并结合`BeanPostProcessor`实现特定逻辑处理,如业务逻辑封装、配置管理及元数据分析等,从而提升代码整洁度与可维护性。文章详细展示了从注解定义、处理器编写到实际应用的具体步骤,并提供了实战案例,帮助开发者更好地理解和运用这一强大特性,以实现代码的高效组织与优化。
34 0
|
2月前
|
消息中间件 Java Kafka
Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
78 5
|
2月前
|
Java Spring 容器
Spring boot 自定义ThreadPoolTaskExecutor 线程池并进行异步操作
Spring boot 自定义ThreadPoolTaskExecutor 线程池并进行异步操作
64 3
|
1月前
|
Java UED
基于SpringBoot自定义线程池实现多线程执行方法,以及多线程之间的协调和同步
这篇文章介绍了在SpringBoot项目中如何自定义线程池来实现多线程执行方法,并探讨了多线程之间的协调和同步问题,提供了相关的示例代码。
177 0
|
1月前
|
Java 数据安全/隐私保护
SpringBoot 自定义初始化任务 Runner
SpringBoot 自定义初始化任务 Runner
10 0
|
1月前
|
Java Spring
Spring Boot Admin 自定义健康检查
Spring Boot Admin 自定义健康检查
23 0