java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot Bean注解方法

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

作者:零维展开智子

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

您可能感兴趣的文章:
阅读全文