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注解方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Bean装载方式代码实例解析

    Spring Bean装载方式代码实例解析

    这篇文章主要介绍了Spring Bean装载方式代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python爬虫之爬取2020女团选秀数据

    Python爬虫之爬取2020女团选秀数据

    本文将对比《青春有你2》和《创造营2020》全体小姐姐,鉴于两个节目的数据采集和处理过程基本相似,在使用Python做数据爬虫采集的章节中将只以《创造营2020》为例做详细介绍。感兴趣的同学可以照猫画虎去实操一下《青春有你2》的数据爬虫采集,需要的朋友可以参考下
    2021-04-04
  • Java遍历Properties所有元素的方法实例

    Java遍历Properties所有元素的方法实例

    这篇文章主要介绍了Java如何遍历Properties所有元素的方法,大家可以参考使用
    2013-11-11
  • java实现一个扫描包的工具类实例代码

    java实现一个扫描包的工具类实例代码

    很多框架,比如springmvc,mybatis等使用注解,为了处理注解,必然要对包进行扫描,所以下面这篇文章主要给大家分享介绍了关于利用java如何实现一个扫描包的工具类,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-10-10
  • java实现静默加载Class示例代码

    java实现静默加载Class示例代码

    这篇文章主要给大家介绍了关于java实现静默加载Class的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • 自定义注解和springAOP捕获Service层异常,并处理自定义异常操作

    自定义注解和springAOP捕获Service层异常,并处理自定义异常操作

    这篇文章主要介绍了自定义注解和springAOP捕获Service层异常,并处理自定义异常操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Springboot WebFlux集成Spring Security实现JWT认证的示例

    Springboot WebFlux集成Spring Security实现JWT认证的示例

    这篇文章主要介绍了Springboot WebFlux集成Spring Security实现JWT认证的示例,帮助大家更好的理解和学习使用springboot框架,感兴趣的朋友可以了解下
    2021-04-04
  • Spring Boot中使用LDAP来统一管理用户信息的示例

    Spring Boot中使用LDAP来统一管理用户信息的示例

    本篇文章主要介绍了Spring Boot中使用LDAP来统一管理用户信息的示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 分享几个Java工作中实用的代码优化技巧

    分享几个Java工作中实用的代码优化技巧

    这篇文章主要给大家分享几个Java工作中实用代码优化技巧,文章基于Java的相关资料展开对其优化技巧的分享,需要的小伙伴可以参考一下
    2022-04-04
  • 认识Java中的Stub与StubQueue

    认识Java中的Stub与StubQueue

    StubQueue是用来保存生成的本地代码的Stub队列,队列每一个元素对应一个InterpreterCodelet对象,InterpreterCodelet对象继承自抽象基类Stub,下面我们介绍一下StubQueue类及相关类Stub、InterpreterCodelet类和CodeletMark类。需要的的下伙伴可以参考下面文字内容
    2021-09-09

最新评论