Spring基于xml半注解开发

目录

@Component的使用

依赖注解的使用

非自定义Bean的注解开发


@Component的使用

基本Bean注解,主要是使用注解的方式替代原有的xml的<bean>标签及其标签属性的配置,使用@Component注解替代<bean>标签中的id以及class属性,而对于是否延迟加载或是Bean的作用域,则是其他注解

xml配置

注解

描述

<bean scope="">

@Scope

在类上或使用了@Bean标注的方法上,标注Bean的作用范围,取值为singleton或prototype

<bean lazy-init="">

@Lazy

在类上或使用了@Bean标注的方法上,标注Bean是否延迟加载,取值为true或false

<bean init-method="">

@PostConstruct

在方法上使用,标注Bean的实例化后执行的方法

<bean destroy-method="">

@PreDestroy

在方法上使用,标注Bean的销毁前执行方法

下面就是基于注解的测试案例

首先需要开启自动扫描注解功能,这个功能还是需要在XML文件配置的

<?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="com.zmt"/>
</beans>
@Component("userService")
@Lazy(true)//开启懒加载
@Scope("singleton")//单例模式
public class UserServiceImpl implements UserService {
    public UserServiceImpl() {
        System.out.println("UserService被构造");
    }

    @PostConstruct
    private void init(){
        System.out.println("执行init方法");
    }

    @PreDestroy
    private void destroy(){
        System.out.println("执行销毁方法");
    }
}

测试代码 

public class Test {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        Object bean = context.getBean("userService");
        System.out.println(bean);
        context.close();
    }
}

执行结果如下

UserService被构造
执行init方法
com.zmt.service.impl.UserServiceImpl@45afc369
执行销毁方法

为了方便区分不同的业务层,@Component注解又衍生了三个注解

  • @Service:Component的派生注解,多添加在Service的实现类上
  • @Controller:Component的派生注解,多添加在Controller类上
  • @Repository:Component的派生注解,多添加在Dao实现类上

依赖注解的使用

Bean的依赖注入的注解,主要是替代xml中的<property>标签中的注入操作

<bean id="" class="">
  <property name="" ref=""/>
  <property name="" value=""/>
</bean>

Spring提供的注解如下,用于Bean内部进行属性注入的

属性注入注解

描述

@Value

使用在字段或方法上,用于注入普通数据

@Autowired

使用在字段或方法上,用于根据类型(byType)注入引用数据

@Qualifier

使用在字段或方法上,结合@Autowired使用,根据名称注入

@Resource

使用在字段或方法上,根据类型或名称进行注入

这些注解的工作原理实际上是通过暴力反射然后赋值,因此不需要set方法,但是添加了set方法在set方法上添加注解也可以使用。

下面是简单的使用案例

@Value该注解可以对普通数据类型进行赋值,一种是直接指定需要注入的值,一种是通过占位符读取需要注入的值信息

<?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="com.zmt"/>
    <!--将test.txt文件加载到Spring中,供赋值使用-->
    <context:property-placeholder location="classpath:test.txt"/>
</beans>

@Component("userService")
public class UserServiceImpl implements UserService {
//    @Value("zhangsan")
    @Value("${name}")
    private String name;

    @Override
    public void show() {
        System.out.println(name);
    }
}

以上两种都可以将值赋值给name变量,但前者使用的意义不大,因此通常我们使用后者去读取配置文件中的值。


@Autowired的使用默认是根据类型注入,但如果相同类型存在多个,则根据名称进行注入,但是如果不存在属性变量名的Bean对象,那么注入失败

@Component("userService")
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Autowired
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
	//以上两种写一个即可
    
    @Override
    public void show() {
    }
}

@Qualifier需要搭配@Autowired注解使用,特定指定在多个相同类型的Bean对象时,注入哪个名称的bean对象

@Component("userService")
public class UserServiceImpl implements UserService {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao2;
    
    @Override
    public void show() {
    }
}

这里即使属性变量名为userDao2但是实际上注入的还是名为userDao的bean对象。


@Resource既可以类型注入也可以名称注入,如果指定名称,那么只能根据名称注入

@Component("userService")
public class UserServiceImpl implements UserService {
    @Resource(name = "userDao")
    private UserDao userDao2;//实际上注入的是名称为userDao的bean对象

    @Override
    public void show() {
    }
}

@Autowired的扩展使用,实际上该注解不仅仅可以添加在set方法上,可以添加在任何方法上,下面是一个测试案例

@Component("userService")
public class UserServiceImpl implements UserService {

    @Override
    public void show() {
    }

    @Autowired
    public void xxx(UserDao userDao){
        System.out.println("xxx:"+userDao);
    }

    @Autowired
    public void yyy(List<UserDao> userDaoList){
        System.out.println("yyy:"+userDaoList);
    }
}

运行结果如下

非自定义Bean的注解开发

对于非自定义的Bean我们需要使用工厂来进行加载,需要使用@Bean注解,如果需要参数,对于基本类型需要@Value注解,对于引用类型,只要Spring中存在,可以直接根据类型注入。

@Component
public class OtherBean {

    @Bean
    public DataSource dataSource(@Value("${name}") String name){
        DataSource dataSource = new DataSource();
        System.out.println(name);
        return dataSource;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

node.js express mongoose用户建模、权限校验

目录 userModel.js 依赖引入 数据建模 中间件 模型方法 创建user model并导出 catchAsync.js authController.js 依赖引入 token生成 注册 登录 密码修改 userRoutes.js 路由设计 protect中间件 角色中间件 app.js userModel.js 依赖引入 const mongoose …

解决canvas清晰度问题devicePixelRatio

视频教程 解决canvas清晰度的问题【渡一教育】_哔哩哔哩_bilibili 检测网页本身是否缩放 ,即缩放倍率 window.devicePixelRatio 为了获得清晰图像,需要遵循以下公式 原始尺寸样式尺寸*缩放倍率 在项目中,canvas里的原始尺寸一般与css中的样式尺寸一样,所以在写js代码时,涉…

纯电超跑SUV获得2024中国年度性能车大奖 路特斯ELETRE实力几何?

2023年12月5日&#xff0c;“中国年度车”颁奖盛典在北京圆满落幕。路特斯首款纯电超跑SUV ELETRE ( 参数询价 ) 斩获“2024中国年度性能车”大奖&#xff0c;成为首次获此殊荣的纯电SUV车型。一台纯电SUV能获得年度性能车奖项&#xff0c;注定是件非常有看点的事&#xff0c;那…

17.(vue3.x+vite)组件间通信方式之作用域插槽

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 作用域插槽 父组件中的插槽内容是无法访问到子组件中的数据的,而作用域插槽就是解决获取子组件数据。 父组件代码 <template><div><div>父组件--Hello World!</div><Child>

【普中开发板】基于51单片机电子钟闹钟设计( proteus仿真+程序+设计报告+讲解视频)

【普中开发板】基于51单片机电子钟闹钟数码管显示设计( proteus仿真程序设计报告讲解视频&#xff09; Proteus 仿真&#xff1a;Proteus 8.16 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;P03 51单片机电子钟闹钟 1. 主要功能&a…

RT-Thread Studio + STM32CubeMx 联合开发

RT-Thread Studio STM32CubeMx 联合开发 背景参考 背景 使用RTThreadNano开发工具&#xff1a; RTThread Studio&#xff1a;官方工具&#xff0c;对RTThread系统兼容最好&#xff0c;可以对不同的MCU平台进行开发&#xff0c;包括但不限于以下平台 STM32GD32IAR STM32CubeI…

mac 安装nvm以及切换node版本详细步骤

1、nvm介绍&#xff08;node版本管理工具&#xff09; nvm 可以让你通过命令行快速安装和使用不同版本的node 有时候项目太老&#xff0c;node版本太高,执行npm install命令会报错,可以借助nvm切换低版本的node。 2、安装nvm 在终端执行安装命令 curl -o- https://raw.gith…

Vue router深入学习

Vue router深入学习 一、单页应用程序介绍 1.概念 单页应用程序&#xff1a;SPA【Single Page Application】是指所有的功能都在一个html页面上实现 2.具体示例 单页应用网站&#xff1a; 网易云音乐 https://music.163.com/ 多页应用网站&#xff1a;京东 https://jd.co…

销售技巧培训之如何提升化妆品销售技巧

销售技巧培训之如何提升化妆品销售技巧 一、引言 在当今竞争激烈的化妆品市场&#xff0c;销售人员需要掌握一定的技巧才能吸引顾客&#xff0c;提高销售业绩。本文将通过实际案例&#xff0c;探讨化妆品销售的有效技巧&#xff0c;帮助销售人员提升业绩。 二、案例分析 案…

jstree组件的使用详细教程,部分案例( PHP / fastAdmin )

jstree 组件的使用。 简介&#xff1a;JsTree是一个jquery的插件&#xff0c;它提交一个非常友好并且强大的交互性的树&#xff0c;并且是完全免费或开源的&#xff08;MIT 许可&#xff09;。Jstree技持Html 或 json格式的的数据&#xff0c; 或者是ajax方式的动态请求加载数…

宁夏康源肛肠医院发声 有劳肠道了

肠道先生&#xff1a; 你好&#xff0c;我是宁夏康源肛肠医院&#xff0c;今日书信一封&#xff0c;旨在请先生出山&#xff0c;救万民健康于水火。当前&#xff0c;支原体肺炎肆虐&#xff0c;且尚无疫苗可预&#xff0c;值此危急之际&#xff0c;正是肠道先生免疫力发挥功力…

高速吹风筒方案中光耦的作用和原理--【其利天下技术】

我们都知道高速风筒方案中&#xff0c;采用了光耦作为隔离元器件&#xff0c;那么光耦是个什么特性的元件呢&#xff1f;它用来隔离什么东西呢&#xff1f;它又是如何做到隔离作用的呢&#xff1f;带着这样的疑问&#xff0c;我们对光耦做一番研究吧。 其利天下技术--光耦 &am…

AutoAnimate动画库,仅需一行代码

插件官网,支持react,vue AutoAnimate - Add motion to your apps with a single line of code 自动加动画原理 AutoAnimate 加动画的原理也很简单&#xff0c;监听绑定的 DOM 节点里 DOM 结构变化&#xff0c;自动添加对应的过渡动画&#xff1a; 增加子节点 > 渐入动画…

芳村金融茶最新进展——00后老板被带走调查

芳村 芳村茶叶的发展史可以追溯到1858年&#xff0c;当时芳村花地的翠林花园一角&#xff0c;已经有茶叶商行和制茶作坊。然而&#xff0c;芳村真正以花闻名&#xff0c;可以说是“先有花后有茶”&#xff0c;是花带动了茶的发展。在20世纪70年代左右&#xff0c;芳村和山村主要…

【论文阅读】Answering Label-Constraint Reachability in Large Graphs

Xu K, Zou L, Yu J X, et al. Answering label-constraint reachability in large graphs[C]//Proceedings of the 20th ACM international conference on Information and knowledge management. 2011: 1595-1600. Abstract 在本文中&#xff0c;我们研究了可达性查询的一种变…

光伏储能数据难题很棘手?架构升级很迷茫?来看三大真实案例

近年来&#xff0c;随着光伏储能装置的增加&#xff0c;设备数量和测点数量也在相应增加&#xff0c;数据采集频率也在不断提高&#xff0c;由此产生的时序数据量越来越庞大&#xff0c;对数据处理和实时分析的要求也越来越高。同时光伏储能系统需要长期保存大量的历史数据&…

IDEA小技巧

目录 1. IDEA自动添加注释 创建类的时候自动添加注释 创建函数、方法的注释 1. IDEA自动添加注释 参考文档&#xff1a;idea java 自动添加文件注释 idea新建类自动注释_mob6454cc73c728的技术博客_51CTO博客 【操作工具】IDEA创建类及已有类添加注释-详细操作_idea设置创建…

Python Selenium3 自动化测试实战:构建高效测试项目

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在当今软件开发领域&#xff0c;自动化测试成为…

硅片制作工艺-详细图文版

首先将多晶硅和掺杂剂放入单晶炉内的石英坩埚中&#xff0c;将温度升高至1000多度&#xff0c;得到熔融状态的多晶硅。 硅锭生长是一个将多晶硅制成单晶硅的工序&#xff0c;将多晶硅加热成液体后&#xff0c;精密控制热环境&#xff0c;成长为高品质的单晶。 相关概念&#xf…