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


相关文章
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
861 0
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
8月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
290 0
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
864 2
|
9月前
|
Java Maven 开发者
编写SpringBoot的自定义starter包
通过本文的介绍,我们详细讲解了如何创建一个Spring Boot自定义Starter包,包括自动配置类、配置属性类、`spring.factories`文件的创建和配置。通过自定义Starter,可以有效地复用公共配置和组件,提高开发效率。希望本文能帮助您更好地理解和应用Spring Boot自定义Starter,在实际项目中灵活使用这一强大的功能。
695 17
|
8月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——拦截自定义异常
本文介绍了在实际项目中如何拦截自定义异常。首先,通过定义异常信息枚举类 `BusinessMsgEnum`,统一管理业务异常的代码和消息。接着,创建自定义业务异常类 `BusinessErrorException`,并在其构造方法中传入枚举类以实现异常信息的封装。最后,利用 `GlobalExceptionHandler` 拦截并处理自定义异常,返回标准的 JSON 响应格式。文章还提供了示例代码和测试方法,展示了全局异常处理在 Spring Boot 项目中的应用价值。
371 0
|
11月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
1731 15
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
本文介绍了Spring Boot中静态资源的访问位置、如何进行静态资源访问测试、自定义静态资源路径和静态资源请求映射,以及如何处理自定义静态资源映射对index页面访问的影响。提供了两种解决方案:取消自定义静态资源映射或编写Controller来截获index.html的请求并重定向。
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
|
12月前
|
安全 Java 应用服务中间件
如何将Spring Boot应用程序运行到自定义端口
如何将Spring Boot应用程序运行到自定义端口
919 0
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
429 2