纯注解开发bean

news2024/12/24 8:09:58

注解开发定义bean:@Controller:用于表现层bean定义;@Service:用于业务层bean定义;@Repository:用于数据层bean定义。

 我们先来完成数据层和业务逻辑层的注解

   数据层:

package org.example.dao.impl;

import org.example.dao.bookDao;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;

//@Repository
@Repository("bookDao5")
// 写上@Repository就相当于注解该类为bean,括号中写的是该bean的id属性

//@Scope("prototype")
public class bookDaoImpl5 implements bookDao {

    @Override
    public void save() {
        System.out.println("bookDao....");
    }
}

@Repository后面括号中填的是bean标签时的id值,当该实现类只有这一个bean时可以省略括号只写@Repository。

@Scope("prototype") 设置创造出来的对象不是单例。不写的话,默认是单例。

  业务层

package org.example.service.impl;

import org.example.dao.bookDao;
import org.example.service.bookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class bookServiceImpl5 implements bookService{

    @Autowired
    @Qualifier("bookDao5")
    bookDao bookDao;

    @Override
    public void save() {
        bookDao.save();
        System.out.println("bookService....");
    }
}

@Autowired :自动装配,写了该标签,就不用写set方法了,是基于反射创建对象并暴力反射。建议使用无参的构造方法

 @Qualifier("bookDao5"):如果依赖注入的bean有多个实现类,就采用按名称装配,然后加上该注解,括号中写的要进行配置的bean的名称,且该注解必须依赖上面那个@Autowire注解。

下面是对spring配置文件的处理:因为我们是纯注解开发,所以我们不要spring的配置文件,采用注解来设置。

  先创建一个config包,建一个springConfig的类

然后为该类配置@Configuration注解,写上这个注解就相当于把spring配置文件中的框架写好了,剩下的就是去定义我们需要的bean了。

因为我们前面在写数据层和业务层代码时已经分别给他们配置了bean标识的注解,我们只需要把数据层和业务层的bean告诉该配置类就可以了。

这时候就需要@ComponentScan("")注解了,这个注解用于扫描配置了注解的类的标签,该注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式:  ({"","",""})

package org.example.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
//写完上面的这个注解,就相当于把bean配置文件中的框架写好了
//该注解用于设定当前类为配置类

@ComponentScan("org.example")
//写了上面俩个注解,我们就可以不用写bean配置文件了

@PropertySource("jdbc2.properties")//想添加多个配置资源,用数组格式: ({"","",""})。其中配置名不能用通配符*,可以加上classpath
public class springConfig {
}

@PropertySource(""),用于添加其他资源的配置文件。想添加多个配置资源,用数组格式: ({"","",""})。其中配置名不能用通配符*,可以加上classpath。

下面是怎么用注解管理数据库连接池:

 我们需要在config包下创建一个专门用于管理数据库连接的类:

package org.example.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.example.dao.bookDao;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

public class JdbcConfig {

//简单类型数据
    @Value("com.mysql.cj.jdbc.Driver")
    private String driver;
    @Value("jdbc:mysql://localhost:3306/mysql")
    private String url;
    @Value("root")
    private String username;
    @Value("root")
    private String password;


    //定义一个方法来获取要管理的对象
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds=new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;
    }
}

 为方法添加@Bean注解,表示把该方法的返回值作为bean。

我们通过简单类型数据的注入将与数据库连接需要的数据传入给数据库连接池。

想传入引用类型的话,可以把引用类型作为方法的形参传入:

@Bean("dataSource2")
    public DataSource dataSource2(bookDao bookDao){
        System.out.println(bookDao);
        DruidDataSource ds=new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;
    }

 

 

这样数据库连接方面做好了,但是我们需要让springConfig配置类知道我们做的这个与数据库的连接,我们可以通过在springConfig配置类中添加@Import注解把该JdbcConfig类导入:

package org.example.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

import javax.sql.DataSource;

//加载第三方bean
@Configuration
@ComponentScan("org.example.dao")
@Import(JdbcConfig.class)
public class springConfig {

}

@Import(JdbcConfig.class):用于导入第三方资源的信息条件,该注解只允许写一次,多个资源的话,用数组形式。

我们在main方法中获取bean时,需要先获取springConfig配置类,然后通过通过配置类获取bean

package org.example.main;

import org.example.config.springConfig2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

public class thirdPartyAnnotate {
    public static void main(String[] args) {
        ApplicationContext act=new AnnotationConfigApplicationContext(springConfig2.class);
        //如果第三方数据库只有一个bean的话,可以省略前面引号中的bean的id值
        //DataSource dataSource = act.getBean(DataSource.class);
        DataSource dataSource = act.getBean("dataSource2",DataSource.class);
        System.out.println(dataSource);

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1407592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧博物馆信息化系统建设(3)

博物馆智能电子导览系统 IPAD智能化定制服务 系统采用的IPAD。使用者通过智能IPAD终端上的三维立体导图,可以在参观的同时,随时读取展馆平面地图以及展品相关信息,然后选择相关服务。简单操作便可获得文字、图片、声音以及视频资料展现给使用者。 游客通过该智能IPAD终端…

构建中国人自己的私人GPT—与文档对话

先看效果 他可以从上传的文件中提取内容作为答案。上传文件摄取速度 摄取速度取决于您正在摄取的文档数量以及每个文档的大小。为了加快摄取速度,您可以在配置中更改摄取模式。 存在以下摄取模式: simple:历史行为,一次按顺序摄…

03 SpringBoot实战 -微头条之首页门户模块(跳转某页面自动展示所有信息+根据hid查询文章全文并用乐观锁修改阅读量)

1.1 自动展示所有信息 需求描述: 进入新闻首页portal/findAllType, 自动返回所有栏目名称和id 接口描述 url地址:portal/findAllTypes 请求方式:get 请求参数:无 响应数据: 成功 {"code":"200","mes…

RubbleDB: CPU-Efficient Replication with NVMe-oF——论文泛读

ATC 2023 Paper 论文阅读笔记整理 问题 由于需要执行昂贵的后台压缩操作,CPU 往往是持久键值存储的性能瓶颈。在日志结构合并树(LSM树),标准的基于磁盘的键值存储设计[2,4,8,22,41],压缩可以在生产工作负载中消耗高达…

基于FPGA的OFDM基带发射机的设计与实现

文章目录 前言一、OFDM描述二、本系统的实现参照 1.IEEE 802.11a协议主要参数2.不同调制方式与速率 3. IFFT映射关系4. IEEE 802.11a物理层规范5. PPDU帧格式三、设计与实现 1.扰码2.卷积编码与删余3.数据交织4.符号调制5.导频插入6.IFFT变换 7.循环前缀&加窗8.训练序列生成…

快速上手的AI工具-文心一言绘本创作

前言 大家好晚上好,现在AI技术的发展,它已经渗透到我们生活的各个层面。对于普通人来说,理解并有效利用AI技术不仅能增强个人竞争力,还能在日常生活中带来便利。无论是提高工作效率,还是优化日常任务,AI工具…

RKE快速搭建离线k8s集群并用rancher管理界面

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 本文记录使用RKE快速搭建一套k8s集群过程,使用的rancher老版本2.5.7(当前最新版为2.7)。适用…

Xftp连接不上Linux虚拟机的原因解决方法

前言: 在当今数字化时代,远程连接到Linux虚拟机是许多开发者和系统管理员日常工作的一部分。然而,有时候,面对Xftp连接不上Linux虚拟机的问题,我们可能感到困惑和无措。这个看似小问题可能导致工作中断,因…

NQA网络质量分析

概念 网络质量分析是设备上集成网络测试功能,不仅可以实现对网络运行情况的准确测试,还可以输出统计信息,有效的节约成本。 NQA可以检测网络上运行的各种协议的性能,使运营商能够实时采集到各种网络运行指标。 例如:…

动态设置和获取类实例变量(setattr、getattr)

动态设置和获取类实例变量 写在前面的话setattr 示例代码getattr 示例代码: 写在前面的话 在pyqt5的界面设置中,有很多相同的Qlabel、Qpushbutton、Qslider的设置,这些具有相同属性的界面模块可能需要不同的触发方法,定义为self.…

JavaScript中的DOM导航

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 在我们的日常生活中,JavaScript已经成为了一种无处不在的…

HCIA——26E-mall、MIME、POP3、IMAP、电子邮件系统的组成结构、电子邮件的发送,接收过程、MIME 与SMTP 的关系

学习目标: 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

SpringBoot+Vue充电桩管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1. 分页获取预约数据代码2.保存预约信息代码3.修改订单状态代码 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBootVue框架开发的充电桩管理系统。首先&…

Centos使用Docker搭建自己的Gitlab社区版16.8.0-ce.0(设置汉化 修改密码 设置SSH秘钥 添加拉取命令端口号 备份至网盘和恢复)

根据我的经验 部署Gitlab(社区版) 至少需要2核4g的服务器 带宽3~4M 1. 在自己电脑上安装终端:宝塔ssl终端 或者 FinalShell,根据喜好安装即可 http://www.hostbuf.com/t/988.html http://www.hostbuf.com/downloads/finalshell_w…

Pytorch中Dataset和dadaloader的理解

不同的数据集在形式上千差万别,为了能够统一用于模型的训练,Pytorch框架下定义了一个dataset类和一个dataloader类。 dataset用于获取数据集中的样本,dataloader 用于抽取部分样本用于训练。比如说一个用于分割任务的图像数据集的结构如图1所…

蓝桥杯---三羊献瑞

观察下面的加法算式: 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。 请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。 答案 代码 public class _03三羊献瑞 {public static void main(String[] args) {//c 生 b 瑞 g 献 d 辉…

Flink多流转换(1)—— 分流合流

目录 分流 代码示例 使用侧输出流 合流 联合(Union) 连接(Connect) 简单划分的话,多流转换可以分为“分流”和“合流”两大类 目前分流的操作一般是通过侧输出流(side output)来实现&…

【后端技术】术有千法,道本归一

目录 1.概述 2.机器的问题 2.1.计算 2.2.存储 2.3.传输 3.人的问题 3.1.代码工程的管理 3.2.过程的把控 4.总结 1.概述 术有千法,道本归一。 之所以这样说,是因为当前出现的纷繁复杂的后端技术,其本质其实都是为了解决同一套问题。…

蓝桥杯题目解析 --矩形切割

先看题: 题目中的例子解析: 5*3 切一刀最大的,肯定是3*3,切完后只剩2*3,切一刀最大的,肯定是2*2,切完后只剩2*1,切一刀最大的,肯定是1*1,切完后只剩1*1&…

浅谈手机APP测试(流程)

前言 APP测试是一个广泛的概念,根据每个app的应用场景不一样,测试的方向也略微的不同,在测试过程中需要灵活应用自身所知的测试手段。 今天就跟大家简单聊聊手机APP测试的一些相关内容。 APP开发流程 (1) 拿到需求分…