JavaEE 几种spring注解

news2024/11/24 9:02:06

        使用注解可以更简单的存储Bean对象和读取Bean对象。

存储Bean对象

在使用注解之前,需要做一些前置工作:

<?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:content="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">
    <content:component-scan base-package="(包名)">
    </content:component-scan> 

</beans>

        包名可以类似于com.XXX.        

注解有两类:类注解和方法注解。

        类注解:@Controller(控制器注解)、@Service(服务注解)、@Repository(仓库注解)、@Component(组件注解)、@Configuration(配置注解)。

        方法注解:@Bean

类注解

@Controller(控制器注解)

        如图,在naion包下建立一个controller包,用来存放controller注解的类,类中写了一个UserController。

类注解需要将注解写在类上。结果如下:

@Controller
public class UserController {

    public void sayHi() {
        System.out.println("Hi~");
    }
}

然后在com的包下建立一个启动类,命名为StartUp。

        启动类中仍然是老规矩,获取spring上下文,从spring上下文获取Bean对象,使用Bean。要注意xml文件是否正确。

public class StartUp {

    public static void main(String[] args) {
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        UserController userController = applicationContext.getBean("userController", UserController.class);
        userController.sayHi();
    }
}

要注意的一点就是getBean中,类名第一个字母应该小写,而不是大写,否则报错。

@Service(服务存储)

使用方法和@Controller类似。你可以新创建一个类添加注解,也可以将@Controller注解改为@Service。

@Service
public class UserService {

    public void sayHi() {
        System.out.println("Hi~");
    }
}
public class StartUp {

    public static void main(String[] args) {
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        UserService userService = applicationContext.getBean("userService", UserService.class);
        userService.sayHi();
    }
}

        其他的三个类注解用法上相似,这里不在累述。五大类注解功能相似,为什么不用一个,而是要分开,主要的原因就是让人们看到类注解之后,直观了解当前类是干嘛的。比如@Controller表示也业务逻辑层、@Service表示服务层、@Repository表示持久层、@Configuration表示配置层。

        前面说,sprin存储类时,类名第一个字母要小写。如果是这样的情况,就不一样了。

@Repository
public class URepository {

    public void sayHi() {
        System.out.println("Hi, URepository!");
    }
}
public class StartUp {

    public static void main(String[] args) {
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //类名第一个字母和第二个字母都大写
        URepository uRepository = applicationContext.getBean("uRepository", URepository.class);
        uRepository.sayHi();
    }
}

报错了,这是特殊的情况。我们查看源代码就可以发现问题:

        288行表示,如果第一个字符是大写,且第二个字符也是大写,直接返回该name;否则第一个字符小写后返回。所以,改成下面的代码就不会报错了。

@Bean方法注解

         @Bean注解需要搭配类注解来使用。@Bean注解,将注解写在方法上。@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean,所以,我们需要先写一个对象出来

public class User {

    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

然后使用@Bean来返回该对象给spring。

@Component
public class UserBeans {

    @Bean
    public User user() {
        User user = new User();
        user.setName("a");
        user.setAge(1);
        user.setId(1);
        return user;
    }
}
public class StartUp {

    public static void main(String[] args) {
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        User user = applicationContext.getBean("user", User.class);
        System.out.println(user);
    }
}

获取Bean对象 

        获取bean对象,把对象取出来放到某个类中。也叫对象装配、对象注入。对象装配有三种方式:属性注入、setter注入、构造方法注入。

        注解有@Autowired和@Resource。

属性注入

现在,我想获取UserService。可以直接在启动类中使用@Autowired注解获取到该对象。

@Service
public class UserService {

    public void sayHi() {
        System.out.println("Hi~");
    }
}
public class StartUp {

    @Autowired
    public UserService userService;

    public UserService result() {
        return userService;
    }

    public static void main(String[] args) {
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        StartUp startUp = new StartUp();
        startUp.result();
    }
}

         属性注入的优点:简洁,使用很方便。缺点:只能使用在IoC容器上;不能被final修饰;更容易违背单一设计原则。

Setter注入

使用set和get方法。

public class StartUp {

    public UserService userService;

    public UserService getUserService() {
        return userService;
    }

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public static void main(String[] args) {
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        StartUp startUp = new StartUp();
        startUp.setUserService(startUp.userService);
    }
}

        setter注入的优点:符合单一设计原则。缺点:不能被final修饰;注入的对象可以被修改。

构造方法注入

public class StartUp {

    public static UserService userService;

    @Autowired
    public StartUp(UserService userService) {
        this.userService = userService;
    }

    public static void main(String[] args) {
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        StartUp startUp = new StartUp(userService);
    }
}

        构造方法注入优点:可以注入被final修饰的对象;注入的对象不会像setter注入那样被修改;可以完全被初始化;通用性更好,不仅仅使用在IoC容器上。

@Resource

@Resource不能使用在构造方法上。

@Autowired和@Resource之间的一些区别:

(1)出身不同,前者来自spring,后者来自jdk;

(2)@Resource支持更多的参数;

(3)@Resource不支持构造方法注入。

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

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

相关文章

01- mysql基础

MySQL基础 今日目标&#xff1a; 完成MySQL的安装及登陆基本操作能通过SQL对数据库进行CRUD能通过SQL对表进行CRUD能通过SQL对数据进行CRUD 1&#xff0c;数据库相关概念 以前我们做系统&#xff0c;数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会…

Dendro Azide-PEG-Dendro Azide,Dendro N3-PEG-Dendro N3,PEG超支化树状叠氮

1、名称 英文&#xff1a;Dendro Azide-PEG-Dendro Azide&#xff0c;Dendro N3-PEG-Dendro N3 中文&#xff1a;聚乙二醇-超支化树状叠氮 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Azide PEG 4、分子量&#xff1a;可定制&#xff0c;Dendro Azide-PEG 20K-Den…

【暴力更换OPPO启动器为其它三方(Nova Launcher in my Case Scenario)】

狠搞更换OPPO启动器为三方&#xff08;Nova&#xff09; 我咋就不知道狮子座也有这么强烈的强迫症呢&#xff1f;&#xff01; 我每次玩儿新手机必须得搞搞应用图标呀壁纸呀啥的&#xff0c;必须得打上你“磊哥”的风格烙印。但是国内的启动器的通病就是用不了三方的app图标包…

针对小程序的漏洞挖掘

0x00 前言 我们对小程序的漏洞挖掘&#xff0c;关注点还是在逻辑漏洞上面&#xff0c;下面将从环境搭建到实例一步步讲解。&#xff08;此篇文章更适合做安服的老哥们看&#xff09; 0x01 环境配置 工具&#xff1a;BurpFiddlerwindows版本微信 注: 你也可以直接用burpwindo…

面试笔试题之Linux部分58题(第一部分)

1、Linux常用的发行版 debian、Fedora、Ubuntu、redhat、centOS 等补充&#xff1a; Fedora&#xff1a;软件新&#xff0c;不稳定 redhat&#xff1a;稳定、收费 centOS&#xff1a;稳定、免费 2、在Linux里面查看指定时间段的日志文件 sed -n‘/起始时间/,/结束时间/p’ 日…

一篇文章入门知识图谱

文章目录知识图谱一、为什么需要知识图谱&#xff1f;什么是知识图谱&#xff1f;——KG的前世今生1、看到的不仅仅是字符串2、知识图谱的前世今生二、语义网络&#xff0c;语义网&#xff0c;链接数据和知识图谱1、语义网络&#xff08;Semantic Network&#xff09;2、语义网…

Python编程 元组中不允许的操作

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.元组知识点 1.元组中不允许的操作(熟悉) 2.元组与列表之间的转换(掌握…

echarts5.0引入地图,背景渐变色,航线图,地图阴影

效果图如下&#xff0c;文章末尾附全部代码&#xff1a; 参考&#xff1a; 1、航线图 Vue Echarts飞机航线图_Kinghiee的博客-CSDN博客 2、地图阴影 echarts中国地图实现阴影效果&自定义设置_K.P的博客-CSDN博客 版本&#xff1a; "echarts": "^5.1.2&q…

面向OLAP的列式存储DBMS-9-[ClickHouse]的常用日期时间操作

ClickHouse 日期时间的相关操作函数 1 日期时间操作函数 1.1 toDate和toDateTime toDate、toDateTime&#xff1a;将字符串转成 Date、DateTime 一、传入字符串 SELECT toDate(2020-11-11 12:12:12) v1, toDateTime(2020-11-11 12:12:12) v2; /* ┌─────────v1─…

内聚力模型

背景介绍 材料中不可避免的具有各种缺陷&#xff0c;引起工程中结构断裂的发生。针对裂纹扩展相关问题&#xff0c;研究学者基于线弹性断裂力学&#xff0c;通过理论或数值手段得到裂纹尖端的应力强度因子KI、KII 和 KIII 以及应变能释放率GI、GII 和 GIII&#xff0c;对裂纹的…

C++入门(1)

一、关键字 C语言中只有32个关键字&#xff0c;C有63个关键字&#xff0c;将近翻了一倍。 二、命名空间 在编写代码的时候&#xff0c;会遇到定义的变量名和库中的函数名重复&#xff0c;出现命名冲突的情况。在C中有变量名、函数名还有类名&#xff0c;这些都会存在全局域…

两种方式实现websocket获取数据库查询进度

两种方式实现websocket获取数据库查询进度 本文实现了两种方式用websocket连接实现前端通过API获取数据库查询进度&#xff0c;作为websocket初步学习的参考 内容目录概要&#xff1a; 使用额外接口获取指定数据库查询进度&#xff0c;查询进度的接口与获取数据的接口分开实…

SAP S4 FI后台详细配置教程- PART3 (财务凭证相关配置篇)

本篇主要介绍凭证相关的配置&#xff0c;希望对学习SAP财务的同学有帮助。 1、定义凭证类型 概念功能说明&#xff1a; • 凭证类型是区分不同交易类型的方法并决定能够被过帐的会计形式。 例如&#xff0c; 可将所有的会计凭证按业务类分成&#xff1a; 总帐凭证、收款…

基础选择器

一、任务目标 掌握基础选择器的应用 二、任务背景 CSS&#xff08;层叠样式表&#xff09;选择器是CSS规则的一部分&#xff0c;用来指定需要设置样式的HTML元素。通过选择器可以实现CSS对HTML元素的一对一、一对多、多对一的控制。 三、任务内容 选择器类型 描述 示例 通配选…

概率论基础

一、条件概率的三大公式 条件概率中的条件就代表观测变量&#xff0c;观测变量意思就是这个变量的取值是否已经定下来了 1.乘法公式 2.全概率公式 随机现象&#xff1a;在一定的条件下&#xff0c;并不总出现相同结果的现象称为随机现象。随机现象的各种结果会表现出一定的…

分类效果评价(机器学习)

目录 准确率 精确率(precision) 召回率(recall&#xff0c;也称为查全率) 调回平均 对于一般分类问题&#xff0c;有训练误差、泛化误差、准确率、错误率等指标 对于常见的二分类问题&#xff0c;样本只有两种分类结果&#xff0c;将其定义为正例与反例。 那么在进行分类…

基于java大学生就业信息管理系统

随着高校教育体制的改革大学生人数的不断增加&#xff0c;毕业生就业制度发生了根本的变化。单位和学生走向人才市场&#xff0c;双向选择&#xff0c;择优录用。因此在这样的情况下&#xff0c;在INTERNET上开发并运行信息管理系统就能够极大地提高工作效率&#xff0c;弥补了…

VMware 网络模式

VMware提供了三种网络工作模式&#xff0c;它们分别是&#xff1a; Bridged&#xff08;桥接模式&#xff09; NAT&#xff08;网络地址转换模式&#xff09; Host-Only&#xff08;仅主机模式&#xff09; 1、桥连接模式 【NAT 设置】【DHCP 设置】不可编辑 2、仅主机模式 【自…

MySQL并发事务会引起的问题

MySQL事务并发的问题主要分为以上三种 脏读: 比如 事务A 对用户表进行了 一次查询 和一次修改 他将用户1的 部门 从 部门1 改为了 部门2 但事务A 并没有提交 然后事务B 只做了一步查询 查用户表 此时 如果出现脏读 则 事务B查到的 用户1 的所属部门是 部门2 而 这是 事务A其实…

Python画小仓鼠

肉嘟嘟的小动物很是可爱&#xff0c;本文介绍运用Python中的turtle库控制函数绘制小仓鼠。    文章目录一、效果展示二、代码详解1 导入库2 播放音乐3 定义画小仓鼠头的函数4 定义画左眼和右眼的函数5 定义画嘴的函数一、效果展示 在介绍代码之前&#xff0c;先来看下本文的实…