注解开发bean

news2024/11/24 2:33:33

注解开发定义bean

使用@component定义bean

@Component("bookDao")
public class BookDaoImpl implements BookDao{}

核心配置文件中通过组件扫描加载bean

<context:component-scan base-package="com.tsj"/>

Spring提供@Component注解的三个衍生注解,他的作用完全相同,仅仅是为了让开发者更加易读。

@Crontoller:用于表现层bean定义。

@Service:用于业务层bean定义。

@Repository:用于数据层bean定义。

 纯注解开发 

我们可以创建一个类来代替配置文件,第一个@Configuration代替了大段的文本,ComponentScan代替扫描。

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

//该注解将此类声明为注解类,代表了配置文件中超大端的文字
@Configuration
@ComponentScan("com.tsj")
public class SpringConfig {
}

注意:@Configuration用于设定当前类为配置类,@ComponentScan注解用于设定扫描,此注解只能添加一次,多个数据请用数组方式。

//数组
@Configuration
@ComponentScan({"com.tsj","com.tsj.dao","com.tsj"})
public class SpringConfig {
}

特别的,加载配置类初始化容器和原来加载配置文件初始化容器是不同的。

注意new 的是不一样的内容。

public class APPForConfiguration {
    public static void main(String[] args) {
        //创建Ioc容器
        ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao=ctx.getBean("bookDao",BookDao.class);
        //调用了子类中重写的方法,且向上转换只能调用子类重写的方法
        bookDao.save();
    }
}

控制bean对象是否单列

注意:singleton单列,prototype非单列。

@Component("bookDao")
@Scope("singleton")
public class BookDaoImpl implements BookDao{}

控制bean的生命周期方法

回顾:在xml配置中控制bean的方法:1、创建方法,配置xml。2、实现接口

注解开发中,我们手动的书写两个方法init和destrory并分别给他们加上注解。

@PostConstruct在构造方法之后

@PreDestory在销毁之前

    @PostConstruct
    public void init(){
        System.out.println("init...");
    }

    @PreDestroy
    public void destory(){
        System.out.println("destory...");
    }

注意:想要使用此注解需要在pom.xml文件内倒入坐标

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

使用注解开发进行依赖注入

@Autowired自动注入,使用暴力反射为变量进行赋值。此处的反射是根据类型进行反射,所以一个DI注入中只能存在一个类型。

@Service
public class UserDaoImpl implements UserDao{
    @Autowired
    private BookDao bookDao;
}

当不同的bean实现了同一个接口时,我们不能够继续通过类型扫描的方式来获取bean。这时需要我们进行类名进行获取。

@Service
public class UserDaoImpl implements UserDao{
    @Autowired
    @Qualifier("bookDao")
    private BookDao bookDao;
}

注意:

1、自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法。

2、自动装配建议使用无参构造方法创建对象(默认),如果不提供对应的构造方法,请提供唯一的构造方法。

3、使用Qualifer注解无法单独使用,必须配合@Autowired注解使用。

给基础数据类型及String注入

@Value("woxiangchiDurian")
private String name;

使用Vaule注解进行数据初始化的原因是,我们时常需要使用配置文件进行数据处理,那么注解开发中怎么导入配置文件呢。

步骤一:我们需要在SpringConfig类中增加配置文件注解,声明配置文件的路径。

@Configuration
@ComponentScan({"com.tsj","com.tsj.dao","com.tsj"})
@PropertySource("jdbc3.properties")
public class SpringConfig {
}

如果有多个配置文件,我们可以通过数组的方式进行声明。

@Configuration
@ComponentScan({"com.tsj","com.tsj.dao","com.tsj"})
@PropertySource({"jdbc3.properties","jdbc3.properties","jdbc3.properties"})
public class SpringConfig {
}

不可以使用*.properties进行声明。 

 步骤二:在bean类中进行赋值

@Value("${name}")
private String name;

注解开发管理第三方bean

由于我们不可以直接把注解写在第三方的代码中,所以我们必须手动编程的去书写代码。

1、创建一个方法获取想要管理的对象
2、添加@Bean表示当前返回值类型是一个bean 

public class SpringConfig {

    //1、创建一个方法获取想要管理的对象
    //2、添加@Bean表示当前返回值类型是一个bean 
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds=new DruidDataSource();
        ds.setDriverClassName("root");
        ds.setPassword("root");
        ds.setPassword("root");
         return ds;
    }
}

注意:Config是Spring的配置类,通常情况下我们会单独创建一个其他的配置类来书写有关第三方bean的代码。

方法一:使用Import注解在SpringConfig类中将加载待导入配置类的字节码文件。此注解只允许写一次,想要导入多个配置类需要使用数组的方式。

JdbcConfig类

@Configuration
public class JbdcConfig {

    //1、创建一个方法获取想要管理的对象
    //2、添加@Bean表示当前返回值类型是一个bean
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds=new DruidDataSource();
        ds.setDriverClassName("root");
        ds.setPassword("root");
        ds.setPassword("root");
        return ds;
    }
}

 SpringConfig类

@Import({JbdcConfig.class,JbdcConfig.class,JbdcConfig.class})
public class SpringConfig {

}

方法二:使用包扫描的方式(不推荐,因为无法清晰的表明各个配置类的关系)

@ComponentScan({"com.tsj","com.tsj.dao","com.tsj"})
@Import({JbdcConfig.class,JbdcConfig.class,JbdcConfig.class})
public class SpringConfig {

}

为第三方bean注入资源

如果是基础类型以及String。

创建变量,使用Value注解对其复制,再通过set方法为第三方bean初始化资源。

    @Value("ceshi")
    private String driver;
    @Value("ceshi")
    private String password;
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds=new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setPassword(password);
        return ds;
    }

如果是引用数据类型

 自动装配,只要我们有一个形参,并且Spring检测到这是一个bean,它认为需要给我们自动提供一个对象,通过SpringConfig中的Scan扫描到了相对应的bean,会帮我们自动注入对象。

只要我们提供形参,Spring会自动为我们装配对象。 

    @Bean
    public DataSource dataSource(BookDao bookDao){
        System.out.println(bookDao);
        DruidDataSource ds=new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setPassword(password);
        return ds;
    }

XML开发与注解开发对比 

 

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

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

相关文章

科研人必看 | 学术期刊论文作者署名新规

【SciencePub学术干货】在期刊上发表学术论文&#xff0c;是研究人员发布和传播学术研究成果的重要方式之一。学术期刊论文文献各项著录内容中&#xff0c;作者署名是最主要的组成部分之一。 随着经济的发展和社会的进步&#xff0c;人们面临的科学问题和社会问题日趋复杂&…

KaiwuDB 受邀亮相 IOTE 2023 第十九届国际物联网展

5月17日&#xff0c;IOTE 2023 第十九届国际物联网展在上海拉开序幕&#xff0c;全球超过 350 家参展企业到场展示先进的物联网技术和产品&#xff0c;行业专家、领军企业代表等人物齐聚一堂&#xff0c;共话 IoT 未来趋势。KaiwuDB 受邀亮相参展并就《工业物联网产业数字化转型…

基于SpringBoot+vue的网上图书商城系统设计和实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

通用方案px2rem 处理 内联样式、element-ui表头折行、label折行、表单项换行异常

通用方案-处理element-ui 表单项label折行、换行异常&#xff0c;表头折行问题 背景简介&#xff1a;在实际的生产环境中&#xff0c;客户用到的屏幕大大小小分辨率各有异同&#xff0c;但是为了布局的统一和美观&#xff0c;我们采用了postcss-px2rem插件对element-ui进行响应…

仓库拣货标签——仓库16代

6432 全彩 LED 点阵显示屏 ​ 一、产品特性 采用2048 RGB LED全彩显示&#xff0c;亮度可调 无线通信 它可以显示文本、图片或动画 支持24V外置电源 支持系统对接&#xff0c;模板可DIY 二、PTL系统电子标签概述 电子标签拣选系统是利用先进的电子技术和通信技术开发的物…

选择合适的采购系统,实现企业数字化转型

随着数字化技术的飞速发展&#xff0c;企业数字化转型已经成为了当今市场的必然趋势。而采购系统作为企业数字化转型的重要组成部分&#xff0c;选择合适的采购系统对于企业来说至关重要。本文将围绕选择合适的采购系统&#xff0c;实现企业数字化转型展开讨论。 一、企业数字化…

数字门户的创新引擎:小程序容器

小程序容器技术的发展为数字门户带来了许多机会和优势。通过引入第三方生态&#xff0c;数字门户可以快速丰富自身的功能和服务&#xff0c;提高用户留存率&#xff0c;并打造一个开放的生态系统。这种创新的技术手段让数字门户能够更灵活地满足用户多样化的需求&#xff0c;提…

强化学习复现笔记(2)策略迭代

摘要&#xff1a; 上一节的压缩映射在实际迭代时可以分成两种方法&#xff0c;分别称作值迭代和策略迭代。本文用走迷宫的例子&#xff08;将1维迷宫扩展到2维&#xff09;讲这两种迭代。对应第一节参考链接[2]的前4章。 拆分压缩映射 上一节的压缩映射 v f ( v ) vf(v) vf(…

打造科学新高地|2023开放原子全球开源峰会科学智能分论坛圆满举行

6 月 11 日&#xff0c;以“AI 框架助力科学智能&#xff0c;打造科学新高地”为主题的 2023 开放原子全球开源峰会科学智能分论坛在北京圆满举行。北京航空航天大学计算机学院党委书记、教授李建欣参加并致辞&#xff1b;华为昇思 MindSpore 架构师倪宁曦、研究员徐旭升&#…

const用于C++引用(注意事项)

const用于C引用 存在的问题解决方法原理 存在的问题 左值是可以被引用的数据对象&#xff0c;可以通过地址访问它们&#xff0c;例如&#xff1a;变量、数组元素、结构体成员、引用和解引用的指针。 非左值包括字面常量&#xff08;用双引号包含的字符串除外&#xff09;和包含…

公司普通启动VR/AR软件开发虚拟场景游戏

随着元宇宙技术的不断革新&#xff0c;VR作为一种新兴技术&#xff0c;正在迅速普及。VR软件开发技术将用户沉浸到虚拟世界中&#xff0c;让人们可以身临其境地体验一些事物&#xff0c;如元宇宙游戏、商圈、展会、旅游等。而VR虚拟场景的开发&#xff0c;则是实现这一目标的重…

WRF进阶:使用ERA5-land数据驱动WRF/WRF撰写Vtable文件添加气象场

想用WRF模拟地气交换过程&#xff0c;对于WRF的地表数据&#xff0c;尤其是土壤温湿度数据要求便会很大&#xff0c;传统使用ERA5-singledata数据精度也许不足以满足需求&#xff0c;为此&#xff0c;本文尝试使用ERA5-land数据替换驱动WRF。 数据下载 ERA5-land的数据下载与…

2023 届 Java 岗高频面试题盘点,老司机也未必全会

2023&#xff0c;可谓是招聘面试最难季。不少大厂&#xff0c;如腾讯、字节的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;如果不用心准备&#xff0c;很可能就被面试官怼得哑口无言。今天不谈其它&#xff0c;就说说我作为面试官面试的那些事儿。 从某电商项…

【笔试强训选择题】Day25.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…

不愧是阿里大牛珍藏的“redis深度笔记(全彩版)”这细节讲解,神了

前言 说到 Redis 相信对于我们这些程序员来说太熟悉了&#xff0c;Redis 凭借着自己超高的超高的性能、完美的文档、简洁易懂的源码和丰富的客户端库支持&#xff0c;很快就在国内的互联网市场占据了一席之地&#xff0c;得到了广大用户的一致好评&#xff0c;随着国内外使用 …

反射---getattr,hasattr,setattr,delattr加插播enumerate

什么是反射&#xff1f; 用字符串数据类型的变量名来访问这个变量的值 反射的方法&#xff1a;getattr&#xff0c;hasattr&#xff0c;setattr&#xff0c;delattr 类&#xff1a;(通过类名反射类名空间里面的内容的) 类&#xff1a;静态属性&#xff0c;类方法&#xff0c;静…

Vue中如何进行代码高亮与语法着色?

Vue中如何进行代码高亮与语法着色&#xff1f; 在Vue的开发过程中&#xff0c;我们经常需要展示代码片段或者进行代码高亮与语法着色。Vue提供了多种方式来实现代码高亮与语法着色&#xff0c;本文将为你详细介绍这些方法。 1. 使用prism.js进行代码高亮与语法着色 prism.js是…

mybatis的一级缓存和二级缓存

目录 1、简介 2、Mybatis缓存 3、一级缓存 3.1、初体验测试 3.2、一级缓存失效的四种情况 4、二级缓存 4.1、使用步骤 4.2、结论 5、缓存原理 1、简介 什么是缓存 [ Cache ]&#xff1f; 存在内存中的临时数据。将用户经常查询的数据放在缓存&#xff08;内存&…

gomod在项目中的作用

Part1gomod在golang项目中的作用 1介绍 gomod是Go语言中一个非常重要的工具&#xff0c;它在Golang项目的开发过程中扮演着关键的角色。gomod是模块依赖管理工具&#xff0c;可以帮助开发者更好地管理和组织项目的依赖关系&#xff0c;提供了便捷的方式来管理和升级依赖项。 2为…

gtk实现spice剪切板

重要的函数&#xff1a; void spice_main_channel_clipboard_selection_grab(SpiceMainChannel *channel, guint selection, guint32 *types, int ntypes); 抓取剪切板 void spice_main_channel_clipboard_selection_release(SpiceMainChannel *channel, guint selection); 剪…