iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBootBean花式注解方法示例上篇
  • 664
分享到

SpringBootBean花式注解方法示例上篇

SpringBootBean装配注解SpringBootBean注解方法 2023-02-10 12:02:16 664人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1.XML方式声明2.注解法@Component3.完全注解式4.简化注解@Import1.XML方式声明 这里我举两个例子,一个是自定义的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注解方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBootBean花式注解方法示例上篇

本文链接: https://www.lsjlt.com/news/195528.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作