Spring——Spring基于注解的IOC配置

news2025/1/18 16:50:28

基于注解的IOC配置

学习基于注解的IOC配置,大家脑海里首先得有一个认知,即注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样。

1.创建工程

在这里插入图片描述

1.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wt</groupId>
    <artifactId>Spring_IOC_Annotation</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- Spring常用依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.8.RELEASE</version>
        </dependency>
    </dependencies>
</project>

1.2 dao

/**
 * 持久层实现类
 */
public class UserDaoImpl implements UserDao {

    @Override
    public void addUser(){
        System.out.println("insert into tb_user......");
    }
}

1.3 service

/**
 * 业务层实现类
 */
public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void addUser(){
        userDao.addUser();
    }
}

2 IOC

2.1 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      			http://www.springframework.org/schema/beans/spring-beans.xsd
				http://www.springframework.org/schema/context
      			http://www.springframework.org/schema/context/spring-context.xsd ">

    <!-- 告知spring框架,在读取配置文件,创建容器时扫描包,依据注解创建对象,并存入容器中 -->
    <context:component-scan base-package="com.wt"></context:component-scan>
</beans>

2.2 dao

@Repository
public class UserDaoImpl implements UserDao {
	... ...
}

2.3 service

@Service
public class UserServiceImpl implements UserService {
	... ...
}

3 DI

3.1 service

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    public void addUser() {
        userDao.addUser();
    }
}

3.2 测试

/**
 * 模拟表现层
 */
public class Client {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = ac.getBean("userServiceImpl",UserService.class);
        userService.addUser();
    }
}

3 常用注解

3.1 用于创建对象的

以下四个注解的作用及属性都是一模一样的,都是针对一个的衍生注解只不过是提供了更加明确的语义化。

3.1.1 @Controller
  • 作用:

    把资源交给spring来管理,相当于:<bean id="" class="">;一般用于表现层。

  • 属性:

    value:指定bean的id;如果不指定value属性,默认bean的id是当前类的类名,首字母小写;

3.1.2 @Service
  • 作用:

    把资源交给spring来管理,相当于:<bean id="" class="">;一般用于业务层。

  • 属性:

    value:指定bean的id;如果不指定value属性,默认bean的id是当前类的类名,首字母小写;

  • 案例

    //@Service("userService")声明bean,且id="userServiceImpl"
    @Service//声明bean,且id="userServiceImpl"
    public class UserServiceImpl implements UserService {
     	...   
    }
    
3.1.3 @Repository
  • 作用:

    把资源交给spring来管理,相当于:<bean id="" class="">;一般用于持久层。

  • 属性:

    value:指定bean的id;如果不指定value属性,默认bean的id是当前类的类名,首字母小写;

  • 案例

    //@Repository("userDaoImpl")声明bean,且id="userDaoImpl"
    @Repository//声明bean,且id="userDaoImpl"
    public class UserDaoImpl implements UserDao {
    
        @Override
        public void addUser(){
            System.out.println("insert into tb_user......");
        }
    }
    
3.1.4 @Component
  • 作用:

    把资源交给spring来管理,相当于:<bean id="" class="">;通用(三层架构之外的内容)。

  • 属性:

    value:指定bean的id;如果不指定value属性,默认bean的id是当前类的类名,首字母小写;

3.1.5 @Scope
  • 作用:

    指定bean的作用域范围。

  • 属性:

    value:指定范围的值,singleton prototype request session。

3.2 用于属性注入的

以下四个注解的作用相当于:<property name="" ref="">

3.2.1 @Autowired
  • 作用:

    自动按照类型注入。set方法可以省略。

  • 案例:

    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired //注入类型为UserDAO的bean
        private UserDao userDao;
    
        public void addUser(){
            userDao.addUser();
        }
    }
    
3.2.2 @Resource
  • 作用:

    自动按照名字注入。set方法可以省略。

  • 属性:

​ name:指定bean的id。

  • 案例:

    @Service
    public class UserServiceImpl implements UserService {
    
        @Resource(name="userDaoImpl")//注入id=“userDaoImpl”的bean
        private UserDao userDao;
    
        public void addUser(){
            userDao.addUser();
        }
    }
    
3.2.3 @Value
  • 作用:

    注入基本数据类型和String类型数据的

  • 属性:

​ value:用于指定值

  • 案例一

    @Service
    public class UserServiceImpl implements UserService {
    
        @Resource(name="userDaoImpl") //注入id=“userDaoImpl”的bean
        private UserDao userDao;
        @Value("张三")//注入String
        private String name;
        @Value("18")//注入Integer
        private Integer age;
    
        public void addUser(){
            System.out.println(name+","+age);
            userDao.addUser();
        }
    }
    
  • 案例二

    1. 创建config.properties

      name=张三
      age=18
      
    2. 加载配置文件

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:context="http://www.springframework.org/schema/context"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
            		http://www.springframework.org/schema/beans/spring-beans.xsd
      			http://www.springframework.org/schema/context
            		http://www.springframework.org/schema/context/spring-context.xsd ">
          <!--加载config.properties-->
          <context:property-placeholder location="config.properties"/>
          <context:component-scan base-package="com.wt"></context:component-scan>
      </beans>
      
    3. 注入属性值

      @Service
      public class UserServiceImpl implements UserService {
      
          @Autowired
          private UserDao userDao;
          @Value("${name}")//注入String
          private String name;
          @Value("${age}")//注入Integer
          private Integer age;
      
          public void addUser() {
              System.out.println(name+","+age);
              userDao.addUser();
          }
      }
      

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

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

相关文章

卷积神经网络|导入图片

在学习卷积神经网络时&#xff0c;我们通常使用的就是公开的数据集&#xff0c;这里&#xff0c;我们不使用公开数据集&#xff0c;直接导入自己的图片数据&#xff0c;下面&#xff0c;就简单写个程序实现批量图片的导入。 import osfrom PIL import Imageimport numpy as np…

UI5与后端的文件交互(四)

文章目录 前言一、后端开发1. 新建管理模板表格2. 新建Function&#xff0c;动态创建文档 二、修改UI5项目1.Table里添加下载证明列2. 实现onClickDown事件 三、测试四、附 前言 这系列文章详细记录在Fiori应用中如何在前端和后端之间使用文件进行交互。 这篇的主要内容有&…

KNN 分类(选择最佳的 K 值,并可视化模型精度与 n_neighbors 的关系)

import matplotlib.pyplot as plt from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier# 导入乳腺癌数据集 cancer load_breast_cancer()# 划分训练集和测试集 X_tra…

CodeWave智能开发平台--03--目标:应用创建--02数据模型设计

摘要 本文是网易数帆CodeWave智能开发平台系列的第05篇&#xff0c;主要介绍了基于CodeWave平台文档的新手入门进行学习&#xff0c;实现一个完整的应用&#xff0c;本文主要完成数据模型设计 CodeWave智能开发平台的05次接触 CodeWave参考资源 网易数帆CodeWave开发者社区…

原版俄罗斯方块通关为啥这么难?

俄罗斯方块这款游戏相信很多人都玩过&#xff0c;其难易程度我们也见识过&#xff0c;近日看到一则新闻《美国13岁少年通关原版俄罗斯方块&#xff0c;此前只有AI做到过》&#xff0c;感叹世界之大&#xff0c;牛人太多。这款游戏诞生于上世纪八十年代&#xff0c;由苏联程序员…

嵌入式-stm32-基于HAL库的感应开关盖垃圾桶项目(开源)

网盘资料&#xff1a; 《嵌入式-stm32-基于HAL库的感应开关盖垃圾桶项目&#xff08;开源&#xff09;》 链接&#xff1a;https://pan.baidu.com/s/1kFk09nMKPDvLwIUqMT9q3w 提取码&#xff1a;og66 –来自百度网盘超级会员V6的分享 目录 一&#xff1a;项目概述 二&#xf…

PPT自带录屏大揭秘,一键提升演示文稿效果

在现代演示文稿制作中&#xff0c;屏幕录制是一种非常实用的功能&#xff0c;尤其是对于ppt演示而言。ppt提供了自带的屏幕录制功能&#xff0c;使用户能够直接在ppt中录制屏幕操作。本文将详细介绍ppt自带录屏的使用方法&#xff0c;帮助你在制作ppt演示时轻松实现屏幕录制。 …

速卖通商品详情 API(aliexpress.item_get):限制和要求

速卖通商品详情 API&#xff08;aliexpress.item_get&#xff09;的限制和要求主要包括以下几个方面&#xff1a; API调用频率限制&#xff1a;速卖通平台对商品详情 API 的调用频率有一定的限制&#xff0c;例如&#xff0c;每个账号每天最多可以调用多少次 API。如果超过了这…

Java TBA访问NetSuite Restlet时的403错误

本周有同学问为啥Java访问NetSuite Restlet时&#xff0c;按照知识会之前的文章分享&#xff0c;会一直报403 INVALID_LOGIN_ATTEMPT错误。 https://nk-community.blog.csdn.net/article/details/131399801https://nk-community.blog.csdn.net/article/details/131399801原因是…

云原生战专题 | 深入浅出分析云原生微服务的技术结构和架构设计

深入浅出分析云原生微服务的技术结构和架构设计 云原生容器技术背景容器编排Kubernetes控制平面的四大组件Kubernetes在容器编排中的设计要点 云原生微服务典型架构第一代微服务架构第二代微服务架构第三代微服务架构第四代微服务架构 未来的云原生架构 — Serverless 云原生容…

mysql 添加用户并分配select权限

1.root用户先登录或者在可执行界面 1.1 选择mysql 点击mysql 或者在命令行 use mysql 1.2创建用户 CREATE USER username% IDENTIFIED BY password; 备注1&#xff1a;%替换为可访问数据库的ip&#xff0c;例如“127.0.0.1”“192.168.1.1”&#xff0c;使用“%”表示不限制…

2.HDFS 架构

目录 概述架构HDFS副本HDFS数据写入流程NN 工作原理DN 工作原理 结束 概述 官方文档快递 环境&#xff1a;hadoop 版本 3.3.6 相关文章速递 架构 HDFS HDFS 架构总结如下&#xff1a; a master/slave architecture 一主多从架构a file is split into one or more blocks a…

【python高级用法】进程

一个简单的进程 # -*- coding: utf-8 -*-import multiprocessingdef foo(i):print (called function in process: %s %i)returnif __name__ __main__:Process_jobs []for i in range(5):p multiprocessing.Process(targetfoo, args(i,))Process_jobs.append(p)p.start()p.j…

展望2024: 中国AI算力能否引爆高性能计算和大模型训练的新革命?

★算力&#xff1b;算法&#xff1b;人工智能&#xff1b;高性能计算&#xff1b;高性能&#xff1b;高互联&#xff1b;生成式人工智能&#xff1b;StableDiffusion&#xff1b;ChatGPT&#xff1b;CoPilot&#xff1b;文本创建&#xff1b;图像生成&#xff1b;代码编写&…

Transformer从菜鸟到新手(三)

引言 这是Transformer的第三篇文章&#xff0c;上篇文章中我们了解了多头注意力和位置编码&#xff0c;本文我们继续了解Transformer中剩下的其他组件。 层归一化 层归一化想要解决一个问题&#xff0c;这个问题在Batch Normalization的论文中有详细的描述&#xff0c;即深层…

Windows找不到文件‘chrome‘,请确定文件名是否正确后,再试一次。

本文主要记录遇到vscode运行HTML文件提示&#xff1a; Windows找不到文件‘chrome‘&#xff0c;请确定文件名是否正确后&#xff0c;再试一次。问题的解决办法。 目录 一、打开设置 二 、搜索Live Server Config &#xff08;1&#xff09;安装Live Server插件 &#xff0…

弧垂观测手段再升级!输电线路导线弧垂检测装置的应用_深圳鼎信

输电线路导线弧垂是指在输电线路中导线的水平位置与塔杆之间的垂直距离。导线的弧垂是确定导线张力、塔杆高度等参数的重要依据。通过测量弧垂及时调整弧垂大小对保证输电线路的安全运行具有重要作用。鼎信将介绍两种测量弧垂的方法&#xff0c;一起来学习一下吧&#xff01; …

TikTok明星经济:短视频背后的网络名人

在当今数字时代&#xff0c;社交媒体平台的崛起为许多人带来了独特的机遇&#xff0c;其中TikTok作为一款短视频应用&#xff0c;正成为网络名人崛起的孵化器。随着TikTok用户量的不断增加&#xff0c;平台上涌现出越来越多的明星&#xff0c;这些明星不仅仅在虚拟世界中受到欢…

微信小程序分销商城制作源码系统:全部搭建好直接使用 带完整的安装代码包以及搭建教程

随着移动设备的普及和互联网技术的发展&#xff0c;电子商务逐渐成为人们购物的主要方式之一。而微信作为中国最大的社交平台之一&#xff0c;拥有庞大的用户基数和成熟的生态系统。因此&#xff0c;基于微信小程序开发分销商城具有巨大的市场潜力和商业价值。 以下是部分代码…

超级详细的 https 中间人攻击流程。

客户端发送 https 请求中间人截获 https 请求&#xff0c;然后在转发给服务端 中间人可以是抓包工具中间人可以通过伪造证书的方式截获请求服务端接收到请求【看起来是客户端发的&#xff0c;实际上已经经过中间人转发了】服务端以为是一个安全的请求&#xff0c;向客户端发送数…